3 Elasticsearch索引简介

ES的索引和mapping有很大的关系,因为mapping类似于mysql的表结构,定义了字段数据类型,在es中不同的字段数据类型,使用不同的策略索引和结构。

mapping

一个mapping的结构如下

{
  "mapping": {
    "properties": {
      "@version": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "genre": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "id": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "year": {
        "type": "long"
      }
    }
  }
}

字段解释

一些字段的解释。其中 fields是多字段特性,让一个字段拥有多个子字段类型,使得一个字段能够被多个不同的索引方式进行索引。

{
  "mappings": {
    "properties": {
      "title": {               # 字段名称
        "type": "text",        # 字段类型
        "analyzer": "english", # 字段分词器
        "fields": {            # 多字段域,固定写法
          "std": {             # 子字段名称
            "type": "text",    # 子字段类型
            "analyzer": "standard"  # 子字段分词器
           }
        }
      }
    }
  }
}

数据类型

在这里插入图片描述

索引策略

对于字段数据类型,只有text类型会分词,其他类型都不会进行分词。分词的时候可以选择不同的分词器。

  1. 文本(Text)字段
  • 索引策略:文本字段在被索引时,Elasticsearch 会对其进行分析(Analysis)。分析过程包括将文本拆分成一个个的词项(Term),例如对于句子 “The quick brown fox jumps over the lazy dog”,可能会被拆分成 “the”、“quick”、“brown”、“fox” 等词项。然后对这些词项进行标准化处理,如将大写转换为小写等操作。
  • 倒排索引:是倒排索引。倒排索引中会记录每个词项在哪些文档中出现,以及在文档中的位置等信息。这样在进行文本搜索时,可以快速定位包含查询词项的文档。
  1. 关键字(Keyword)字段
  • 索引策略:关键字字段被视为一个整体,不会进行分析。例如,一个包含电子邮件地址的关键字字段,会被完整地索引为一个单独的值,而不是被拆分成多个部分。
  • 倒排索引:是倒排索引。不过由于它是整体索引,在查询时是精确匹配整个关键字值,而不是像文本字段那样对词项进行匹配。
  1. 数值(Numeric)字段(如整数、长整数、浮点数等)
  • 索引策略:数值字段按照其数值类型直接索引。例如,整数类型的字段会按照整数的二进制表示进行索引,以便进行数值范围查询等操作。
  • 倒排索引:不是传统意义上的倒排索引。数值字段的索引结构更适合进行数值比较运算,如大于、小于、等于等操作,而不是基于词项的匹配。
  1. 日期(Date)字段
  • 索引策略:日期字段会被转换为内部的日期格式(例如,基于毫秒的时间戳)进行索引。Elasticsearch 支持多种日期格式的解析,在索引时会将输入的日期字符串转换为统一的内部格式。
  • 倒排索引:是倒排索引。这使得可以进行日期范围查询等操作,例如查找某个时间段内的文档。
  1. 布尔(Boolean)字段
  • 索引策略:布尔字段简单地以其布尔值(true 或 false)进行索引。
  • 倒排索引:是倒排索引。可以方便地查询布尔值为特定值(true 或 false)的文档。

倒排索引

说明

以目录为例,这种是正排索引

在这里插入图片描述

根据单词找到页码就是倒排索引

在这里插入图片描述

对于搜索引擎而言

  • 正排索引 - 文档ID到文档内容和单词的关联
  • 倒排索引 - 单词到文档ID的关系

实例

这是一个倒排索引的例子,将左侧文档里的内容,改成倒排索引后的样子。

在这里插入图片描述

右侧的图可以分为两大部分:

  1. 单词词典(Term Dictionary):记录所有文档的单词,记录单词到倒排列表的关联关系
  2. 倒排列表(Posting List):记录单词对应的文档组合,由倒排索引项(Posting)组成
  • 倒排索引项包含:文档ID,词频TF(该单词在文档中出现的次数,用于相关性评分),位置(Position,单词在文档中分词的位置,用于语句搜索),偏移(Offset,记录单词的开始结束位置,实现高亮显示)

在实际中,由于Term Dictionary可能非常大,无法全部放入内存,因此Elasticsearch引入了Term Index。Term Index类似于字典的索引页,它包含了词的一些前缀和对应的Term Dictionary的block位置。通过Term Index,Elasticsearch可以快速定位到Term Dictionary的某个位置,然后从这个位置顺序查找所需的词。

在这里插入图片描述

资料

  1. 聊聊 Elasticsearch 的倒排索引
  2. 面试官:ES 倒排索引如何实现?详细描述一下 ES 索引文档的过程?ES如何保证并发下读写一致?ES 如何实现 master 选举?
  3. ES-操作索引库_mapping属性
  4. elasticsearch 字段类型的索引、字段类型修改、字段类型、分页、排序、分组、聚合
  5. 数组如何在ElasticSearch中索引
  6. es的mapping参数-fields

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员麻辣烫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值