Теперь, когда мы рассмотрели типы полей данных, пришло время поговорить о мета-полях.
Введение в мета-поля
Итак, что же такое метаполя? Каждый документ, который индексируется в Elasticsearch, имеет метаданные, связанные с ним. Названия этих полей имеют префикс с подчеркиванием, и некоторые из них могут быть настроены при создании типа отображения. Ниже мы рассмотрим различные метаполя.
Мета-поля идентичности
Теперь мы обсудим различные категории метаполей, первая из которых - метаполя идентификации.
_index
Поле _index содержит имя индекса, к которому принадлежит документ, и позволяет сопоставлять документы на основе индекса, в котором они хранятся. На самом деле это виртуальное поле, и поэтому оно не хранится в Lucene как реальное поле.
_type
Поле _type хранит тип отображения документа - например, это может быть сотрудник. Это поле индексируется, чтобы ускорить поиск определенных типов документов.
_id и _uid
Поле _id содержит идентификатор документа. Это поле не индексируется, поскольку оно может быть получено из поля _uid, которое содержит как ID документа, так и его тип, разделенные хэштегом - {type}#{id}. Скорее всего, вы не будете использовать это поле, поскольку поля _id и _type доступны вам для удобства, но, тем не менее, всегда полезно знать, что происходит за кулисами.
Мета-поля источника документа
Следующая категория мета-полей - это мета-поля источника документа, которые содержат два поля.
_source
Поле _source содержит JSON, который был передан в Elasticsearch во время индексации, или обновленные значения, если документ с тех пор был обновлен. Это поле не индексируется, и поэтому в нем нельзя искать, но оно возвращается в результатах поиска или выборки. Его можно отключить, если вы хотите сэкономить место в хранилище.
_size
Поле _size содержит размер поля _source в байтах. Однако оно доступно только после установки плагина mapper-size, что можно сделать с помощью следующей команды.
1 | sudo bin/plugin install mapper-size |
Индексирующие мета-поля
Следующая категория мета-полей - это индексирующие мета-поля.
_all
Мета-поле _all содержит объединенные значения всех остальных полей, используя пробел в качестве разделителя. Оно анализируется и индексируется, но не сохраняется, то есть его можно искать, но не извлекать. Это поле полезно, если вы хотите найти в документах значение, но не знаете или не заботитесь о том, в каком поле это значение присутствует.
_field_names
Поле _field_names индексирует имена полей для документа, содержащего значение, отличное от NULL. Оно используется запросами exists и missing для поиска документов, в которых есть или нет значения для данного поля.
Мета-поля маршрутизации
Следующая категория - мета-поля маршрутизации.
_parent
Первое мета-поле маршрутизации, о котором мы поговорим, - это поле _parent. Оно позволяет определить отношения "родитель-ребенок" между документами в индексе, делая один тип отображения родителем другого типа отображения. Это очень похоже на наличие внешнего ключа к одной и той же таблице в реляционной базе данных.
1 2 3 4 5 6 7 | "mappings": { "employee": { "_parent": { "type": "person" } } } |
Рассмотрим приведенный выше пример, в котором родительский тип типа "сотрудник" установлен на тип отображения "человек". Когда вы добавляете документ в индекс, вы можете указать идентификатор родителя в URL, чтобы установить отношения для конкретного документа. Затем существует ряд запросов, которые можно использовать, чтобы потребовать существования заданного отношения, например.
_routing
Мета-поле _routing используется для маршрутизации документа в определенный шард в индексе и позволяет вам определить правила, которые контролируют, в каких шардах хранятся документы. Скорее всего, вас вполне устроят значения по умолчанию, которые предоставляет Elasticsearch, но для продвинутых случаев использования это действительно возможно. Тем не менее, вероятность того, что вам это когда-нибудь понадобится, невелика, но полезно знать, что такая возможность существует.
Другие мета-поля
Наконец, есть одно мета-поле, которое не подходит ни под одну из других категорий, а именно поле _meta.
_meta
Поле _meta используется для хранения специфических метаданных приложения, которые могут быть любыми. Это возможно потому, что каждый тип отображения может иметь собственные метаданные, связанные с ним, а Elasticsearch не делает с этими метаданными ничего, кроме их хранения и получения.