Запрос Elasticsearch для поиска точного соответствия в строковом поле (без анализа) - PullRequest
0 голосов
/ 06 февраля 2020

Мы храним категорию в нашем индексе, вот отображение для категории

"name": {
     "type": "string",
     "analyzer": "autocomplete",
     "search_analyzer": "standard"
 }

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

    {
      "from": "0",
      "size": "15",
      "query": {
        "filtered": {
          "query": {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "a",
                    "type": "cross_fields",
                    "fields": [
                      "field1^20",
                      "filed1^12"
                    ]
                  }
                },
                {
                  "match": {
                    "category.name": "Arts and Culture"
                  }
                }
              ]
            }
          },
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "address_type": [
                      "val1",
                      "val2"
                    ]
                  }
                },
                {
                  "terms": {
                    "status": ["Active","Inactive"]
                  }
                }
              ]
            }
          }
        }
      }
    }

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

Я просто хочу сделать точное сопоставить с некоторыми изменениями в запросе, возможно ли это или есть какое-то решение?

Спасибо за помощь.

1 Ответ

1 голос
/ 07 февраля 2020

Отображение влияет на то, как ваши данные хранятся и как вы можете запросить это поле. Поле вашей категории (с именем name ) настроено для автоматического заполнения, а не для поиска с точным соответствием. Поэтому вам необходимо изменить отображение, чтобы обеспечить точный поиск совпадений.

Однако вы можете сделать это, не меняя текущего поля, а просто добавив дополнительное поле, преобразовав свое поле в мультиполе. и добавление поля, которое поддерживает запросы с точным соответствием. Фрагмент сопоставления:

"name": {"type": "string", "analyzer": "autocomplete", "search_analyzer": "standard", "fields": {"raw": {"type "" string "," index ":" not_analyzed "}}}}

Примечание: Я заметил, что вы используете более старую версию Elasticsearch (тип" string "был заменен на типы «текст» (для полнотекстового поиска) и «ключевое слово» (для точного поиска совпадений). Я попытался придумать сопоставление, которое работает со старыми версиями Elasticsearch, и надеюсь, что оно работает. Если нет, вам нужно предоставить версия Elasticsearch, которую вы используете.

После исправления сопоставления вам необходимо убедиться, что поле также заполнено. Это можно сделать, переиндексировав все данные, выполнив следующий запрос:

POST <your_index_name>/_update_by_query

В вашем запросе вам необходимо выполнить следующий поиск (для точного соответствия):

"match": {
  "category.name.raw": "Arts and Culture"
}

Для частичного поиска вы продолжите использовать поле category.name (без суффикса *). 1020 * * 1021 сырец *)

...