В чем разница между новым типом данных 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
, примеров реализации этого запроса не так много.