我希望能够为我的一个实体的字段提供一堆。因此,我将休眠搜索添加到了我的spring boot项目中。当我将数据加载到数据库中时,我可以看到Elasticsearch包含了正在运行的索引中所期望的数据]
curl localhost:9200/myindex/_search?pretty
我可以运行类似的查询
curl localhost:9200/myindex/_search?pretty&q=name:test
并获得预期的结果。
我想让我的API使用者可以选择对索引运行任意查询,例如“ name:test”,这样
curl "localhost:8086/myentity/search/querySearch?query=name:test"
将在直接查询中返回与以前相同的结果。
这是我正在尝试的方法,但是无论我做什么,我都会得到0个结果:
public List<Training> querySearch(String queryString) {
QueryParser queryParser = new MultiFieldQueryParser(ALL_FIELDS, new SimpleAnalyzer());
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
org.apache.lucene.search.Query query = queryParser.parse(QueryParser.escape(queryString));
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
javax.persistence.Query persistenceQuery =
fullTextEntityManager.createFullTextQuery(query, MyEntity.class);
return persistenceQuery.getResultList();
}
通过调用QueryParser.escape(queryString)
,您将删除诸如:
之类的运算符的含义。因此,如果用户输入name:test
,您最终将查找包含name:test
的文档(从字面上看),而不是查找其name
字段包含test
的文档。
删除该转义符,一切都应按需要工作。
顺便说一下,您本质上是在使用Lucene解析查询,然后将其发送到Elasticsearch。一个更简单的解决方案是将查询直接发送到Elasticsearch,尤其是在您不需要阻止用户访问某些字段的情况下。
public List<Training> querySearch(String queryString) {
FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
QueryDescriptor query = ElasticsearchQueries.fromQueryString(queryString);
javax.persistence.Query persistenceQuery = fullTextEm.createFullTextQuery(query, Training.class);
return persistenceQuery.getResultList();
}
请参见https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_queries