2017-07-24 47 views
0

我試圖發出查詢,其中包括從Hibernate搜索5.7.1.Final 排序 ElasticSearch 2.4.2「過濾的查詢不支持排序」當使用休眠搜索

當我使用curl我得到的結果:

curl -XPOST 'localhost:9200/com.example.app.model.review/_search?pretty' -d ' 
{ 
    "query": { "match" : { "authors.name" : "Puczel" } }, 
    "sort": { "title": { "order": "asc" } } 
}' 

但是,當我發出從代碼查詢:

protected static Session session; 

public static void prepareSession() 
{ 
    SessionFactory sessionFactory = new Configuration().configure() 
     .buildSessionFactory(); 
    session = sessionFactory.openSession(); 
} 

... 

protected static void testJSONQueryWithSort() 
{ 
    FullTextSession fullTextSession = Search.getFullTextSession(session); 
    QueryDescriptor query = ElasticsearchQueries.fromJson(
     "{ 'query': { 'match' : { 'authors.name' : 'Puczel' } }, 'sort': { 'title': { 'order': 'asc' } } }"); 
    List<?> result = fullTextSession.createFullTextQuery(query, Review.class).list(); 

    System.out.println("\n\nSearch results for 'author.name:Puczel':"); 
    for(Object object : result) 
    { 
     Review review = (Review) object; 
     System.out.println(review.toString()); 
    } 

} 

我得到一個異常:

"[filtered] query does not support [sort]" 

我知道它來自哪裏,因爲Hibernate Search問題的查詢 與我的不同查詢 - 指定類型是不同的實現:

{ 
    "query": 
    { 
     "filtered": 
     { 
      "query": 
      { 
       "match":{"authors.name":"Puczel"} 
      }, 
      "sort":{"title":{"order":"asc"}}, 
      "filter":{"type":{"value":"com.example.app.model.Review"}} 
     } 
    } 
} 

但我不知道如何去改變它。

我嘗試使用Hibernate文檔中的排序例如: https://docs.jboss.org/hibernate/search/5.7/reference/en-US/html_single/#__a_id_elasticsearch_query_sorting_a_sorting

但這個例子並不完全。我不知道:

  • 其中進口使用(有多個匹配),
  • 哪些類型的未聲明的變量,像s
  • 如何initalise變量luceneQuery

我會很感激這方面的評論。

回答

1

是,如在org.hibernate.search.elasticsearch.ElasticsearchQueries.fromJson(String) javadoc中提到:只有 '查詢' 屬性支持

注意。

所以你必須使用Hibernate Search API來執行排序。


使用哪個進口(有多個匹配),

排序是從Lucene的(org.apache.lucene)之一,List是從java.util,和所有其他的進口應該是從休眠搜索(org.hibernate.search)。

哪些類型的未聲明的變量,,比如s

s是通過org.hibernate.search.Search.getFullTextSession(Session)檢索的​​。它也將與通過org.hibernate.search.jpa.Search.getFullTextEntityManager(EntityManager)檢索到的FullTextEntityManager一起使用。

如何initalise變量luceneQuery

你將不得不使用查詢生成器(qb):

Query luceneQuery = qb.keyword().onField("authors.name").matching("Puczel").createQuery(); 

如果您打算使用Hibernate的搜索API,你對此我不太滿意,我建議先閱讀一般文檔(不只是Elasticsearch部分,它只提及Elasticsearch的具體細節):https://docs.jboss.org/hibernate/search/5.7/reference/en-US/html_single/#search-query

+0

非常感謝(再次!)。我對此有些困惑,我認爲我不能在ElasticSearch中使用'LuceneQuery',但是我仍然試圖去做,所以沒有閱讀整章,我現在所做的就沒有多少意義。我使用你的答案修復了我的代碼,現在我更好地理解了這個問題。謝謝! – nuoritoveri