我试图搜索以下两种情况
我想搜索以特定单词开头的名称。例如:
名称:测试名称
名称:名称测试
名称:测试名称测试
如果我搜索“test”那么它应该只返回“test name”和“test name test”。
我想搜索以特定单词结尾的名称。例如:
名称:测试名称
名称:名称测试
名称:测试名称测试
如果我搜索“test”那么它应该只返回“名称测试”和“测试名称测试”
任何人都可以帮我查找elasticsearch java API中的查询或以其他任何方式搜索它。
弹性搜索版本6.2.1
非常感谢任何帮助。
答案 0 :(得分:0)
您需要使用search_analyzer
属性的映射(analyzer_startswith或analyzer_endswith)
"mappings": {
"some_index": {
"properties": {
"title": {
"search_analyzer": "analyzer_startswith",
"index_analyzer": "analyzer_startswith",
"type": "string"
}
}
}
}
类似
答案 1 :(得分:0)
对于案例1,您可以使用CompletionSuggester
。您需要一个字段的特殊映射才能使用完成建议器,如下所示:
"mappings": {
"some_index": {
"properties": {
"title": {
"type": "completion"
}
}
}}
在代码中,您应该像这样定义建议者(term
是您的搜索词,"开始"是任意名称):
CompletionSuggestionBuilder completionBuilder = SuggestBuilders.completionSuggestion("title").prefix(term);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("starts", completionBuilder);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.suggest(suggestBuilder);
SearchRequest searchRequest = new SearchRequest("index_name");
searchRequest.source(searchSourceBuilder);
获得搜索响应后,处理它以检索建议:
Suggest suggest = searchResponse.getSuggest();
if (suggest == null) {
return Collections.emptyList();
} else {
CompletionSuggestion suggestion = suggest.getSuggestion("starts");
return suggestion
.getOptions()
.stream()
.map(CompletionSuggestion.Entry.Option::getText)
.map(Text::toString)
.collect(Collectors.toList());
}