Как искать начало и конец предложения в asticsearch

Я пытался найти следующие два случая

Случай 1:

Я хочу найти имя, которое начинается с определенного слова. Например:

имя: тестовое имя

имя: имя тест

имя: имя теста

если я ищу "тест", то он должен вернуть мне только "имя теста" и "тест имени теста".

случай 2:

Я хочу найти имя, которое заканчивается определенным словом. Например:

имя: тестовое имя

имя: имя тест

имя: имя теста

если я ищу "тест", то он должен вернуть мне только "имя теста" и "тест имени теста".

Может ли кто-нибудь помочь мне найти запросы в Java API-интерфейс asticsearch или любым другим способом для его поиска.

Эластичный поиск версии 6.2.1

Любая помощь очень ценится.

2 ответа

Для случая 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());
  }

Вам нужно использовать отображение с search_analyzer свойство (analyzer_startswith или analyzer_endswith)

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

что-то вроде

Другие вопросы по тегам