Elasticsearch-索引mapping详解

Es-索引mapping详解

ES-mapping详解

一、背景

在Elasticsearch中,映射指的是mapping,用来定义一个文档以及其所包含的字段如何被存储和索引,可以在映射mapping中事先定义字段的数据类型、字段的权重和分词器等属性,就类似在关系型数据库中创建字段时设置字段属性一样。

二、官方mapping构成

官方链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/coerce.html#coerce-setting

  1. Dynamic mapping

  2. Explicit mapping

  3. runtime fields

  4. field data type

  5. Metadata fields

  6. Mapping parameters

  7. mapping limit settings

  8. Removal of mapping type

三、构建mapping

  1. 首先确定数据格式类型
  • 基本数据类型

    • text

    • keyword

    • date

  • 复合数据类型

    • list

    • json

  1. 确定parameter参数

    • 不同的数据类型有不同的基础参数
  2. 确定mapping限制

四、类型举例

  1. TEXT-全文类型
  • description

    • 用于索引全文的字段,例如:电子邮件正文,商品介绍,个人简介

    • 这些字段能够被分析,在被索引之前,它们通过分析器将字符串转换成单个术语列表,分析过程中允许ES在每个全文字段中搜索单个单词

    • 该字段不用于排序,很少用于聚合

  • parameters

    • analyzer:分词器

      • 指明该字段用于索引时和搜索时的分析字符串的分词器(使用search_analyzer可覆盖);

      • 默认为索引分析器或标准分词器

    • fielddata:是否存储进fielddata

      • 指明该字段是否可以使用内存中的fielddata进行排序,聚合或脚本编写?

      • 排序,分组需要指定为true

      • 默认值为false

    • fields:设置【多数类型】

      • 当前text类型不够,还要设置其他类型。

      • 例如:text类型字段会被分词搜索,不能用于排序,但是需要当前字段既要能通过分词搜索,又要能够排序,就要设置fields为keyword类型进行聚合排序。

    • index:【是否被索引】

      • 设置该字段是否可以用于搜索。默认为true,表示可以用于搜索。
    • index_options: 【索引选项】用于控制在索引中哪些信息会被写入倒排索引中

      • docs:【文档号】

      • freqs:【文档号、关键词的出现词频率】,词频用于给文档进行评分,重复词的评分会高于单个词评分

      • positions:【文档号、词频、关键词的相对位置】,相对位置可用于编辑距离计算和短语查询(不分词那种)

      • offsets:【文档号、词频、关键词的相对位置、该词的起始字符串偏移量】

  1. keyword 关键字系列
  • description

    • keyword:主要用于 IDs、email地址、hostnames、status code、zip code 或者tags。

    • constant_keyword: 主要用于包含相同值的keyword

    • wildcard: 非结构化机器生成内容的通配符。通配符类型针对具有大值或高基数的字段进行了优化。

  • function

    • keyword字段只能按其确切值进行搜索,通常用于过滤、排序和聚合
  • keyword:

    • description

      • 不是所有的数字型数据都应该被映射为数字类型;ES优化了用于range查询的字段,例如:Integer和long;然而keyword字段更好的用于术语以及其他术语的查询。

      • 标识符(如ISBN或产品ID)很少用于范围查询。然而,它们通常使用术语级查询来检索。

      • 如果是以下情况,可以考虑使用keyword代替数字类型:

        • 你不计划使用范围查询检索标识符数据。

        • 快速检索相当重要,关键字字段上的术语查询搜索通常比数字字段上的词汇搜索更快。

    • parameters

      • doc_values

      • eager_global_ordinals:指明该字段是否加载全局序数?默认为false,不加载。 对于经常用于术语聚合的字段,启用此功能是个好主意。

      • fields:指明能以不同的方式索引该字段相同的字符串值,例如用于搜索的一个字段和用于排序和聚合的多字段

      • gnore_above:不要索引长于此值的任何字符串。默认为2147483647,以便接受所有值

      • index:指明该字段是否可以被搜索,默认为true,表示可以被搜索

      • index_options:指定该字段应将哪些信息存储在索引中,以便用于评分。默认为docs,但也可以设置为freqs,这样可以在计算分数时考虑术语频率

      • ignore_above:默认值是256,该参数的意思是,当字段文本的长度大于指定值时,不会被索引,但是会存储。即当字段文本的长度大于指定值时,聚合、全文搜索都查不到这条数据。–

        • ignore_above 最大值是 32766 ,但是要根据场景来设置,比如说中文最大值 应该是设定在10922 。

        • ignore_above背后的含义:Lucene对一个文本长度进行解析,当这个长度大于32766时,将不会进行analye行为。elasticsearch中采用字符个数来定义ignore_above值,而 Lucene 是采用byte字节。

          • 象形文字字符(中文、韩文、日文): 10922 个字符(算法是: 32766 / 3).

          • Literal字符(印度文、俄文): 16383 个字符(算法是: 32766 / 2).

          • ASCII字符(a-zA-Z0-9以及~!@#$等特殊字符): 32766个字符(算法是: 32766).

  • constant_keyword

  • wildcard

  1. 数字类型
  • description

    • ES支持的数字类型有整型数字类型,integer类型、long类型、short类型、byte类型。浮点型数字类型 double类型、 float类型、 half_float类型、 scaled_float类型这类数据类型都是以确切值索引的,可以使用term查询精确匹配。

      • long带符号的64位整数,最小值-263,最大值263-1

      • integer带符号的32位整数,最小值-231,最大值231^-1

      • short带符号的16位整数,最小值-32768,最大值32767

      • byte带符号的8位整数,最小值-128,最小值127

      • double双精度64位IEEE 754 浮点数

      • float单精度32位IEEE 754 浮点数

      • half_float半精度16位IEEE 754 浮点数

      • scaled_float带有缩放因子的缩放类型浮点数,依靠一个long数字类型通过一个固定的(double类型)缩放因数进行缩放.

  • parameters

    • coerce:是否尝试将字符串转换为整数并截断整数的分数,默认为true,接受一个boolean值

    • doc_values:是否将该字段以逐列的方式存储在磁盘上,用于聚合和排序,默认true

    • ignore_malformed:如果为true,则忽略格式错误的数字;如果为false则格式错误的数字会抛出异常并拒绝整个文档,默认false

    • store:字段是否与_source元数据分开存储

    • meta:关于字段的元数据,附加到字段上

    • index:指明该字段是否被搜索。默认为true,表示可以被搜索

    • null_value:指明一个与该字段相同类型的值去替换掉该字段中的null。默认为null,表示该字段被视为缺失

    • scaled_float: 类型接受一个附加参数scaling_factor(特别使用)

  • scaled_float

    • scaled_float类型需要格外注意:必须指定缩放因子scaling_factor。
    *   ES索引时,原始值会乘以该缩放因子并四舍五入得到新值,ES内部储存的是这个新值,但返回结果仍是原始值。
        
    *   例如:scale\_factor为10,ES在索引时,scaled\_float字段将在内部存储2.34为23,查询时,ES都会将查询参数x10再四舍五入得到的值与23匹配,若能匹配到返回结果为2.34
    

五、总结

  1. analyzer、search_analyzer、search_quote_analyzer的区别

    [https://blog.csdn.net/qq\_39552268/article/details/118330953](https://blog.csdn.net/qq_39552268/article/details/118330953)
    
  2. positions和offsets详解

index_positions:中的参数主要用于text类型数据进行分词,然后在检索匹配score大小和相关匹配高亮中起关键作用

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值