добавить нечеткость в запрос elasticsearch

#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 не могли бы вы поделиться образцами данных индекса и ожидаемым результатом поиска?