使用Hibernate Search

时间:2017-07-24 13:15:46

标签: sorting elasticsearch hibernate-search

我正在尝试发出包含排序的查询 来自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

但是这个例子并不完整。我不知道:

  • 导入使用(有多个匹配),
  • 未声明变量的类型有哪些,例如s
  • 如何初始化变量luceneQuery

我将不胜感激任何评论。

1 个答案:

答案 0 :(得分:1)

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

  

请注意,仅支持“查询”属性。

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

  

要使用的导入(有多个匹配),

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

  

未声明的变量有哪些类型,例如s

s是通过FullTextSession检索到的org.hibernate.search.Search.getFullTextSession(Session)。它也适用于通过FullTextEntityManager检索到的org.hibernate.search.jpa.Search.getFullTextEntityManager(EntityManager)

  

如何初始化变量luceneQuery

您必须使用查询构建器(qb):

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

如果你打算使用Hibernate Search API,但你还不熟悉它,我建议先阅读一般文档(不仅仅是Elasticsearch部分,它只提到了Elasticsearch的细节):{{3} }