#elasticsearch #elasticsearch-5
#elasticsearch #elasticsearch-5
Вопрос:
У меня есть запрос для индекса автозаполнения / предложений, который выглядит следующим образом:
{
"size": 10,
"query": {
"multi_match": {
"query": "'" search_text "'",
"type": "bool_prefix",
"fields": [
"company_name",
"company_name._2gram",
"company_name._3gram"
]
}
}
}
Этот запрос работает именно так, как я хочу. Однако я хочу добавить нечеткость: «АВТО» к этому запросу. Я прочитал документацию и попытался добавить ее следующим образом:
{
"size": 10,
"query": {
"multi_match": {
"query": {
"fuzzy": {
"value": "'" search_text "'",
"fuzziness": "AUTO"
}
},
"type": "bool_prefix",
"fields": [
"company_name",
"company_name._2gram",
"company_name._3gram"
]
}
}
}
Но я получаю эту ошибку
```
"type": "parsing_exception",
"reason": "[multi_match] unknown token [START_OBJECT] after [query]",```
Это приводит к тому, что мой запрос не работает.
Ответ №1:
Нет необходимости добавлять нечеткий запрос. Чтобы добавить нечеткость в запрос с несколькими совпадениями, вам необходимо добавить свойство нечеткости, как описано здесь :
Поскольку вы используете bool_prefix в качестве типа запроса с несколькими совпадениями, он создает match_bool_prefix для каждого поля, которое анализирует его входные данные и создает bool-запрос из терминов. Каждый термин, кроме последнего, используется в запросе term. Последний термин используется в запросе с префиксом.
Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска
Сопоставление индексов:
{
"mappings": {
"properties": {
"company_name": {
"type": "search_as_you_type",
"max_shingle_size": 3
},
"serviceTitle": {
"type": "search_as_you_type",
"max_shingle_size": 3
},
"services": {
"type": "search_as_you_type",
"max_shingle_size": 3
}
}
}
}
Индексировать данные:
{
"company_name":"sequencing how shingles are actually used"
}
Поисковый запрос:
{
"size": 10,
"query": {
"multi_match": {
"query": "sequensing how shingles",
"type": "bool_prefix",
"fields": [
"company_name",
"company_name._2gram",
"company_name._3gram"
],
"fuzziness":"auto"
}
}
}
Результат поиска:
"hits": [
{
"_index": "65153201",
"_type": "_doc",
"_id": "1",
"_score": 1.5465959,
"_source": {
"company_name": "sequencing how shingles are actually used"
}
}
]
Если вы хотите выполнить запрос sequensing
и получить приведенный выше документ, вам необходимо изменить bool_prefix
тип множественного соответствия с другого на другой в соответствии с вашим вариантом использования.
Комментарии:
1. Хм, похоже, не работает. Когда я запрашиваю: «sequencing», я получаю 700 результатов, но если я запрашиваю: «sequensing», я не получу результатов
2. @BrianGuan Чтобы проверить возможные значения нечеткости, пожалуйста, обратитесь к этому elastic.co/guide/en/elasticsearch/reference/current /. …
3. @BrianGuan ваш поисковый запрос выглядит нормально, не могли бы вы поделиться своим отображением индекса, а также образцами данных индекса?
4. « { «автозаполнение»: { «сопоставления»: { «свойства»: { «имя_компании»: { «тип»: «search_as_you_type», «max_shingle_size»: 3 }, «serviceTitle»: { «тип»: «search_as_you_type», «max_shingle_size»: 3 }, «сервисы»: { «type»: «search_as_you_type», «max_shingle_size»: 3 } } } } } «
5. @BrianGuan не могли бы вы поделиться образцами данных индекса и ожидаемым результатом поиска?