带有 ElasticSearch 的 Springboot + Hibernate:没有结果
Springboot + Hibernate with ElasticSearch : Getting no results
我想为我的一个实体启用一堆字段的搜索。因此,我将休眠搜索添加到我的 spring 引导项目中。当我将数据加载到数据库中时,我可以看到 Elasticsearch 在索引 运行ning
中包含了预期的数据
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"
在直接查询中 return 会得到与之前相同的结果。
这是我正在尝试的方法,但无论我做什么,我都得到 0 个结果:
public List<MyEntity> 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
.[= 的文档18=]
删除那个转义符,一切都会如你所愿。
顺便说一句,您实质上是在使用 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
我想为我的一个实体启用一堆字段的搜索。因此,我将休眠搜索添加到我的 spring 引导项目中。当我将数据加载到数据库中时,我可以看到 Elasticsearch 在索引 运行ning
中包含了预期的数据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"
在直接查询中 return 会得到与之前相同的结果。
这是我正在尝试的方法,但无论我做什么,我都得到 0 个结果:
public List<MyEntity> 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
.[= 的文档18=]
删除那个转义符,一切都会如你所愿。
顺便说一句,您实质上是在使用 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