欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ElasticSearch中Mapping创建

程序员文章站 2022-07-09 15:37:43
...

ElasticSearch中Mapping创建

一,类型和映射

类型(type)在Elasticsearch 中表示一类相似的文档,类型是由名称和一组映射组成的。

 PUT company
 {
   "mappings": {
     "employee":{
       "properties": {
         "id":{"type": "keyword"},
         "name":{
           "type": "text",
           "analyzer": "standard"
         },
         "about":{
           "type": "text",
           "analyzer": "whitespace"
         },
         "geo":{
           "type": "geo_point"
         }
       }
     }
   }
 }

通过以上代码创建了一个索引(index)名为company,类型名(type)为employee,包括id,…about等一组属性映射。

那映射是什么呢?映射,就像是数据库中的schema ,描述了文档可能具有的字段或属性,每个字段的数据类型以及Lucene是如何索引和存储这些字段的。

每一个属性的值存入数据库之后,都会根据每个属性的设置对该数据就行倒排索引,(倒排索引的建立是取决于设置的,分词器等等),当你做全局搜索的时候,就会很快的返回你想要的的数据。

类型是如何实现的

Elasticsearch6之后,Elasticsearch规定一个索引下面只允许有一个类型。

在employee类型中,about字段类型是text,使用的分词器是whitespace。

    "about":{
        "type": "text",
        "analyzer": "whitespace"
     }

Elasticsearch提供了以下数据类型

string  字符串类型
	text and keyword
	text:大文本,长字符串,可以通过指定的分词器进行分词就,建立倒排索引
    keyword:不能够通过分词器进行分词,整个文本作为索引记录
Numeric datatypes 数字数据类型
	long, integer, short, byte, double, float, half_float, scaled_float
Date datatype  日期类型
	date
Boolean datatype  布尔类型
	boolean
Binary datatype  二进制数据类型
	binary
Range datatypes  范围数据类型
	integer_range, float_range, long_range, double_range, date_range
Complex datatypesedit  复杂数据类型
Object datatype  对象数据类型
	object for single JSON objects   对于单个JSON对象
Nested datatype  嵌套数据类型
	nested for arrays of JSON objects  对于JSON对象的数组
Geo datatypesedit  地理位置数据类型
Geo-point datatype  地理点数据类型
	geo_point for lat/lon points   对于纬度/经度点  可存入对象json,字符串,数组
Geo-Shape datatype  Geo-Shape数据类型
	geo_shape for complex shapes like polygons   对于像多边形这样的复杂形状
Specialised datatypesedit  专用数据类型
IP datatype   IP数据类型
	ip for IPv4 and IPv6 addresses   用于IPv4和IPv6地址
Completion datatype  完成数据类型
	completion to provide auto-complete suggestions  提供自动完成的建议
Token count datatype  令牌计数数据类型
	token_count to count the number of tokens in a string  计算字符串中的标记数
mapper-murmur3
	murmur3 to compute hashes of values at index-time and store them in the index
	在索引时计算值的哈希值并将它们存储在索引中
Percolator type  过滤器类型
	Accepts queries from the query-dsl 接受来自query-dsl的查询
join datatype  join 数据类型
	Defines parent/child relation for documents within the same index
    为同一索引中的文档定义父/子关系

一个索引一旦建立,就意味着已经按照你设置的映射规则建立倒排索引等等,所以,索引一旦建立,就不能进行修改。除非重新建立。

防止索引太多

为了防止索引创建的太多导致的内存不足,对索引的数量可以进行修改。

index.mapping.total_fields.limit
索引中的最大字段数。默认值为1000。
index.mapping.depth.limit
字段的最大深度,以内部对象的数量来衡量。例如,如果所有字段都是在根对象级别定义的,则深度为1。如果有一个对象映射,则深度为 2,等等。默认值为20。
index.mapping.nested_fields.limit
nested索引中的最大字段数,默认为50。使用100个嵌套字段索引1个文档实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档。

二,索引建立的过程

mappings中的参数
  • type(类型)
  • analyzer(分析器) 作用是分词和词条标准化(比如dogs标准化为dog,大写标准化小写),默认是standard分析器,还可以在创建mapping时配置自定义分析器,并使用自定义分析器。
  • normalizer 与analyzer类似,但是分词结果都是单一词
  • boost 设置查询相关性权重,默认是1
  • coerce 是否强制转换,默认为true,比如integer类型参数可以直接传递字符串数字,会自动转为数字。设置为false则不会强转,则参数值传递字符串会报错。
  • copy_to 可将字段指向一个组别,之后的查询可直接查询该组别,查询范围会从组别包含的字段中进行查询,多个值用空格隔开,类似_all。
  • doc_values 一般与keyword结合使用,默认为true,即查询可通过该字段进行排序和聚合查询,但是设置为fasle则不可通过该字段排序和聚合查询,但是相应会比较节省内存空间。
  • dynamic 默认为true,es默认可以动态新增字段,改为false后,可以动态插入不存在的字段名,但是这个字段名只会在_source中显示,并不会在mapping中插入,不能通过索引进行查询。该参数与properties参数同级
  • enabled 默认为true,设置为false则该字段不可被索引
  • eager_global_ordinals 设置为true可以提高查询速度,但会降低更新速度,只可用在keyword类型使用,text类型只能在设置fileddata参数为ture时使用
  • fileddata 与text配合使用,默认text类型不可支持排序和聚合查询,设置fileddata后即可,实现效果与新增keyword类型fields一致。
  • format 一般与日期类型一起使用,格式化日期
  • ignore_malformed 忽略异常插入的数据,默认为false,即插入异常数据会报错,比如integer类型插入非数字字符串,则会报错,设置为true则允许错误数据,可以插入。
  • ignore_above 限制字段字符串长度,只能和keyword类型一起用,插入的数据超过限制数的数据不报错,但是不会被存储,搜索不到
  • index 默认为true,设置为false则该字段不会存索引,即不可被搜索到。
  • fields 为一个字段设定一个子字段,一般是由于当前字段数据类型不满足某种查询时使用,比如text类型的字段,想要排序就需要设置keyword类型的fields 通过此field进行排序,如下
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}
 
PUT my_index/_doc/1
{
  "city": "New York"
}
 
GET my_index/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}
  • norms 规范化,默认为ture,如果该字段不参与计分,则可以设置为false以节省硬盘空间
  • null_value 指定该字段为null或空数组时对应的索引值,默认null不可被索引,使用方式如下
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "status_code": {
          "type":       "keyword",
          "null_value": "NULL" 
        }
      }
    }
  }
}
 
PUT my_index/_doc/1
{
  "status_code": null
}
 
PUT my_index/_doc/2
{
  "status_code": [] 
}
 
GET my_index/_search
{
  "query": {
    "term": {
      "status_code": "NULL" 
    }
  }
}
  • position_increment_gap 词间差距,当一个字段有多个值,默认该值为100,如下,因为Abraham 和 Lincoln分别在数组的两个词中,因此他们的伪差距为100,所以搜索不出来
PUT my_index/_doc/1
{
    "names": [ "John Abraham", "Lincoln Smith"]
}
 
GET my_index/_search
{
    "query": {
        "match_phrase": {
            "names": {
                "query": "Abraham Lincoln" 
            }
        }
    }
}
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "names": {
          "type": "text",
          "position_increment_gap": 0 
        }
      }
    }
  }
}
  • properties 配置type字段或子字段,自字段可如下配置嵌套类型和object
PUT my_index
{
  "mappings": {
    "_doc": { 
      "properties": {
        "manager": { 
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        },
        "employees": { 
          "type": "nested",
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        }
      }
    }
  }
}
  • search_analyzer 配置字段查询分析器,与analyzer一样,但只用在搜索时,同时存在则搜索以这个为主(注 es新增数据索引和搜索都是通过指定分析器进行分词)

  • similarity 配置字段相关度计算算法,默认是BM25,还可配置classic(TF/IDF算法),boolean(不计算相关度,只看查询内容是否完全匹配)

  • store 是否存储源数据,默认是true,即会存储源数据,设置为false则该字段不保存数据,一般用于映射

  • term_vector 词条向量,默认为false 参数有以下几个

    no 默认,不存储词条向量
    yes 分词对应的字段会被存储
    with_positions 分词和每个词的位置会被存储
    with_offsets 分词和分词的起始和结束字符偏移量会被存储
    with_positions_offsets 分词 位置和向量会被存储