Как включить частично совпадающие результаты в запрос кросс-полей? - PullRequest
0 голосов
/ 26 ноября 2018

Я строю поиск по полям , используя Elasticsearch 6.2.У меня проблемы с выяснением того, как обрабатывать частичные совпадения для моего термина.

Мой запрос:

{
   "index":"course",
   "type":"course",
   "body":{
      "query":{
         "bool":{
            "must":{
               "multi_match":{
                  "query":"macroeconomics",
                  "fields":[
                     "course_name",
                     "course_number",
                     "university_name"
                  ],
                  "type":"cross_fields"
               }
            }
         }
      },
      "sort":[
         {
            "_score":"desc"
         },
         {
            "students":{
               "order":"desc"
            }
         }
      ],
      "from":0,
      "size":50
   }
}

Запрос возвращает достойные результаты, которые точно соответствуютmacroeconomics условие поиска в режиме кросс-полей.

Проблема в в том, что как только я изменяю условие поиска на macro, я получаю несколько результатов только для macro термин (точное совпадение), в то время как мои ожидаемые результаты будут включать:

  • любые результаты для macro члена (как точное совпадение), плюс
  • любые результаты для термина macro (как частичное совпадение), как, например, в "макроэкономике"

Я знаю, что использование групповых символов сильно влияет на производительность, так что это не оптимальный способ.

Как настроить запрос, чтобы получить ожидаемые результаты, как описано выше? Дело не в том, чтобы рассматривать «макрос» только как префикс, а как потенциальную подстроку, доступную в других результатах.

1 Ответ

0 голосов
/ 26 ноября 2018

В основном вам нужно будет создать собственный анализатор.Для справки, пожалуйста, проверьте ссылку

Если вы просто хотите попробовать.Чтобы настроить NGram Tokenizer, мы должны объявить следующее:

  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }

«my_analyzer» - это имя анализатора, которое мы будем использовать для поля ngram. Затем для ваших отображений вам необходимо сопоставить анализатор споле

 "mappings": {
    "_doc": {
      "properties": {
        "course_name": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
    }
    ...

Просто добавьте анализатор в нужные поля

ОБНОВЛЕНИЕ Подтвердите свой анализатор

GET yourindexname/_analyze 
{
  "analyzer": "my_analyzer", 
  "text":     "macroeconomics"
}

Другой, который я часто видел, это

"min_gram" : "3",
"max_gram" : "8"

Но все зависит от вашего варианта использования.

...