Elastic(三) 索引

114 阅读5分钟

索引概念

  • elastic 索引(index) -> 数据库的库
  • index 中 index type -> 数据库的表
  • 每个index type 中的 filed -> 数据库的列

在 elastic 中 index type 在逐渐的弱化

  • elastic 7.+ 中 index type 统一为 _doc
  • elastic 8.+ 中将删除 index type

索引的 CRUD

创建索引

手动创建

PUT /manual_index_test
{
  "mappings": {
    "properties": {
      "date": {
        "type": "text"
      }
    }
  }
}

上面代码将手动创建索引名称为 manual_index_test 的索引, 索引结构为:

image.png

索引创建好以后,字段类型无非修改,只能删除索引后重新创建

动态创建

PUT /dynamic_index_test/_doc/1
{
  "name": "xiaomi phone",
  "desc": "shoji zhong de zhandouji",
  "price": 3999,
  "tags": [
    "xingjiabi",
    "fashao",
    "buka"
  ]
}

上面的语句将动态创建名称为 dynamic_index_test 的索引, 同时向该索引增加一条数据. elastic 会根据插入的数据动态匹配字段类型. 索引结构为:

image.png

查询索引结构

GET /dynamic_index_test/_mapping

删除索引

DELETE /dynamic_index_test?pretty

ES 数据类型

常见类型

数字类型

  • long
  • integer
  • short
  • byte
  • double
  • float
  • half_float
  • scaled_float
  • unsigned_long

Keyword type family

  • keyword: 适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword. 用于结构化内容,例如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。
  • constant_keyword:始终包含相同值的关键字字段
  • wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值 关键字字段通常用于排序汇总Term查询,例如term

Dates(时间类型)包括datedate_nanos

alias为现有字段定义别名

binary(二进制)

range(区间类型)

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range

text

当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索 引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为text创建正排索引:大量堆空间,尤其是 在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问 题。这就是默认情况下禁用字段数据的原因)

对象关系类型

  • object:用于单个JSON对象
  • nested:用于JSON对象数组
  • flattened:允许将整个JSON对象索引为单个字段。

结构化类型

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

特殊类型

  • IP地址:ip 用于IPv4和IPv6地址
  • completion:提供自动完成建议
  • tocken_count:计算字符串中令牌的数量
  • murmur3:在索引时计算值的哈希并将其存储在索引中
  • annotated-text:索引包含特殊标记的文本(通常用于标识命名实体)
  • percolator:接受来自query-dsl的查询
  • join:为同一索引内的文档定义父/子关系
  • rank features:记录数字功能以提高查询时的点击率。
  • dense vector:记录浮点值的密集向量。
  • sparse vector:记录浮点值的稀疏向量。
  • search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成
  • histogram:histogram 用于百分位数聚合的预聚合数值。
  • constant keyword:keyword当所有文档都具有相同值时的情况的 专业化。

array(数组)

在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有 相同的数据类型。

新增

  • date_nanos:date plus 纳秒
  • features

索引两种映射类型

Dynamic field mapping

  • 整数 => long
  • 浮点数 => float
  • true || false => boolean
  • 日期 => date
  • 数组 => 取决于数组中的第一个有效值
  • 对象 => object
  • 字符串 => 如果不是数字和日期类型,那会被映射为text和keyword两个类型 除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为其他类型ES无法自动识别。
# dynamic_index_test 为索引名称, 下面的代码将自动创建 dynamic_index_test索引, 并插入 id=1的数据
PUT /dynamic_index_test/_doc/1
{
  "name": "xiaomi phone",
  "desc": "shoji zhong de zhandouji",
  "price": 3999,
  "tags": [
    "xingjiabi",
    "fashao",
    "buka"
  ]
}

Expllcit field mapping:手动映射

PUT /索引名称
{
    "mappings": {
        "properties": {
    	    "字段名称": {
      	        "type": "字段类型"
	    }
        }
    }
}

索引映射参数

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:控制是否可以动态添加新字段

  1. true 新检测到的字段将添加到映射中。(默认)

  2. false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式 添加新字段。

  3. strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中

eager_global_ordinals:用于聚合的字段上,优化聚合性能。

  1. Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据, Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能 是秒级或者分钟级。 eager_global_ordinals不适用于Frozen indices

enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法 修改。

    PUT my_index
    {
      "mappings": {
        "enabled": false
      }
    }

fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中

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

⑫ format:格式化

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

⑬ ignore_above:超过长度将被忽略

⑭ ignore_malformed:忽略类型错误

⑮ index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段

⑯ Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间

⑰ Index_prefixes:前缀搜索

  1. min_chars:前缀最小长度,>0,默认2(包含)

  2. max_chars:前缀最大长度,<20,默认5(包含)

⑱ meta:附加元数据

⑲ normalizer:

norms:是否禁用评分(在filter和聚合字段上应该禁用)。

21 null_value:为null值设置默认值

22 position_increment_gap:

23 proterties:除了mapping还可用于object的属性设置

24 search_analyzer:设置单独的查询时分析器:

25 similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean

26 store:设置字段是否仅查询

27 term_vector: 运维参数