Elasticsearch от входа до отказа: бред

Elasticsearch
Elasticsearch от входа до отказа: бред

Ранее мы говорили об индексации, поиске и токенизаторе Elasticsearch, а сегодня поговорим о другом базовом контенте — Mapping.

Состояние сопоставления в Elasticsearch эквивалентно схеме в реляционной базе данных, его можно использовать для определения имени поля в индексе, определения типа данных поля, а также для настройки некоторых полей. Начиная с Elasticsearch 7.0, Mapping не заботится о необходимости определения информации о типе.официальное объяснение.

тип данных поля

Мы только что упомянули типы данных полей, которые могут быть определены в сопоставлении, которое, вероятно, является наиболее часто используемой функцией сопоставления, поэтому давайте посмотрим, какие типы данных поддерживает Elasticsearch.

  • Простые типы: текст, ключевое слово, дата, длинный, двойной, логический, ip
  • Сложные типы: типы объектов, вложенные типы
  • Специальные типы: geo_point, geo_shape для описания географических местоположений.

Типов данных, поддерживаемых Elasticsearch, намного больше, и из-за недостатка места я не буду перечислять их все здесь. Я ищу несколько общих, чтобы представить.

Во-первых, это строки.В Elasticsearch есть два типа строк: текст и ключевое слово. Строку текстового типа можно искать в полном тексте, она будет использоваться токенизатором,

PUT my_index
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}

При установке типа поля на текст вы можете использовать некоторые параметры для дальнейшей настройки этого поля.

index: отметьте, можно ли искать в этом поле, по умолчанию true

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

fielddata: разрешено ли сортировать и агрегировать поле в памяти, по умолчанию — false.

meta: некоторые метаданные о поле

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

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

Типы дат имеют три представления в Elasticsearch.

  1. Может быть отформатирован как строка типа даты, например"2020-07-26"а также"2015/01/01 12:10:30"Такой
  2. Отметка времени в миллисекундах представлена ​​длинным типом
  3. Временные метки второго уровня представлены целочисленными типами.

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

Мы можем настроить формат времени, по умолчаниюstrict_date_optional_time||epoch_millis

strict_date_optional_time_nanos- это анализ общего формата даты, по крайней мере, год должен быть включен, если время должно быть включено, используйтеTразделенный, напр.yyyy-MM-dd'T'HH:mm:ss.SSSSSSZилиyyyy-MM-dd.

Если вы хотите поддерживать несколько форматов даты одновременно, вы можете использоватьformatполе

PUT my_index
{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

Параметры сопоставления

Только что мы упомянули параметры для настройки формата даты Mappingformat, Mapping также предоставляет множество других параметров.

  • analyzer
  • boost
  • coerce
  • copy_to
  • doc_values
  • dynamic
  • eager_global_ordinals
  • enabled
  • fielddata
  • fields
  • format
  • ignore_above
  • ignore_malformed
  • index_options
  • index_phrases
  • index_prefixes
  • index
  • meta
  • normalizer
  • norms
  • null_value
  • position_increment_gap
  • properties
  • search_analyzer
  • similarity
  • store
  • term_vector

Давайте представим несколько часто используемых полей.

fields

прежде всегоfields, что может заставить одно и то же поле по-разному служить разным целям.

Например, мы можем установить строковое поле какtextтип, используемый для полнотекстового поиска, и может использоватьfieldsУстановить какkeywordТип, используемый для сортировки и агрегации.

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": {
            "type":  "keyword"
          }
        }
      }
    }
  }
}

При запросе мы можем использоватьcityДля выполнения полнотекстового поиска используйтеcity.rawСортировать и суммировать.

GET my-index-000001/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}

enabled

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

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user_id": {
        "type":  "keyword"
      },
      "last_updated": {
        "type": "date"
      },
      "session_data": { 
        "type": "object",
        "enabled": false
      }
    }
  }
}

В приведенном выше примере мы отключилиsession_dataЭто поле, в это время, вы можете либо перейти кsession_dataПоля хранят данные в формате JSON, а также могут хранить данные в формате, отличном от JSON.

Помимо отключения для отдельных полей, мы также можем отключить все сопоставление напрямую. Давайте воссоздадим индекс

PUT my-index-000002
{
  "mappings": {
    "enabled": false 
  }
}

В это время все поля документа не будут индексироваться, а будут использоваться только для хранения.

Следует отметить, что ни конкретное поле, ни включенный атрибут всего сопоставления не могут быть изменены, потому что, если установлено значение false, Elasticsearch не будет индексировать поле и не будет проверять достоверность данных.После установки грязных данных true, это вызовет ошибку программы.

null_value

Null нельзя индексировать или искать в Elasticsearch, Null, о котором мы здесь говорим, — это не null в языке в узком смысле, а все нулевые значения. Например, массив, в котором все значения равны нулю, короче говоря, определение здесь заключается в том, что значения нет.

Как насчет предприятий, которым необходимо искать нулевые значения? Elasticsearch дает намnull_valueЭтот параметр, который может указывать значение, будет использоваться для замены нулевого значения при поиске.

взять каштан

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type":       "keyword",
        "null_value": "NULL" 
      }
    }
  }
}

мы даемstatus_codeполе установленоnull_valueза"NULL". Обратите внимание,null_valueдолжен быть того же типа, что и искомый тип данных, если в этом примереstatus_codeимеет тип long, то вы не можете поставитьnull_valueУстановить как"NULL".

dynamic

Для вновь добавленных полей:

  • Если для параметра dynamic установлено значение true, сопоставление также будет обновляться после записи документа с новым полем.
  • Если для параметра dynamic установлено значение false, сопоставление не будет обновляться, новые поля не будут проиндексированы, но информация появится в_sourceсередина
  • Запись документа завершается ошибкой, если для параметра dynamic установлено значение strict

Для существующих полей после записи данных изменение определения поля больше не поддерживается.

Dynamic Mapping

Когда мы создаем индекс, нам не нужно писать сопоставления вручную, Elasticsearch поможет нам автоматически определить тип поля. Мы называем это динамическим отображением. Однако иногда оценки могут быть не очень точными.

Автоматическое распознавание типов Elasticsearch основано на JSON. Соответствующее соотношение типов данных выглядит следующим образом (таблица с официального сайта эластичных материалов)

JSON data type Elasticsearch data type
null No field is added.
true or false boolean field
floating point number float field
integer long field
object object field
array Depends on the first non-null value in the array.
string Either a date field (if the value passes date detection), a double or long field (if the value passes numeric detection) or a text field, with a keyword sub-field.

Типы данных сопоставления полей, поддерживаемые Elasticsearch, находятся в этомДокументацияВ дополнение к этому необходимо явно указать другие сопоставления типов.

Что касается типов дат, по умолчанию они отображаются, но Elasticsearch может распознавать даты только в нескольких форматах.yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis. Если выключенdate_detectionswitch, то он может быть распознан только как строка.

PUT my-index-000001
{
  "mappings": {
    "date_detection": false
  }
}

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

PUT my-index-000001
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}

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

PUT my-index-000005
{
  "mappings": {
    "numeric_detection": true
  }
}

PUT my-index-000005/_doc/1
{
  "my_float":   "1.0", 
  "my_integer": "1" 
}

В этом примереmy_floatраспознается как тип float , аmy_integerбудет распознан как длинный тип.

Dynamic template

динамический шаблон позволяет нам настраивать сопоставление и применять его к определенным индексам. Определение динамического шаблона обычно такое

  "dynamic_templates": [
    {
      "my_template_name": { 
        ...  match conditions ... 
        "mapping": { ... } 
      }
    },
    ...
  ]

my_template_nameМожет быть любой строкой.

match conditionsвключатьmatch_mapping_type, match, match_pattern, unmatch, path_match, path_unmatchЭти виды.

mappingЭто относится к тому, какое сопоставление следует использовать для сопоставленного поля. Ниже мы вводим несколько условий соответствия

match_mapping_type

Начнем с простого примера

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type":  "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}

Здесь у нас есть два шаблона, один из которых должен использоватьintegerвведите вместо этогоlongтип, а второй — сопоставить строковый тип сkeyword.

совпадать и не совпадать

Эти два параметра относительно просты: совпадение относится к полю, которое соответствует шаблону, а несоответствие относится к полю, которое не соответствует.

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "longs_as_strings": {
          "match_mapping_type": "string",
          "match":   "long_*",
          "unmatch": "*_text",
          "mapping": {
            "type": "long"
          }
        }
      }
    ]
  }
}

В этом примере нам нужноlong_стартовая строка, не требуется_textПоле конечной строки.

Кроме трех вышеперечисленных, есть и другие.match_patternдля регулярного сопоставления,path_matchа такжеpath_unmatchОн указывает, совпадает ли путь, по которому находится поле.

Кроме того, динамический шаблон также поддерживает два вида подстановки переменных, а именно:{name}а также{dynamic_type}. На самом деле name — это имя поля, а dynamic_type — обнаруженный тип поля.

Суммировать

Давайте сначала поговорим о сопоставлении Elasticsearch. Я думаю, что настройка сопоставления — это то, что требует опыта. Когда вы сталкиваетесь со все большим количеством случаев, вы можете легко узнать, как лучше настроить сопоставление. Кроме того, многие поля и параметры отображения не освещены в тексте, для меня большинство из них использует текущий документ, но я все же рекомендую вам взглянуть на документ, по крайней мере, когда вы столкнетесь с проблемами, вы можете знать один из документов, чтобы найти направление. Это сделает вас намного сильнее, чем окружающие вас люди.