带有 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