1、ES Mapping
在lucene中,索引中每個字段都需要指定很多屬性,例如:是否分詞、采用哪個分詞器、是否存儲等。
在ES中,其實索引中每個字段也需要指定這些屬性,我們有時候並沒有對這些屬性進行設置,這得益於ES的動態映射(Dynamic Mapping)。
Dynamic Mapping可以解決一部分場景,但有時候ES並不能很好的理解我們的業務數據,這時就需要我們自己指定這些屬性(Explicit Mapping)。
例如:
PUT my_index
{
"mappings": {
"doc": {
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
參考:Put Mapping
2、Dynamic templates
之前我們簡單聊過Dynamic field mapping,這種方式下字段的映射規則基本都是ES自己決定的。
如果我們不想完全受ES的“控制”,又不想每個字段都自己指定,有什么辦法呢?
Dynamic template可以讓我們制定一些規則,滿足這個需求。
"dynamic_templates": [
{
"my_template_name": {
... match conditions ...
"mapping": { ... }
}
},
...
]
a)my_template_name:模板的名稱
b)match conditions:匹配規則
c)mapping:匹配后的mapping規則
2.1 匹配規則
2.1.1 match_mapping_type
這里可以改變ES的想法!本來ES覺得這個字段應該映射成long,那么我們可以修改成integer。
例如:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
}
2.1.2 match and unmatch
這里主要是對字段名稱進行匹配處理。
例如我們想對所有string類型、以long開頭、並不以text結尾的字段改成long類型,如下:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
}
這里match還支持正則表達式,例如:
"match_pattern": "regex",
"match": "^profit_\d+$"
2.1.3 path_match and path_unmatch
這里主要是針對對象類型(object)的匹配規則。詳細內容參見官方文檔。
3、實例說明
3.1 ES默認string類型字段會被映射成text和keyword(sub_field),如果我們想只映射成keyword(用來過濾、排序、統計等),該如何處理?
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
參考: