Поисковый запрос ElasticSearch не чувствителен к регистру - PullRequest
0 голосов
/ 10 октября 2018

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

пример

{
    "query" : {
        "bool" : { 
            "should" : {
                "match_all" : {} 
            },
            "filter" : {
                "term" : { 
                    "city" : "pune"
                }
            }
        }
    }
}

этоотлично работает, когда город точно "pune", если мы изменим текст на "PUNE", он не будет работать.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

ElasticSearch нечувствителен к регистру.

"Elasticsearch" не чувствителен к регистру.Строковое свойство JSON будет отображено как text тип данных по умолчанию (с keyword типом данных sub или multi поле , которое я вскоре объясню).

Тип данных text связан с понятием анализа;Во время индекса входная строка подается через цепочку анализа , а результирующие члены сохраняются в инвертированной структуре данных индекса для быстрого полнотекстового поиска.При типе данных text, в котором вы не указали анализатор, будет использоваться анализатор по умолчанию, а именно Standard Analyzer .Одним из компонентов стандартного анализатора является строчный фильтр токенов , который строчные токены ( термины ).

Когда дело доходит до запроса Elasticsearch через API поиска,Есть много разных типов запросов, чтобы соответствовать практически любому варианту использования.Одно семейство запросов, таких как match, multi_match, являются полнотекстовыми запросами.Эти типы запросов выполняют анализ ввода запроса во время поиска, и полученные термины сравниваются с терминами, хранящимися в инвертированном индексе.Анализатор, используемый по умолчанию, также будет Standard Analyzer.

Другое семейство запросов, таких как term, terms, prefix, являются запросами на уровне терминов.Эти типы запросов не анализируют входные данные запроса, поэтому входные данные запроса как есть будут сравниваться с терминами, хранящимися в инвертированном индексе.

В вашем примере ваш запрос term в поле "city" не находит совпадений при использовании заглавных букв, поскольку он выполняет поиск в поле text, входные данные которого были проанализированы во время индекса.С отображением по умолчанию это то, где поле keyword sub может помочь.Тип данных keyword не подвергается анализу (ну, у него есть тип анализа с нормализаторами ), поэтому он может использоваться для точного сопоставления, а также для сортировки и агрегирования.Чтобы использовать его, вам просто нужно нацелиться на поле "city.keyword".Альтернативный подход также может состоять в том, чтобы заменить анализатор, используемый полем "city", на анализатор, который не использует фильтр токенов в нижнем регистре;При таком подходе потребуется переиндексировать все документы в индексе.

0 голосов
/ 11 октября 2018

Чтобы решить эту проблему, я создаю пользовательскую нормализацию и обновляемое отображение для добавления,

, прежде чем нам нужно будет удалить индекс и добавить его снова

Сначала Удалить индекс

УДАЛИТЬPUT http://localhost:9200/users

теперь создайте заново index

PUT http://localhost:9200/users

{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "user": {
      "properties": {
        "city": {
          "type": "keyword",
          "normalizer": "lowercase_normalizer"
        }
      }
    }
  }
}
0 голосов
/ 10 октября 2018

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

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

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

См .: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

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

...