Ранее мы говорили об индексации, поиске и токенизаторе 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.
- Может быть отформатирован как строка типа даты, например
"2020-07-26"
а также"2015/01/01 12:10:30"
Такой - Отметка времени в миллисекундах представлена длинным типом
- Временные метки второго уровня представлены целочисленными типами.
Внутри 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_detection
switch, то он может быть распознан только как строка.
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. Я думаю, что настройка сопоставления — это то, что требует опыта. Когда вы сталкиваетесь со все большим количеством случаев, вы можете легко узнать, как лучше настроить сопоставление. Кроме того, многие поля и параметры отображения не освещены в тексте, для меня большинство из них использует текущий документ, но я все же рекомендую вам взглянуть на документ, по крайней мере, когда вы столкнетесь с проблемами, вы можете знать один из документов, чтобы найти направление. Это сделает вас намного сильнее, чем окружающие вас люди.