точное совпадение с оператором IN вasticsearch - PullRequest
0 голосов
/ 04 ноября 2018

Как найти точное совпадение нескольких текстовых значений с операцией IN? например,

SELECT * WHERE name in ('george','michael') AND testID in (1,2)

Когда я пытаюсь выполнить запрос ниже, он возвращает дополнительные данные для соответствующих значений, например, " george ", а не для точных значений только как " george "

{  
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "query_string":{  
                  "fields":[  
                     "name"
                  ],
                  "query":"george or michael"
               }
            },
            {  
               "terms":{  
                  "testID":[1,2]
               }
            }
         ]
      }
   }
}

1 Ответ

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

Это потому, что ваше поле name имеет тип text.

Когда тип данных, если text, Elasticsearch разбивает значения (например, The George или George Washington на токены [the, george] или [george, washington] и сохраняет эти токены в инвертированном индексе. Следовательно, при поиске в этом поле с использованием Ваш запрос также вернет эти документы, если вы скажете, что они не совпадают.

Для точного соответствия я предлагаю вам использовать тип keyword, используя нормализатор lowercase, как указано в приведенном ниже отображении:

PUT <your_index_name>
{  
   "settings":{  
      "analysis":{  
         "normalizer":{  
            "my_custom_normalizer":{  
               "type":"custom",
               "filter":[  
                  "lowercase"
               ]
            }
         }
      }
   },
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "name":{  
               "type":"keyword",
               "normalizer":"my_custom_normalizer"
            }
         }
      }
   }
}

При этом ваши значения будут сохранены, как, например, для основываясь на приведенном выше отображении, он преобразует The George или George Washington в the george или george washtingon и затем сохраняет их как есть в инвертированном индексе.

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

Надеюсь, это поможет!

...