如何在elasticsearch中搜索句子的开头和结尾

问题描述 投票:0回答:2

我试图搜索以下两个案例

情况1:

我想搜索以特定单词开头的名称。例如:

名称:测试名称

名称:名称测试

名称:测试名称测试

如果我搜索“test”那么它应该只返回“test name”和“test name test”。

案例2:

我想搜索以特定单词结尾的名称。例如:

名称:测试名称

名称:名称测试

名称:测试名称测试

如果我搜索“测试”,那么它应该只返回“名称测试”和“测试名称测试”。

任何人都可以帮我找出elasticsearch java API中的查询或任何其他搜索方式。

弹性搜索版本6.2.1

任何帮助都非常感谢。

java elasticsearch elasticsearch-query
2个回答
0
投票

你需要使用search_analyzer属性的映射(analyzer_startswith或analyzer_endswith)

"mappings": {
    "some_index": {
        "properties": {
            "title": {
                "search_analyzer": "analyzer_startswith",
                "index_analyzer": "analyzer_startswith",
                "type": "string"
            }
        }
    }
}

就像是


0
投票

对于案例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());
  }
© www.soinside.com 2019 - 2024. All rights reserved.