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语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员麻辣烫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值