【Elasticsearch】索引结构

日月星宿 / 2023-08-11 / 原文

 

Elasticsearch索引主要结构有mappingsetting。

Mapping:

索引的Mapping可以类比关系型数据库中的Schema,主要包含:

  定义索引中字段名称
  定义字段数据类型,如:字符串、数字、boolean等
  可对字段设置倒排索引相关配置,如是否需要分词,使用什么分词器

注意:

  ElasticSearch从7.x版本开始,一个Mapping只属于一个索引type,即一个索引只能有一个类型type,默认type 为_doc。

 

mapping结构示例:

#mappings关键字
"mappings": {
    #字段名称和类型的定义
    "properties": {
        #字段名
        "@timestamp": {
            #字段数据类型
            "type": "date"
        },
        "@version": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        },
        "calls": {
            "type": "long"
        },
        "day": {
            "type": "date"
        },
        "weekly": {
            "type": "text",
            #数据类型通过 fields 参数支持多字段,通过 fields 来定义 keyword 字段,这样就可以通过 weekly.keyword 来实现排序或者聚合
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        }
    }
}

mapping中的字段数据类型

每个字段都有一个数据数据type:
  text,keyword,date,long, double,boolean等简单类型
  支持JSON分层性质的类型,如 object,nested
  一种特殊类型,如geo_point, geo_shape,completion。
出于不同目的,以不同方式,对同一字段建立索引通常很有用, 例如:
一个字符串字段可以被索引为text全文搜索字段,也可以被索引为keyword排序或聚合字段,还可以使用standard分析器等分词器为字符串字段建立索引
大部分数据类型通过fields参数支持多字段,在上面例子中,通过fields来定义keyword字段,这样就可以通过name.keyword来实现排序或者聚合。

注意:

  mapping中字段类型一旦设定后禁止直接修改。因为lucene实现的倒排索引生成后不允许修改,所以在定义字段类型时候要考虑清楚。

mapping动态映射

Elasticsearch提供了动态映射的功能,即会根据用户输入的内容进行动态映射,功能如下:

  在写入文档时,如果索引不存在,会自动创建索引,这种机制,使得用户无需手动定义mappings。

  Elasticsearch会自动根据文档信息,推算出字段的类型,有时候,Elasticsearch`可能会推算不准确,如:地理位置信息,当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。

  尽管动态映射对于入门者来说非常有用,但有时仍需要自己显式指定映射,因为动态映射的类型和分词器不一定符合自身要求。所以可以在创建索引时创建字段Mapping 映射 ,也可以使用PUT Mapping API将字段添加到现有索引中:(创建指定mapping结构的索引)

PUT /索引名称
{
  "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "day": {
          "type": "date"
        },
        "telephone_traffic": {
          "type": "float"
        },
         "weekly": {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

给索引添加新字段并显示指定类型和分析器

PUT /索引名称/_mapping
{
    "properties": {
        "english_title": {
            "type":     "text",
            "analyzer": "english"
        }
    }    
}

 

 

 

 

 

 

 

 

 

 

 

来源:ElasticSearch之索引结构_elasticsearch 导入索引结构_止步前行的博客-CSDN博客