Как создать индекс и логический запрос в поиске elasti c, который выполняет сопоставление префиксов в некоторых полях и точное сопоставление фраз в других полях? - PullRequest
1 голос
/ 13 марта 2020

Я хотел бы создать индекс, который содержит поле с именем "home_city". Мне нужно будет выполнить поиск по этому индексу, который возвращает все документы с полем home_city, которое в точности совпадает с «Литл-Рок». Мне также нужно будет выполнить поиск по этому индексу, который возвращает все документы с полем home_city, которое содержит любые слова со строкой запроса в качестве префикса. Например, если строка запроса "Ne", то в результате будут получены документы с home_city = "New York" или home_city = "Long Neck" или home_city = "Nevinton".

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

Например, прежний поиск (точный полный поиск по ключевому слову) работает, если я указываю индексу использовать анализатор Ewordti c «ключевое слово» , Я указываю это при создании индекса следующим образом ...

PUT my_index
{
   "mappings":{
       "properties":{
          "home_city": {
             "type":"text",
             "analyzer":"keyword", 
         }
      }
   }
}

Следующий запрос корректно возвращает все документы с полем home_city = "Little Rock"

{
  "query": {
    "bool": {
      "must": [
        {
              "query_string":{
                 "query":"Little Rock" 
           }
        }]
     }
   }
}

Также, как и ожидалось, если запрос не является «Little Rock», а «Little» или «Rock», тогда ответ не включает документы с home_city = «Little Rock». Хорошо, это то, что мы хотим.

Последний (сопоставление префиксов) работает, если я создаю индекс с настройками по умолчанию. Запрос выглядит следующим образом ...

{
  "query": {
            "match": {
                "home_city": "Di"
            }
      }
}

возвращает документы с полем home_city = "San D iego" и документы с полем home_city = "Diamondville".

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

Как создать индексную шапку, которая будет работать с запросами, которые точно ищут документы сопоставление всей строки запроса И запросы, которые ищут документы, содержащие запрос в качестве префиксов.

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

Cheers.

1 Ответ

0 голосов
/ 13 марта 2020

Вы можете отобразить, используя поля

Отображение

{
   "mappings":{
       "properties":{
          "home_city": {
             "type":"text",      --> will store as tokens using standard analyzer
             "fields": {
               "keyword":{
                 "type":"keyword" --> will store entire text as single token
               }
             }
         }
      }
   }
}

Запрос 1:

GET index_10/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "Little Rock"
          }
        }
      ]
    }
  }
}

Запрос 2: используйте match_phrase_prefix вместо match_phrase

Соответствующая фраза 1. все термины должны появляться 2. они должны иметь одинаковый порядок

Match_phrase_prefix

Возвращает документы, содержащие слова предоставленного текста, в том же порядке, как предусмотрено. Последний термин предоставленного текста рассматривается как префикс, совпадающий с любыми словами, начинающимися с этого термина.

GET index_10/_search
{
  "query": {
    "match_phrase_prefix": {
      "home_city": "di"
    }
  }
}

Точки, которые следует учитывать

  1. При вводе пользователями Лучше использовать simple_query_string вместо query_string, поскольку он не будет выдавать ошибки в случае неправильного синтаксиса поиска.
  2. Match_phrase_prefix будет искать только в начале токена. Если требуется выполнить поиск в любом месте текста, вы можете изучить NGrams, EdgeNgrams и встроенное автозаполнение и search_as_you_type.
...