ElasticSearch-倒排索引 文档映射

devtools/2025/1/16 3:44:30/
  • 倒排索引
  • 文档映射
    • 已有字段的Mapping修改
    • 常用Mapping参数配置
    • Index Template
    • Dynamic Template

倒排索引

  • 当数据写入 ES 时,数据将会通过 分词 被切分为不同的 term,ES 将 term 与其对应的文档列表建立一种映射关系,这种结构就是 倒排索引

    • 倒排索引
  • 为了进一步提升索引的效率,ES 在 term 的基础上利用 term 的前缀或者后缀构建了 term index, 用于对 term 本身进行索引

    • 倒排索引
  • 当我们去搜索某个关键词时,ES 首先根据它的前缀或者后缀迅速缩小关键词的在 term dictionary 中的范围,大大减少了磁盘IO的次数

    • 单词词典(Term Dictionary) :记录所有文档的单词,记录单词到倒排列表的关联关系
    • 倒排列表(Posting List):记录了单词对应的文档结合,由倒排索引项组成
    • 倒排索引项(Posting):
      • 文档ID
      • 词频TF:该单词在文档中出现的次数,用于相关性评分
      • 位置 (Position):单词在文档中分词的位置。用于短语搜索(match phrase query)
      • 偏移 (Offset):记录单词的开始结束位置,实现高亮显示
  • Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引

  • 可以指定对某些字段不做索引

    • 优点︰节省存储空间
    • 缺点: 字段无法被搜索

文档映射

  • Mapping类似数据库中的schema的定义,作用如下
    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数字,布尔等
    • 字段,倒排索引的相关配置 (Analyzer)
  • ES中Mapping映射可以分为动态映射和静态映射
    • 动态映射:不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射

      • 动态映射(Dynamic Mapping)的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型
      • 但是有时候会推算的不对,例如地理位置信息
      • 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
      • 文档映射
    • 静态映射:事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射

已有字段的Mapping修改

  • 后期更改Mapping的字段类型
    • 新增加字段

      • dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
      • dynamic设为false,Mapping 不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
      • dynamic设置成strict (严格控制策略),文档写入失败,抛出异常
      • Mapping修改
    • 对已有字段,一旦已经有数据写入,就不再支持修改字段定义

      • Lucene 实现的倒排索引,一旦生成后,就不允许修改
      • 如果希望改变字段类型,可以利用 reindex API,重建索引
    • 原因

      • 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
      • 但是如果是增加新的字段,就不会有这样的影响
  • 对已有字段的mapping修改:实现索引的平滑过渡,并且是零停机
    • 如果要推倒现有的映射, 你得重新建立一个静态索引
    • 然后把之前索引里的数据导入到新的索引里 POST _reindex
    • 删除原创建的索引
    • 为新索引起个别名, 为原索引名 PUT /user2/_alias/user
PUT /user2
{"mappings":{"properties":{"name":{"type":"text"}}}}
POST _reindex
{"source":{"index":"user"},"dest":{"index":"user2"}}
DELETE /user
PUT /user2/_alias/user

常用Mapping参数配置

  • index: 控制当前字段是否被索引,默认为true
    • 如果设置为false,该字段不可被搜索
PUT /user
{"mappings": {"properties": {"name":{"type":"text","index":false}}}}
  • 有四种不同基本的index options配置,控制倒排索引记录的内容
    • docs : 记录doc id
    • freqs:记录doc id 和term frequencies(词频)
    • positions: 记录doc id / term frequencies / term position
    • offsets: doc id / term frequencies / term posistion / character offsets
  • text 类型默认记录 postions,其他默认为 docs
    • 记录内容越多,占用存储空间越大
PUT /user
{"mappings":{"properties": {"name":{"type":"text","index_options":"offsets"}}}}
  • null_value: 需要对Null值进行搜索,只有keyword类型支持设计Null_Value才行
PUT /user
{"mappings":{"properties": {"name":{"type":"keyword","null_value":"NULL"}}}}
  • copy_to设置:将字段的数值拷贝到目标字段,满足一些特定的搜索需求
    • copy_to的目标字段不出现在_source中
PUT /user
{"mappings":{"properties":{"name":{"type":"text","copy_to":"full_address"}}}}

Index Template

  • Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到新创建的索引之上
    • 模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引
    • 你可以设定多个索引模版,这些设置会被“merge”在一起
    • 你可以指定“order”的数值,控制“merging”的过程
  • 当一个索引被新创建时
    • 应用Elasticsearch 默认的settings 和mappings
    • 应用order数值低的lndex Template 中的设定
    • 应用order高的 Index Template 中的设定,之前的设定会被覆盖
    • 应用创建索引时,用户所指定的Settings和 Mappings,并覆盖之前模版中的设定
PUT /_template/template_default 
{"index_patterns": ["*"],"order": 0,"version": 1, "settings": { "number_of_shards":1,"number_of_replicas":1}}

Dynamic Template

  • Dynamic Tempate定义在某个索引的Mapping中
PUT my_index
{"mappings":{"dynamic_templates":[{"strings_as_boolean":{"match_mapping_type":"string", "match":"is*","mapping":{"type":"boolean"}}}]}}

http://www.ppmy.cn/devtools/107919.html

相关文章

提升汽车行业软件质量:ASPICE培训的关键实践方法

ASPICE(汽车行业软件过程改进和能力确定)培训是一种针对汽车行业软件开发和维护过程的标准化培训。 该培训旨在帮助组织提高其软件开发和维护过程的质量和效率。以下是ASPICE培训的一些最佳实践方法: 1. 理解ASPICE框架:首先&…

FFmpeg打印基本音视频信息

1. 编写可执行文件 vim mediainfo_new.c#include<stdio.h> #include<libavutil/log.h> #include <libavformat/avformat.h>int main(int argc, char *argv[]) {int err_code;AVFormatContext *fmt_ctx NULL;av_log_set_level(AV_LOG_DEBUG);if(argc < …

KMP 详解

KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 s的前缀的最大值&#xff08;等价于前缀最大结尾处&#xff09; 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度&#xff08;等价于下标&#xff09; …

docker 启动ElasticSearch

拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0运行 Elasticsearch 容器 docker run -d \--name elasticsearch \-p 9200:9200 \-p 9300:9300 \-e "discovery.typesingle-node" \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \# -…

【2024数模国赛题目解析丨免费分享】

2024年高教社杯全国大学生数学建模竞赛赛题整体分析已出 A题&#xff1a;偏数学仿真建模&#xff0c;难度偏难&#xff0c;适合数学专业背景的同学 B题&#xff1a;评价决策类&#xff0c;自由度大&#xff0c;容易水&#xff0c;适合基础不太好的同学 C题&#xff1a;数据优…

WebSocket的详细介绍(打开你对WebSocket的认识)

WebSockets 是一种网络通信协议&#xff0c;它允许在客户端&#xff08;通常是 Web 浏览器&#xff09;与服务器之间建立一个持久的双向通信通道。这种协议特别适用于需要实时数据交换的应用场景&#xff0c;如实时聊天、在线协作编辑文档、实时游戏、股票报价系统等。 WebSoc…

【PyTorch][chapter 29][李宏毅深度学习][transformer-3] 使用PyTorch构建 Transformer

前言: 参考&#xff1a; https://www.datacamp.com/tutorial/building-a-transformer-with-py-torch, 使用PyTorch 构建Transformer 主要分为下面几步, 定义基本构建块——多头注意力、位置前馈网络、位置编码构建编码器块构建解码器块结合编码器和解码器层来创建完整的Transf…

华为达芬奇人像引擎2.0,人像体验有哪些升级

对于年轻人而言&#xff0c;拍照已成为生活中不可或缺的一部分&#xff0c;不仅是为了记录世界、更重要的是成为生活的主角&#xff0c;大胆表达自己。然而很多喜欢使用手机记录生活的人&#xff0c;既希望能够实现媲美单反的影像实力&#xff0c;同时还想呈现出真实、更具自然…