Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
system:elasticsearch:mapping [2018/01/29 10:20] – создано mirocowsystem:elasticsearch:mapping [2018/01/29 10:47] (текущий) – [Nested(вложенный) type] mirocow
Строка 1: Строка 1:
 +{{tag>search indexer elasticsearch indexer}}
 +
 ====== Mapping ====== ====== 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 ===== ===== Конфигурация / Config =====
  
-  * "_source" : {"enabled" : false} — Тем самым мы указали, что хранить исходные данные для этого типа не нужно. Когда это может понадобится? Например у вас есть очень тяжелый документ с кучей информации, которую нужно только индексировать, но не нужно выводить в ответе +==== Базовые типы данных ==== 
-  * "store": true для поля message говорит о том, что это исходник поля необходимо сохранять в индексе + 
-  * "index" : "not_analyzed" — тут мы указали, что это поле не должно анализироваться, т.е. должно хранится как есть. Какие бывают анализаторы +<note tip>Примечание: По умолчанию **"_source" : {"enabled" : true}** и весь документ хранится в индексе в исходном состояние и возвращается по запросу. И это работает быстрее, чем хранить в индексе отдельные поля, при условии, что ваш документ не огромен. Тогда хранение только необходимых полей может дать профит. Поэтому я не рекомендую трогать это поле без веской на то причины.</note> 
-  * "null_value" : "na" — дефолтное значение для поля + 
-  * "index_name" : "rating" — тут мы указали алиас для поля. Теперь мы можем обращаться к нему как к «rank» так и к «rating»+  * **"_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. Обычно используется с связке с собственным анализатором. (Хотя как по мне, удовольствие сомнительное) 
 +