ES中mapping是什么,es中的数据类型

Posted shililu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES中mapping是什么,es中的数据类型相关的知识,希望对你有一定的参考价值。

 mapping解释

ES中的mapping有点类似与RDB中“表结构”的概念,在mysql中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。分词器、评分等概念在后面的课程讲解。


ES数据类型

常见数据类型

  • 数字类型:

       long integer short byte double float half_float scaled_float unsigned_long

  • keywords:
  1. keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword。keyword字段通常用于排序汇总Term查询,例如term
  2. constant_keyword:始终包含相同值的关键字字段
  3. wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值
  •    dates(时间类型):

     date,date_nanos

  • alias: 为现有字段定义别名
  • text: 全文搜索字段(如:emal,产品描述,产品名称,生成倒排索引前,字符串会被分词,分成一个一个词项)

 对象关系类型

  1. object:用于单个JSON对象
  2. nested:用于JSON对象数组
  3. join:为同一索引中的文档定义父/子关系。

结构化类型

  1. geo-point:纬度/经度积分
  2. geo-shape:用于多边形等复杂形状
  3. point:笛卡尔坐标点
  4. shape:笛卡尔任意几何图形

 自动映射和手工映射

  1.   Dynamic field mapping:

  • 整数 => long
  • 浮点数 => float
  • true || false => boolean
  • 日期 => date
  • 数组 => 取决于数组中的第一个有效值
  • 对象 => object
  • 字符串 => 如果不是数字和日期类型,那会被映射为text和keyword两个类型
  • 除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为其他类型ES无法自动识别手

2.手动创建

index:是否对创建对当前字段创建倒排索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示
analyzer:指定分析器(character filter、tokenizer、Token filters)。
boost:对当前字段相关度的评分权重,默认1
coerce:是否允许强制类型转换 true “1”=> 1 false “1”=< 1
copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询
doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘 空间(不支持text和annotated_text)
dynamic:控制是否可以动态添加新字段
true 新检测到的字段将添加到映射中。(默认)
false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式 添加新字段。
strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中
eager_global_ordinals:用于聚合的字段上,优化聚合性能。
Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据,Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能是秒级或者分钟级。*eager_global_ordinals不适用于Frozen indices
enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中

    PUT my_index
     
       "mappings": 
         "enabled": false
       
     

**fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)
format:格式化

   "date": 
      "type":  "date",
      "format": "yyyy-MM-dd"
    

ignore_above:超过长度将被忽略
ignore_malformed:忽略类型错误
index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段
Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间
Index_prefixes:前缀搜索
min_chars:前缀最小长度,>0,默认2(包含)
max_chars:前缀最大长度,<20,默认5(包含)
meta:附加元数据
normalizer:
norms:是否禁用评分(在filter和聚合字段上应该禁用)。
null_value:为null值设置默认值**
position_increment_gap:
proterties:除了mapping还可用于object的属性设置
search_analyzer:设置单独的查询时分析器:
similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean
store:设置字段是否仅查询
term_vector:**运维参数
 

以上是关于ES中mapping是什么,es中的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

(vue项目)巧用ES6中的数据类型Map

如何判断es mapping已经存在

ES6中的Map

JS中的 ES6新类型iterable

ES6 中的 Map 类需要啥? [复制]

Elastic Search中mapping的问题