Elasticsearch: тип данных search_as_you_type и токенизатор edge_ngram - PullRequest
0 голосов
/ 19 июня 2020

В чем разница между новым типом данных search_as_you_type в Elasticsearch и типом токенизатора edge_ngram ? Какой из них предпочесть при создании поисковой системы типа "поиск по типу"?

тип токенизатора edge_ngram : https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html (Посмотрите на пример того, как настроить поле для поиска по мере ввода.)

ОБНОВЛЕНИЕ

Версия Elasticsearch: 7.6.1

Я проиндексировал свои данные с типом данных search_as_you_type в соответствии с последним Документация Elasticsearch и попытка создать простой запрос через Java API на основе приведенного ниже примера:

GET my_index/_search
{
  "query": {
    "multi_match": {
      "query": "brown f",
      "type": "bool_prefix",
      "fields": [
        "my_field",
        "my_field._2gram",
        "my_field._3gram"
      ]
    }
  }
}

Точка, с которой я борюсь, это добавление "type": "bool_prefix".

A) I попробовал с MultiMatchQueryBuilder

MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type(MatchQuery.Type.BOOLEAN_PREFIX);

и получил исключение во второй строке приведенного выше кода:

org.elasticsearch.ElasticsearchParseException: failed to parse [multi_match] query type [boolean_prefix]. unknown type.

B) Затем я попытался с MatchBoolPrefixQueryBuilder

MatchBoolPrefixQueryBuilder matchBoolPrefixQueryBuilder=new MatchBoolPrefixQueryBuilder(value, fields);

получено исключение

org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=parsing_exception, reason=[match_bool_prefix] unknown token [START_ARRAY] after [query]]
...
Suppressed: org.elasticsearch.client.ResponseException: method [POST], host [http://localhost:9200], URI [/my_dictionary/_search?pre_filter_shard_size=128&typed_keys=true&max_concurrent_shard_requests=5&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&ignore_throttled=true&search_type=query_then_fetch&batched_reduce_size=512&ccs_minimize_roundtrips=true], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"parsing_exception","reason":"[match_bool_prefix] unknown token [START_ARRAY] after [query]","line":1,"col":57}],"type":"parsing_exception","reason":"[match_bool_prefix] unknown token [START_ARRAY] after [query]","line":1,"col":57},"status":400}

в строке

SearchResponse searchResponse=restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

Что я делаю не так? Какой из них я должен использовать и как?

РЕШЕНИЕ

Я решил проблему, просто изменив тип на:

MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type("bool_prefix");

Но я не 'Не понимаю, почему тип должен быть жестко задан как "bool_prefix" вместо использования MatchQuery.Type.BOOLEAN_PREFIX или почему невозможно использовать MatchBoolPrefixQueryBuilder, примеров реализации этого запроса не так много.

1 Ответ

1 голос
/ 19 июня 2020

Это разные вещи.

edge_ngram - это токенизатор, что означает, что он срабатывает во время индексации для токенизации ваших входных данных. Также есть фильтр токенов edge_ngram. Оба похожи, но работают на разных уровнях. См. эту ветку , чтобы узнать об основных различиях.

search_as_you_type - это тип поля, который содержит несколько подполей, одно из которых называется _index_prefix и использует edge_ngram tokenizer.

По сути, то, что вы видите в документации по edge_ngram tokenizer, было фактически использовано, когда они решили добавить новый тип поля search_as_you_type.

UPDATE

Вам действительно нужно использовать

MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type(MultiMatchQueryBuilder.Type.BOOL_PREFIX);

Вы можете увидеть здесь , как создается это значение перечисления

...