Тип поля с выравниванием
По умолчанию каждое подполе в объекте отображается и индексируется отдельно. Если имена или типы подполей неизвестны заранее, то они отображаются динамически.
Тип flattened предлагает альтернативный подход, где весь объект отображается как одно поле. Учитывая объект, отображение flattened разобьёт его на листовые значения и проиндексирует их в одно поле в качестве ключевых слов. Затем содержимое объекта можно искать с помощью простых запросов и агрегаций.
Этот тип данных может быть полезен для индексирования объектов с большим или неизвестным числом уникальных ключей. Для всего JSON-объекта создаётся только одно отображение поля, что может помочь предотвратить взрыв отображений из-за слишком большого количества различных отображений полей.
С другой стороны, поля выровненных объектов представляют компромисс в плане функциональности поиска. Разрешены только базовые запросы без поддержки запросов на диапазон чисел или выделения. Дополнительная информация о ограничениях приведена в разделе Поддерживаемые операции.
Тип отображения flattened не следует использовать для индексирования всего содержимого документа, так как он обрабатывает все значения как ключевые слова и не обеспечивает полную функциональность поиска. Стандартный подход, где каждое подполе имеет свою запись в отображениях, хорошо работает в большинстве случаев.
Поле выровненного объекта можно создать следующим образом:
PUT bug_reports
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"labels": {
"type": "flattened"
}
}
}
}
POST bug_reports/_doc/1
{
"title": "Results are not sorted correctly.",
"labels": {
"priority": "urgent",
"release": ["v1.2.5", "v1.3.0"],
"timestamp": {
"created": 1541458026,
"closed": 1541457010
}
}
} Во время индексирования для каждого листового значения в JSON-объекте создаются токены. Значения индексируются как строковые ключевые слова без анализа или специальной обработки для чисел или дат.
Запрос к верхнеуровневому полю flattened ищет все листовые значения в объекте:
POST bug_reports/_search
{
"query": {
"term": {"labels": "urgent"}
}
} Для запроса к определённому ключу в выровненном объекте используется нотация объекта через точку:
POST bug_reports/_search
{
"query": {
"term": {"labels.release": "v1.3.0"}
}
} Поддерживаемые операции
Из-за сходства в способе индексирования значений поля flattened разделяют большую часть функциональности отображения и поиска с keyword полями.
В настоящее время поля выровненных объектов можно использовать со следующими типами запросов:
-
term,termsиterms_set -
prefix -
range -
matchиmulti_match -
query_stringиsimple_query_string -
exists
При запросе нельзя ссылаться на ключи полей с использованием подстановочных знаков, как в { "term": {"labels.time*": 1541457010}}. Обратите внимание, что все запросы, включая range, обрабатывают значения как строковые ключевые слова. Выделение не поддерживается для полей flattened.
Можно сортировать по полю выровненного объекта, а также выполнять простые агрегации типа «ключевое слово», такие как terms. Как и в случае с запросами, нет специальной поддержки чисел — все значения в JSON-объекте обрабатываются как ключевые слова. При сортировке это означает, что значения сравниваются лексикографически.
Поля выровненных объектов в настоящее время не могут храниться. Невозможно указать параметр store в отображении.
Получение выровненных полей
Значения полей и конкретные подполя можно получить с помощью параметра fields. Так как поле flattened отображает весь объект, потенциально содержащий множество подполей, как одно поле, ответ содержит неизменённую структуру из _source.
Однако отдельные подполя можно получить, явно указав их в запросе. Это работает только для конкретных путей, но не с использованием подстановочных знаков:
PUT my-index-000001
{
"mappings": {
"properties": {
"flattened_field": {
"type": "flattened"
}
}
}
}
PUT my-index-000001/_doc/1?refresh=true
{
"flattened_field" : {
"subfield" : "value"
}
}
POST my-index-000001/_search
{
"fields": ["flattened_field.subfield"],
"_source": false
} {
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [{
"_index": "my-index-000001",
"_type" : "_doc",
"_id": "1",
"_score": 1.0,
"fields": {
"flattened_field.subfield" : [ "value" ]
}
}]
}
} Вы также можете использовать скрипт Painless для получения значений из подполей выровненных полей. Вместо включения doc['<field_name>'].value в ваш скрипт Painless, используйте doc['<field_name>.<sub-field_name>'].value. Например, если у вас есть выровненное поле, называемое label, с подполем release, ваш скрипт Painless будет выглядеть так doc['labels.release'].value.
Например, предположим, что ваше отображение содержит два поля, одно из которых типа flattened:
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"labels": {
"type": "flattened"
}
}
}
} Проиндексируйте несколько документов, содержащих ваши сопоставленные поля. Поле labels имеет три подполя:
POST /my-index-000001/_bulk?refresh
{"index":{}}
{"title":"Something really urgent","labels":{"priority":"urgent","release":["v1.2.5","v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
{"index":{}}
{"title":"Somewhat less urgent","labels":{"priority":"high","release":["v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
{"index":{}}
{"title":"Not urgent","labels":{"priority":"low","release":["v1.2.0"],"timestamp":{"created":1541458026,"closed":1541457010}}} Поскольку labels — это поле типа flattened, весь объект отображается как одно поле. Для получения значений из этого подполя в скрипте Painless используйте формат doc['<field_name>.<sub-field_name>'].value.
"script": {
"source": """
if (doc['labels.release'].value.equals('v1.3.0'))
{emit(doc['labels.release'].value)}
else{emit('Version mismatch')}
""" Параметры для полей выровненных объектов
Принимаются следующие параметры отображения:
| Ускорение запросов на уровне поля при запросе. Принимает число с плавающей точкой, по умолчанию | |
| | Максимальная разрешенная глубина поля выровненного объекта в терминах вложенных внутренних объектов. Если поле выровненного объекта превысит этот лимит, будет выброшено исключение. По умолчанию |
| Необходимо ли хранить поле на диске в виде столбцов, чтобы позже его можно было использовать для сортировки, агрегаций или скриптов? Принимает | |
| Необходимо ли загружать глобальные порядковые номера в режиме ожидания при обновлении? Принимает | |
| Листовые значения, длина которых превышает этот лимит, не будут индексироваться. По умолчанию ограничений нет, и все значения будут индексированы. Обратите внимание, что это ограничение применяется к листовым значениям внутри поля выровненного объекта, а не к длине всего поля. | |
| Определяет, должно ли поле быть доступным для поиска. Принимает | |
| Какая информация должна храниться в индексе для целей оценки. По умолчанию | |
| Строковое значение, которое используется как замена явных | |
| Какой алгоритм оценки или подобия следует использовать. По умолчанию | |
| | Должны ли полные текстовые запросы разделять ввод по пробелам при построении запроса для этого поля. Принимает |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/flattened.html
|
|