如何使用spring data elasticSearch搜索单词的一部分

时间:2017-04-23 11:31:38

标签: spring elasticsearch spring-data-elasticsearch

在我的Spring Data Elasticsearch应用程序中,我想在用户输入几个字符时实现自动填充功能,应用程序会向query*显示所有可能的变体。

目前我无法找到如何使用Spring Data Elasticsearch正确实现它的方法。

例如,我尝试了以下内容:

Criteria c = new Criteria("name").startsWith(query);
return elasticsearchTemplate.queryForPage(new CriteriaQuery(c, pageRequest), ESDecision.class);

它适用于单个单词查询,但如果有两个或更多单词,则会返回错误:

"Cannot constructQuery '*"security windows"'. Use expression or multiple clauses instead."

在这种情况下如何正确实施?

1 个答案:

答案 0 :(得分:1)

我有同样的要求,我已经实现了相同的要求。 查询字符串将适合您。 如果您有两个令牌,例如“安全窗口”,则必须通过"*security* *windows*"而不是 Querystring 将返回所有可用的可用数据。如果你有一个像“安全”这样的令牌而不是你必须通过"*security*"

对于这种情况的另一个解释,请检查这个答案 - https://stackoverflow.com/a/43278852/2357869

String aQueryString = "security windows" ;
String aQueryWithPartialSerach = null;
List<ESDecision> aESDecisions = null;


 // Enabling partial sarch
        if (aQueryString.contains(" ")) {
            List<String> aTokenList = Arrays.asList(aQueryString.split(" "));
            aQueryWithPartialSerach = String.join(" ", aTokenList.stream().map(p -> "*" + p + "*").collect(Collectors.toList()));
        } else {
            aQueryWithPartialSerach = "*" + aQueryString + "*";
        }
NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type).withPageable(new PageRequest(0, iPageRequestCount));
        final BoolQueryBuilder aQuery = new BoolQueryBuilder();

            aQuery.must(QueryBuilders.queryStringQuery(aQueryWithPartialSerach).defaultField("name"));

  NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build();
        aESDecisions = elasticsearchTemplate.queryForList(nativeSearchQuery, ESDecision.class);
        return aESDecisions;

需要进口: -

import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.domain.PageRequest;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;