Подтвердить что ты не робот

Отключение анализа поля по умолчанию в режиме упругого поиска

Можно ли выборочно включить индексирование полей упругого поиска для типа?

Через настройки отображения для определенного индекса можно установить свойство

{ "index": "not_analyzed" }

Для определенного поля. Поскольку в моем документе слишком много полей и, вероятно, изменит структуру в будущем, мне понадобится сопоставление, где поля не анализируются по умолчанию, если не указано иначе.

Возможно ли это?

4b9b3361

Ответ 1

Да - посмотрите динамические шаблоны

Попробуйте следующее:

PUT /my_index
{
  "mappings": {
    "my_type": {
        "dynamic_templates": [
            { "notanalyzed": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":        "string",
                      "index":       "not_analyzed"
                  }
               }
            }
          ]
       }
   }
}

Динамический шаблон предназначен для новых полей, которые не охвачены вашим сопоставлением - из документов:

С помощью dynamic_templates вы можете полностью контролировать отображение который генерируется для вновь обнаруженных полей.

Вы также можете изменять отображение в соответствии с именем поля, например. используйте "match": "*_data", чтобы иметь другой набор сопоставлений для имен полей, заканчивающихся на "_data".

Ответ 2

Из строкового типа elasticsearch 5.x отключен. Вместо этого elasticsearch представил два типа текста и ключевое слово. Прочитайте этот блог о причинах переноса данных https://www.elastic.co/blog/strings-are-dead-long-live-strings

Итак, вместо добавления шаблона для отключения анализатора вы можете просто использовать поле field.keyword для точного поиска. например Если имя поля fullName, и у вас есть записи

  • fullName: "John Doe"
  • FULLNAME: "Джон"

then, fullName: "John" вернет два результата, а fullName.keyword: "John" вернет одну запись.

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

PUT _template/disable_all_analyzer
   {
     "template": "*",
     "mappings": {
       "_default_": {
           "dynamic_templates": [
               { "notanalyzed": {
                     "match":              "*", 
                     "match_mapping_type": "string",
                     "mapping": {
                         "type":        "keyword"
                     }
                  }
               }
             ]
          }
      }
   }

Ура!!!