Springboot +休眠搜索:没有搜索结果

问题描述 投票:0回答:1

我希望能够为我的一个实体的字段提供一堆。因此,我将休眠搜索添加到了我的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();
}
spring-boot hibernate-search
1个回答
0
投票

通过调用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

© www.soinside.com 2019 - 2024. All rights reserved.