我正在尝试发出包含排序的查询
来自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
。我将不胜感激任何评论。
答案 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} }