Ни одно хранилище данных со вторичными индексами не является действительно схемным, и Elasticsearch ничем не отличается. Хотя он не требует предварительного определения структуры данных, он выводит схему из структуры документов и принимает решения о том, как их индексировать, основываясь на этом. В этом отношении Elasticsearch использует неявную схему, а не явную схему для индексации ваших данных.
Эти решения по индексированию очень важны и оказывают большое влияние на то, как вы можете искать ваши данные. Если это строковое поле, оно должно быть размечено и нормализовано? если так как? если числовое поле, какая точность требуется? Есть еще много типов полей, таких как поля даты и времени, геопространственные формы и отношения родитель / потомок, которые требуют особого внимания.
В Elasticsearch это называется Mapping . Отображение — это просто определение полей документа и их типов, а также других доступных тонких настроек и конфигураций, полный список которых можно найти на странице « Основные типы» в документации Elasticsearch.
Elasticsearch автоматически создает сопоставление при добавлении вашего первого документа в индекс, и оно определяется на основе структуры документа и к нему применяются значения по умолчанию. Так, например, строковое поле будет автоматически подготовлено для включения полнотекстового поиска (токенизированного и нормализованного). Вы можете иметь несколько сопоставлений для каждого индекса, чтобы управлять различными схемами для разных типов документов в одном и том же индексе через понятие Elasticsearch types
.
Создание отображений вручную
Вскоре после того, как вы начали использовать Elasticsearch в реальных проектах, вы понимаете, что настройки Mapping далеко не идеальны. Наиболее распространенным требованием является создание определенных строковых полей not_analyzed; или использовать другой анализатор не по умолчанию . В основном, чтобы контролировать, как их ищут. Для этого вам нужно переопределить значения по умолчанию или предоставить собственное сопоставление до применения значений по умолчанию.
Вы можете определить отображение заранее при создании индекса, просто явно создав индекс и передавая JSON Mapping во время его работы:
PUT /twitter { "tweet" : { "properties" : { "message" : {"type" : "string" }, "user" : {"type" : "string", "index": "not_analyzed" } } } }
Не все поля должны быть определены заранее в отображении (точно так же как определение отображения заранее необязательно). Если новые поля вводятся при индексации документов, к нему будет применено значение по умолчанию Elasticsearch. Подробнее читайте в документации по Put Mapping API .
Тем не менее, это все еще надоело делать. Создание индекса в явном виде все еще требует больше кода и дополнительного обслуживания, и когда индекс удаляется, отображение удаляется с ним. Совершенно вечеринка, особенно для сред разработки!
Индексные шаблоны
Введите шаблоны индекса. Вы можете предварительно зарегистрировать сопоставления с помощью шаблонов индексов, и они будут автоматически применяться к любому созданному индексу, имя которого совпадает с именем индекса, как определено в шаблоне:
PUT http://localhost:9200/_template/my_template { "template" : "tw*", "settings" : { "number_of_shards" : 1 }, "mappings" : { "tweet" : { "properties" : { "message" : {"type" : "string" }, "user" : {"type" : "string", "index": "not_analyzed" } } } } }
Приведенный выше шаблон определил то же отображение, которое мы видели ранее, но на этот раз нам не нужно ничего делать, чтобы он был применен к нашему индексу Twitter. Как только индекс будет создан, шаблон будет выбран и сопоставления в нем будут применены к новому индексу — потому что его имя совпадает с подстановочным знаком, который мы определили ( tw*
). Теперь вам не нужно явно создавать индекс — он будет создан автоматически, если он не существует после добавления в него первого документа.
Также обратите внимание, как мы можем применять пользовательские настройки индекса с помощью шаблона, чтобы мы могли автоматически устанавливать количество шардов, реплик или определять собственные анализаторы .
Созданный индекс может иметь несколько совпадающих шаблонов, и порядок их применения может быть определен order
свойством. Это позволяет создавать сложные сопоставления, все они управляются как документы в вашем экземпляре Elasticsearch и применяются динамически, как того требует ваша бизнес-логика.
На этом этапе стоит отметить, что изменение сопоставления для существующего индекса поддерживается только частично — некоторые конфигурации нельзя изменить после создания. Точно так же шаблон применяется только при создании индекса. Изменение шаблона после этого не повлияет на уже созданные индексы.
Узнайте больше о шаблонах индексов здесь и начните использовать их вместо того, чтобы вручную создавать индексы с явным отображением. Вы никогда не оглянетесь назад.