huangfox

冰冻三尺,非一日之寒!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、ES Mapping

在lucene中,索引中每个字段都需要指定很多属性,例如:是否分词、采用哪个分词器、是否存储等。

在ES中,其实索引中每个字段也需要指定这些属性,我们有时候并没有对这些属性进行设置,这得益于ES的动态映射(Dynamic Mapping)。

参考: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"
            }
          }
        }
      ]
    }
  }
}

 

 

参考:

ES Mapping

 

posted on 2018-08-13 16:32  huangfox  阅读(9737)  评论(0编辑  收藏  举报