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

Версия Elasticsearch: 1.6.0

Последние месяцы я использую elasticsearch (только начал), и теперь у меня проблемы с ним. Вот некоторая информация о моей базе данных:

Индекс, который я использую, использует динамическое сопоставление по умолчанию (например: я не возился с его отображением). Мои объекты не должны содержать схемы. Также в индексе используется анализатор по умолчанию (я его тоже не трогал), поэтому index/_settings выглядит так:

{
    "default": {
        "settings": {
            "index": {
                "creation_date": "1441808338958",
                "uuid": "34Yn1_ixSqOzp9UotOE_4g",
                "number_of_replicas": "1",
                "number_of_shards": "1",
                "version": {
                    "created": "1060099"
                }
            }
        }
    }
}

Вот у меня проблема: по некоторым значениям полей поиск не работает должным образом (я пришел к выводу, что это из-за анализатора). Пример: поле email имеет значение [email protected]; {"query":{"bool":{"must":[{"term":{"user.email":"[email protected]"}}]}} не сработает, но использование значения термина просто «пользователь» работает (потому что оно каким-то образом токенизирует его, и нет токена с полным адресом электронной почты).

Вот что я хочу: мне нужен как поиск с подстановочными знаками (поиск плохого слова в тексте комментария), так и строгий поиск (например, по электронной почте для пример) в любом поле, тогда я буду использовать bool и should с term или wildcard.

Проблема в том, что я просто не могу сказать ему «хорошо, в этом поле вам следует использовать анализатор X», потому что все мои поля динамические.

Что я пробовал: в настройках индекса я ПОСТАВИЛ следующее: {"analysis":{"analyzer":{"default":{"type":"keyword"}}}}; не работает: ничего не изменилось (я также не забыл перед этим закрыть индекс и открыть его).

Эта проблема вообще связана с анализаторами?


person Mayhem93    schedule 09.09.2015    source источник
comment
если вы измените настройку анализатора, вы нужно переиндексировать документы.   -  person keety    schedule 09.09.2015


Ответы (2)


Этот запрос не будет работать

{"query": {"bool": {"must": [{"term": {"user.email": "[email protected]"}}]}}

Term является точным совпадением, то есть любое ваше значение для этого поля ("[email protected]" в вашем случае) должно совпадать с любыми токенами ES для этого поля.

Если вы не назначаете какой-либо анализатор для этого поля, ES предположит, что вы используете стандартный анализатор для этого поля. Когда этот "[email protected]" проиндексирован, он будет токенизирован в ("user", "example", "com").

Чтобы решить вашу проблему, вы должны указать ES "not_analyzed" поле электронной почты в отображении вашего индекса.

person Ryan Huynh.    schedule 10.09.2015
comment
Мне нужно сделать это для всех моих полей (которые являются динамическими). Думаю, мне нужно сделать динамическое отображение - person Mayhem93; 10.09.2015

С помощью Райана Хьюина я решил свою проблему:

Используйте динамические сопоставления; создайте индекс так:

PUT /index
{
  "mappings": {
    "_default_": {
      "dynamic_templates": [
        {
          "string_template": {
            "mapping": {
              "index": "not_analyzed",
              "type": "string"
            },
            "match_mapping_type": "string",
            "match": "*"
          }
        }
      ]
    }
}
person Mayhem93    schedule 10.09.2015