{{tag>search indexer elasticsearch indexer}}

====== Mapping ======

<code bash>
$ curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '{
    "tweet" : {
        "_source" : {"enabled" : false},
        "properties" : {
            "user" : {"type" : "string", "index" : "not_analyzed"},
            "message" : {"type" : "string", "null_value" : "na", "store": true},
            "postDate" : {"type" : "date"},
            "priority" : {"type" : "integer"},
            "rank" : {"type" : "float", "index_name" : "rating"}
        }
    }
}'
</code>
===== Конфигурация / Config =====

==== Базовые типы данных ====

<note tip>Примечание: По умолчанию **"_source" : {"enabled" : true}** и весь документ хранится в индексе в исходном состояние и возвращается по запросу. И это работает быстрее, чем хранить в индексе отдельные поля, при условии, что ваш документ не огромен. Тогда хранение только необходимых полей может дать профит. Поэтому я не рекомендую трогать это поле без веской на то причины.</note>

  * **"_source" : {"enabled" : false}** — Тем самым мы указали, что хранить исходные данные для этого типа не нужно. Когда это может понадобится? Например у вас есть очень тяжелый документ с кучей информации, которую нужно только индексировать, но не нужно выводить в ответе
  * **"store": true** для поля message говорит о том, что это исходник поля необходимо сохранять в индексе
  * **"index" : "not_analyzed"** — тут мы указали, что это поле не должно анализироваться, т.е. должно хранится как есть. Какие бывают анализаторы
  * **"null_value" : "na"** — дефолтное значение для поля
  * **"index_name" : "rating"** — тут мы указали алиас для поля. Теперь мы можем обращаться к нему как к «rank» так и к «rating»

==== Типы array/object/nested ====

=== Nested(вложенный) type ===

Подробнее о типе можно узнать из документации [[https://www.elastic.co/guide/en/elasticsearch/reference/5.6/nested.html|Nested datatype]]

Document \\
<code json>
{
    "obj1" : [
        {
            "name" : "blue",
            "count" : 4
        },
        {
            "name" : "green",
            "count" : 6
        }
    ]
}
</code>

Если мы будем искать **name = blue && count>5** то этот документ будет найден, что бы избежать такого сценария, стоит использовать nested тип.

mappig \\
<code json>
{
    "type1" : {
        "properties" : {
            "obj1" : {
                "type" : "nested",
                "properties": {
                    "name" : {"type": "string", "index": "not_analyzed"},
                    "count" : {"type": "integer"}
                }
            }
        }
    }
}
</code>

Для поиска по nested типу следует использовать [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html|nested query]] или [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html|nested filter]].

=== Multi-fields ===

Этот параметр позволяет указать разные настройки маппинга для одного поля. Добавлен ко все базовым типам (кроме nested и object).

<code json>
"title": {
    "type": "string",
    "fields": {
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}
</code>

Если отключить анализатор, поиск будет работать не на полную катушку, а если включить, то группировать мы будем не по сырым данным, а по обработанным. Например, Санкт-Петербург после анализатора будет «Санкт» и «Петербург».
Теперь мы можем обращаться к «title» за поиском и к «raw» за группировкой и любыми другими видами сортировки.

=== Остальные типы ===

  * [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-ip-type.html|ip type]] — хранение ip в виде цифр
  * [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html|geo point type]] — хранение координат (удобно при поиске ближайших объектов к определённой координате)
  * [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-shape-type.html|geo point type]] — довольно специфичный тип для хранение определённых полигонов
  * [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-attachment-type.html|attachment type]] — Хранение файлов в базе закодированных в base64. Обычно используется с связке с собственным анализатором. (Хотя как по мне, удовольствие сомнительное)

