如何在elasticsearch

时间:2018-02-22 07:06:54

标签: java elasticsearch elasticsearch-query

我试图搜索以下两种情况

案例1:

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

名称:测试名称

名称:名称测试

名称:测试名称测试

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

案例2:

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

名称:测试名称

名称:名称测试

名称:测试名称测试

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

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

弹性搜索版本6.2.1

非常感谢任何帮助。

2 个答案:

答案 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());
  }