如何使用 spring 数据 elasticSearch 搜索单词的一部分
How to search for a part of a word with 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);
它适用于单个单词查询,但如果是两个或更多单词,它 returns 错误:
"Cannot constructQuery '*"security windows"'. Use expression or multiple clauses instead."
在这种情况下如何正确实施?
我有同样的需求,我已经实现了。 Querystring 适合您。
如果你有两个像 "security windows" 这样的标记,那么你必须传递 "*security* *windows*"
而 Querystring 将 return 所有可能的数据可用。如果你有一个像 "security" 这样的标记,那么你必须传递 "*security*"
.
这个场景的更多解释,检查这个答案 -
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;
在我的 Spring Data Elasticsearch
应用程序中,我想在用户键入几个字符时实现自动完成功能,应用程序将向他显示所有可能的变体 query*
。
现在我找不到如何使用 Spring Data Elasticsearch 正确实施它的方法。
例如,我尝试了以下操作:
Criteria c = new Criteria("name").startsWith(query);
return elasticsearchTemplate.queryForPage(new CriteriaQuery(c, pageRequest), ESDecision.class);
它适用于单个单词查询,但如果是两个或更多单词,它 returns 错误:
"Cannot constructQuery '*"security windows"'. Use expression or multiple clauses instead."
在这种情况下如何正确实施?
我有同样的需求,我已经实现了。 Querystring 适合您。
如果你有两个像 "security windows" 这样的标记,那么你必须传递 "*security* *windows*"
而 Querystring 将 return 所有可能的数据可用。如果你有一个像 "security" 这样的标记,那么你必须传递 "*security*"
.
这个场景的更多解释,检查这个答案 -
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;