ElasticSearch中Mapping创建

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 分词 位置和向量会被存储

发布了32 篇原创文章 · 获赞 4 · 访问量 2375

猜你喜欢

转载自blog.csdn.net/weixin_44644403/article/details/100741031
今日推荐