• ES


    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

  • 相关阅读:
    POJ 3211 Washing Clothes
    MySQL 优化Limit分页
    signed 与 unsigned 有符号和无符号数
    C/C++ 变量的初始化
    C/C++ 变量的初始化
    返回值的判断
    返回值的判断
    《涅槃经》的研读
    《涅槃经》的研读
    Opencv Surf算子特征提取与最优匹配
  • 原文地址:https://www.cnblogs.com/huangfox/p/9469088.html
Copyright © 2020-2023  润新知