【问题标题】:How to search starting and ending of a sentence in elasticsearch如何在elasticsearch中搜索句子的开头和结尾
【发布时间】:2018-02-28 19:57:03
【问题描述】:
我试图搜索以下两种情况
案例一:
我想搜索以特定单词开头的名称。例如:
名称:测试名称
名称:名称测试
name : 测试名称 test
如果我搜索“test”,那么它应该只返回“test name”和“test name test”。
案例2:
我想搜索以特定单词结尾的名称。例如:
名称:测试名称
名称:名称测试
name : 测试名称 test
如果我搜索“test”,那么它应该只返回“name test”和“test name test”
.
谁能帮我找出 elasticsearch java API 中的查询或任何其他搜索方式。
弹性搜索 6.2.1 版
非常感谢任何帮助。
【问题讨论】:
-
我曾经问过一个类似的问题,我们的 Elastic 好朋友 @AndreiStefan 庄严地回答了这个问题。你可以找到它here
标签:
java
elasticsearch
elasticsearch-query
【解决方案1】:
您需要使用带有search_analyzer 属性(analyzer_startswith 或analyzer_endswith)的映射
"mappings": {
"some_index": {
"properties": {
"title": {
"search_analyzer": "analyzer_startswith",
"index_analyzer": "analyzer_startswith",
"type": "string"
}
}
}
}
类似
【解决方案2】:
对于案例 1,您可以使用CompletionSuggester。您需要一个特殊的字段映射才能使用完成建议,如下所示:
"mappings": {
"some_index": {
"properties": {
"title": {
"type": "completion"
}
}
}}
在代码中,您应该像这样定义建议者(term 是您的搜索词,“starts”是任意名称):
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());
}