2017-07-24 4 views
0

Ich versuche, eine Abfrage zu erteilen, die von Hibernate Search 5.7.1.Final Elasticsearch 2.4.2 umfasst das Sortieren.„gefilterten Abfrage nicht unterstützt sortieren“, wenn Hibernate Search mit

Wenn ich curl bin mit erhalte ich die Ergebnisse:

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

Aber wenn ich die Abfrage von Code ausgeben:

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()); 
    } 

} 

Ich erhalte eine Ausnahme:

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

Ich verstehe, wo es herkommt, weil die Abfrage , die Hibernate Search Probleme unterscheidet, als meineistAbfrage - Angabe des Typs realisiert anders:

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

Aber ich weiß nicht, wie es zu ändern.

Ich versuchte, die Art Beispiel von Hibernate Dokumentation mit: https://docs.jboss.org/hibernate/search/5.7/reference/en-US/html_single/#__a_id_elasticsearch_query_sorting_a_sorting

Aber das Beispiel ist nicht voll. Ich weiß nicht:

  • , die (es gibt mehrere Matching) zu verwenden, importiert,
  • was die Typen der nicht deklarierten Variablen sind, wie s,
  • wie die Variable luceneQuery initalise.

Ich werde alle Anmerkungen zu diesem zu schätzen wissen.

Antwort

1

Ja, wie in der javadoc von org.hibernate.search.elasticsearch.ElasticsearchQueries.fromJson(String) erwähnt:

Beachten Sie, dass nur die 'query' Attribut unterstützt wird.

Sie müssen also die Hibernate Search-API verwenden, um Sortierungen durchzuführen.


die Einfuhren zu verwenden (es gibt mehrere matching),

Sortieren derjenige von Lucene ist (org.apache.lucene), List von java.util ist, und alle anderen Importe aus dem Ruhezustand sein sollten, Suche (org.hibernate.search).

was sind die Arten der nicht deklarierten Variablen, wie s

s ein FullTextSession durch org.hibernate.search.Search.getFullTextSession(Session) abgerufen wird. Es funktioniert auch mit einem FullTextEntityManager abgerufen durch org.hibernate.search.jpa.Search.getFullTextEntityManager(EntityManager).

wie die Variable luceneQuery initalise

Sie werden den Query Builder (qb) verwenden müssen:

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

Wenn Sie die Hibernate Search API verwenden möchten, und Sie Es ist mir noch nicht recht, ich würde empfehlen, zuerst die allgemeine Dokumentation zu lesen (nicht nur den Elasticsearch-Teil, der nur Elasticsearch-spezifische Details erwähnt): https://docs.jboss.org/hibernate/search/5.7/reference/en-US/html_single/#search-query

+0

Vielen Dank (wieder!). Ich war ein bisschen verwirrt darüber, ich dachte, dass ich 'LuceneQuery' nicht mit ElasticSearch verwenden kann, aber dann versuchte ich es trotzdem, also hatte es keinen Sinn, das ganze Kapitel zu lesen, was ich jetzt tat. Ich habe meinen Code mit Ihrer Antwort korrigiert und jetzt verstehe ich das Thema besser. Vielen Dank! – nuoritoveri

Verwandte Themen