如何使用spring数据elasticSearch搜索单词的一部分 [英] How to search for a part of a word with spring data elasticSearch

查看:158
本文介绍了如何使用spring数据elasticSearch搜索单词的一部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 Spring Data Elasticsearch 应用程序中,当用户键入一些字符并且应用程序将使用 query * 向他显示所有可能的变体时,我想实现自动完成功能./p>

现在,我找不到一种如何使用Spring Data Elasticsearch正确实现它的方法.

例如,我尝试了以下操作:

 条件c =新条件("name").startsWith(query);返回elasticsearchTemplate.queryForPage(new CriteriaQuery(c,pageRequest),ESDecision.class); 

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

"

 "无法构造查询'*安全窗口"'.请使用表达式或多个子句. 

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

解决方案

我有相同的要求,我实现了相同的要求.查询字符串将为您服务.如果您有两个令牌(例如安全窗口"),则必须传递"* security * * windows *" ,而 Querystring 将返回所有可能的数据.如果您有一个像安全"这样的令牌,则必须传递"* security *" .

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

  String aQueryString =安全窗口";字符串aQueryWithPartialSerach = null;列出< ESDecision>.aESDecisions = null;//启用部分存储如果(aQueryString.contains(")){List< String>aTokenList = Arrays.asList(aQueryString.split(")));aQueryWithPartialSerach = String.join(",aTokenList.stream().map(p->"*" + p +"*").collect(Collectors.toList()));} 别的 {aQueryWithPartialSerach ="*" + aQueryString +"*";}NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder();aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type).withPageable(new PageRequest(0,iPageRequestCount));最终的BoolQueryBuilder aQuery = new BoolQueryBuilder();aQuery.must(QueryBuilders.queryStringQuery(aQueryWithPartialSerach).defaultField("name")));NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build();aESDecisions = elasticsearchTemplate.queryForList(nativeSearchQuery,ESDecision.class);返回aESD决策; 

需要完成导入:-

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

In my Spring Data Elasticsearch application I'd like to implement autocomplete functionality when user types a few chars and application will show him all possible variants with query*.

Right now I can't find a way how to properly implement it with Spring Data Elasticsearch.

For example I tried the following:

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

It works for a single word query but in case of two or more words it returns error:

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

How to properly implement it in this case?

解决方案

I have same requirement , I have implemented same . Querystring will work for you . If you have two token like "security windows" than you have to pass "*security* *windows*" than Querystring will return all possible data available . If you have one token like "security" than you have to pass "*security*" .

One more explaination for this scenario ,check this answer - 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;

Imports need to be done :-

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;

这篇关于如何使用spring数据elasticSearch搜索单词的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆