跳至主要內容

Elasticsearch映射

xw大约 3 分钟ElasticsearchElasticsearch

字段映射

映射是定义文档及其包含的字段如何存储和索引的过程。映射分为动态映射和显示映射。

动态映射

动态字段映射

当Elasticsearch在文档中检测到一个新字段时,默认情况下它会动态地将该字段添加到类型映射中。动态映射规则如下:

image-20230629223929627

  • "dynamic true"是指在索引文档时,Elasticsearch会自动检测索引字段的类型,并根据字段值的类型来推断字段的映射类型。例如,如果字段的值是一个字符串,那么该字段的映射类型就会被推断为"string"。这种自动推断字段类型的功能可以简化索引文档的过程,但也可能导致字段类型的不一致。
  • "runtime"是Elasticsearch 7.0版本中引入的一个新功能,它允许用户在查询时动态地定义和使用脚本字段。脚本字段是在查询期间计算出来的虚拟字段,它可以根据文档的字段值来进行计算和转换。通过使用脚本字段,用户可以在不修改索引映射的情况下,对文档进行动态的计算和转换操作。
  • 基本使用:

    ## 创建索引
    PUT /dynamic_field_index
    {
      "mappings": {
        "dynamic":true
      }
    }
    
    ## 插入测试数据
    POST /dynamic_field_index/_doc/1
    {
      "name":"xw",
      "age":"10"
    }
    
    ##查看索引mappling结构如下
    {
      "dynamic_field_index" : {
        "mappings" : {
          "dynamic" : "true",
          "properties" : {
            "age" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
    

    开启string类型自动识别为数字和日期:

    ## 修改索引映射结构,开启string类型自动识别数字和时间格式
    PUT /dynamic_field_index/_mapping
    {
      "numeric_detection": true,
     "dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"]
    }
    
    ## 添加测试数据
    POST /dynamic_field_index/_doc/4
    {
      "name":"xw",
      "age":"102",
      "int1":"2",
      "float2":"2.0",
      "date1":"2044/05"
    }
    

    查看索引mappling如下图所示,字符串date1自动识别为日期类型,float2自动识别为float类型:

image-20230630175659831

动态模板

Elasticsearch动态模板是一种配置机制,它允许你定义一组规则,以便在索引文档时自动应用映射和设置。动态模板可以根据字段名、字段类型或其他条件来匹配字段,并为匹配的字段应用指定的映射和设置。

基本使用:

PUT _index_template/my_dynamic_template
{
  ## 索引正则
  "index_patterns": ["*"],
  "template": {
    "mappings": {
      "dynamic_templates": [
        {
          "my_fields": {
            "match_mapping_type": "string",
            "match": "my_*",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}

显示映射

显示映射指定字段,示例如下:

PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

运行时字段

运行时字段(Runtime Fields)是一种临时创建的字段,它们在查询过程中动态计算或提取,而不会存储在索引中。这些字段在查询时可以根据需要创建,并且对于临时的计算、聚合或转换非常有用。示例如下:

## 添加索引
PUT /my-index-runtime
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      }
    },
    "runtime": {
      "my_runtime_field": {
        "type": "keyword",
        "script": {
          "source": "emit(doc['name'].value.toUpperCase())"
        }
      }
    }
  }
}

## 添加测试数据
POST /my-index-runtime/_doc/1
{
  "name":"aaagfGFDGFD"
}

查询:

GET /my-index-runtime/_search
{
  "query": {
    "match": {
      "my_runtime_field": "AAAGFGFDGFD"
    }
  }
  , "fields": [
    "my_runtime_field"
  ]
}

##结果如下
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my-index-runtime",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "aaagfGFDGFD"
        },
        "fields" : {
          "my_runtime_field" : [
            "AAAGFGFDGFD"
          ]
        }
      }
    ]
  }
}

在查询的时候也可以指定运行时字段,示例如下:

GET /my-index-runtime/_search
{
  "runtime_mappings": {
    "search_runtime_field": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['name'].value.toLowerCase())"}
    }
  },
  "fields": [
    "search_runtime_field"
  ]
}

数据类型

请参考官方文档open in new window,不再赘述。