"filtered query does not support sort" 使用休眠搜索时

"filtered query does not support sort" when using Hibernate Search

我正在尝试发出一个包含排序的查询 来自休眠搜索 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 问题与我的 curl 查询不同 - 指定类型的实现方式不同:

{
    "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

但是示例还不够完整。我不知道:

如有任何评论,我将不胜感激。

是的,如org.hibernate.search.elasticsearch.ElasticsearchQueries.fromJson(String)的javadoc中所述:

Note that only the 'query' attribute is supported.

因此您必须使用 Hibernate Search API 来执行排序。


which imports to use (there are multiple matching),

Sort 来自 Lucene (org.apache.lucene),List 来自 java.util,所有其他导入应该来自 Hibernate Search (org.hibernate.search)。

what are the types of the undeclared variables, like s

s 是通过 org.hibernate.search.Search.getFullTextSession(Session) 检索到的 FullTextSession。它还将与通过 org.hibernate.search.jpa.Search.getFullTextEntityManager(EntityManager).

检索到的 FullTextEntityManager 一起使用

how to initalise the variable luceneQuery

您必须使用查询生成器 (qb):

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

如果您打算使用 Hibernate Search API,但您还不习惯,我建议您先阅读一般文档(不仅仅是 Elasticsearch 部分,它只提到了 Elasticsearch 的细节): https://docs.jboss.org/hibernate/search/5.7/reference/en-US/html_single/#search-query