Elasticsearch-6.x 倒排索引,doc_values,Fielddata, store研究

15分钟用Docker部署Elasticsearch实现生产级中文搜索 Elasticsearch是一种基于倒排索引的分布式搜索与分析引擎,区别于传统数据库的LIKE模糊匹配,它通过分词、相关性打分和倒排索引机制实现毫秒级全文检索。其核心价值在于支撑高并发、低延迟、语义理解的搜索场景,广泛应用于电商商品搜索、日志分析、内容平台站内搜索等工程实践。本文聚焦真实落地路径:基于Docker快速启动ES 8.x单节点集群,集成ik_smart中文分词器,配置同义词扩展与拼音搜索能力,并通过function_score定制业务相关性排序——所有步骤均源自SaaS项目中验证过的最小可行方案 阅读详情

一.倒排索引
倒排索引的概念,感兴趣的可以点击查看<<ES权威指南中关于倒排索引的解释>>

也可以查看elasticsearch简介和倒排序索引介绍这篇文章,写的很清晰。

1.1 字段和倒排索引的关系
首先,在es中,我们可以把一个doc(文档)理解为数据库中的一行数据,每个doc对应多个field(字段),例如:

PUT /employee/group/1
{
    "age" : 25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
PUT /employee/group/2
{
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
es中,会在_source中将数据存一份,然后,写入数据的同时,自动生成mapping信息,根据mapping信息,生成字段对应的倒排索引文件。

自动生成的mapping如下:

{
  "employee": {
    "mappings": {
      "group": {
        "properties": {
          "about": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "age": {
            "type": "long"
          },
          "interests": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}
按照字段,分别生成倒排索引文件,然后检索字段的时候,搜索字段对应的倒排索引文件即可,如下:

age字段:

age字段因为是long类型,整个字段无需分词(term,token),直接按字段值做倒排索引。

age-1-倒排索引文件
term词条    docID
25    1
32    2
about字段本身为text类型,支持分词,about.keyword多域字段为keyword类型,按整词作为term词条,所以产生about,about.keyword两个字段的倒排索引文件。

about-1 倒排索引文件
term词条    docID
i    1,2
love    1
to    1,2
go    1
rock    1,2
climbing    1
like    2
collect     2
albums    2
about.keyword-1倒排索引文件
term词条    docID
I love to go rock climbing    1
I like to collect rock albums    2
ES检索过程:

1.根据检索字段,如果是text类型的,按照写入索引时的分词机制,进行查询关键字分词,

2.查询字段对应的倒排索引文件,查询term分词,得到对应的docID

3.根据docID,获得doc,显示查询结果。

 

提问:
1.about.keyword的作用,换而言之,keyword数据类型和text数据类型的区别?
"about":"I love to go rock climbing"
对上面的about字段,keyword数据类型只支持精确搜索,因为keyword建立的索引文件的term,是全词建立索引,没有分词,所以,对于检索 about:"i",如果格式为keyword将返回null,无搜索结果。如果格式为text,则分词后建立索引,搜索  about:"i",有结果,因为有I 的term,由此可见,分词机制对搜索影响很大,因为term只能完全匹配,才会得到term对应的文档。

 

倒排索引的不足
1.倒排索引,按分词建立,建立后不可修改。

ES针对修改倒排索引,使用的是再合并策略:对修改的数据建立新的,小的索引文件,记录时间,新的索引文件和旧的索引文件合并,修改的部分,按时间最新覆盖。

2.倒排索引可以很快的通过分词,得到包含分词的文档。但是,如果我们已知文档,想得到文档拥有哪些分词,需要遍历整个倒排索引文件,影响效率。

解决办法是引入doc_values,doc_values是文档对应的分词形成的索引文件。

3.倒排索引十分依赖分词机制,分词机制不好,则搜索结果不理想

ES提供很多分词机制,也支持自定义分词机制。当然,如果不需要分词,只需要精准匹配,直接建立keyword类型数据即可。

 

二.doc_values 文档值
2.1. doc_values是什么
doc_values是elasticsearch中,对于倒排索引的部分缺点进行部分补充的功能。查看dov_values官方解释

倒排索引很方便单项查看 分词对应的文档,但是不利于反向查看,文档所有的分词。doc_values可以理解为反向的倒排索引,

doc_values存放的是文档对应的分词

2.1 doc_values的应用场景
上面说doc_values 是为了满足反向查询倒排索引而建立的。那么,什么样的情况我们需要用到doc_values呢。大致说来,聚合,排序,都会用到doc_values,

首先,我们进行一次聚合。

//增加一条记录
PUT /employee/group/3
{
    "age" :         32,
    "about" :       "I like to read book",
    "interests":  [ "music","books" ]
}
//查询abount中有i的,按age聚合,统计文档数
GET /employee/_search
{
  "query" : {
    "match" : {
      "about" : "i"
    }
  },
  "aggs" : {
    "res": {
      "terms" : {
        "field" : "age"
      }
    }
  }
}
这条语句主要是为了分析,每个数据出现的次数,例如,music有多少人喜欢,sports有多少人喜欢。结果如下:

{
  "aggregations": {
    "res": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 32,                   //age=32的有两个文档
          "doc_count": 2
        },
        {
          "key": 25,                   //age=25的有一个文档
          "doc_count": 1
        }
      ]
    }
  }
}
将上面的查询聚合过程分解:

1.执行query,查询about中包含i这个term的doc。得到文档1,2,3

2.得到文档1,2,3后,我们分析1,2,3的age字段,判断每个age的有多少人。

在第2步中,如果我们只有倒排索引文件,我们需要遍历整个倒排索引,去获取,1,2,3文档的age索引文件,按照age索引文件的term(age是数值类型,整词形成倒排索引,不进行分词),即age的值,然后合并统计文档数。

但是如果我们有doc_values之后,就很方便统计了。

doc_values是和倒排索引同时建立的。同样按索引/类型/字段区分索引文件,doc_value生成数据为:

age-1-doc_values索引文件
文档ID    包含的term(不分词的term,即字段对应的值)
1    25
2    32
3    32
 

有了doc_values的查询聚合过程如下:

1.执行query,查询about中包含i这个term的doc。得到文档1,2,3

2.得到文档1,2,3后,查询age对应的doc_values索引文件,将age合并,计数,得到25->1,32->2,返回结果。

搜索和聚合是相互紧密缠绕的。搜索使用倒排索引查找文档,聚合操作收集和聚合 doc values 里的数据。

注意:
doc_values对不分词的字段默认开启,包括about.keyword这类多域字段,对分词字段默认关闭,即about字段

#分词字段# 从数据类型来看,text默认进行分词,keyword,long,int,double,复杂数据类型等默认不进行分词

刚才的描述中,经常强调doc_values存放的是 文档对应的分词数,这句话是容易引起歧义的,但是又是正确的,如果,该字段不允许分词,则该字段的值,就是该文档在这个索引文件的唯一分词(即term),对于能分词的字段,doc_values是默认关闭,但是可以手动开启,这个时候,doc_values存放的是文档对应的分词数 ,这句话就是正确的。

所以,对于doc_values的用途,ES官网的说法是:

Doc values 不仅可以用于聚合。 任何需要查找某个文档包含的值的操作都必须使用它。 除了聚合,还包括排序,访问字段值的脚本,父子关系处理,参见 父-子关系文档 

#为什么对分词字段关闭#  没找到官方解释 、个人看法:对分词字段,开启doc_values,产生的索引文件占用磁盘过大,处理的时候,消耗cpu资源,

 

doc_values的优缺点
1.doc_values 提高了聚合,排序,所有针对字段值的操作的效率,

2.doc_values加大了磁盘空间,但是ES提供了doc_values的压缩算法,对doc_values进行了大量压缩。而且,用不到可以禁用,节省空间。
 

三.Fielddata 
3.1 fielddata是什么
因为doc_values不针对分词字段,那么,如果一定要对分词字段的term分词进行聚合,该怎么办呢?

在es中,对分词的field,直接执行聚合操作,会报错,

{
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [about] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
      }
大概意思是说,你必须要打开fielddata,然后将正排索引数据加载到内存中,才可以对分词的field执行聚合操作,而且会消耗很大的内存

fielddata就是满足该需求的,但是,因为过于消耗资源,所以默认关闭。

fielddata结构和doc_values相同,区别是.fielddata运算时在内存中生成,纯内存计算,doc_values放在磁盘中即可

有需求时,在mapping中打开fielddata开关。默认false关闭。

doc_values和fielddata详细说明可以查看博客 elasticsearch的Doc Values 和 Fielddata

四.store存储
字段独立于_source,单独存储,

注:_source中依然会存储该字段

优点: ES中,所有数据统一存在_source中,如果只是查询一个小字段,却要把_source中的整条数据显示后,再从_source中取出对应的字段,浪费资源。

缺点: 加大磁盘使用。

应用场景: 如果_source很大,频繁使用的字段很小,则应该store该字段,这样不需要每次都将_source加载完后,在查找该字段。
————————————————
版权声明:本文为优快云博主「灵520翼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u013501457/article/details/86009050

NoSQL选型实战:从数据流治理视角理解Redis、MongoDB、Cassandra等核心场景 NoSQL并非关系型数据库的替代品,而是面向高并发、低延迟、半结构化与分布式数据流的工程化解决方案。其本质是围绕‘时效性’‘形态适配性’‘地理韧性’‘语义可达性’和‘关系穿透性’五大数据治理维度构建的技术栈。Redis解决毫秒级热数据访问,MongoDB支撑快速迭代的文档演化,Cassandra保障海量写入下的跨区可用,Elasticsearch实现意图驱动的语义搜索,Neo4j赋能实时关系推理。在AI工程化加速、实时数仓普及与用户行为数据爆发的背景下,掌握NoSQL的场景化选型逻辑,已成为数据工程师应对电 阅读详情

相关推荐

ElasticSearch手动创建mapping

前面也提到过关于手动创建mapping,接着上一篇关于object类型存储以及mapping的介绍,我们接下来就介绍下如何手动创建mapping #手动创建mapping PUT /lib6 { "settings":{ "number_of_shards" : 3, "number_of_replicas" : 0 }, "mappings":{ "b...

ywl470812087的博客 11万+

Elasticsearch-6.x 倒排索引,doc_values,Fielddata, store研究

一.倒排索引 倒排索引的概念,感兴趣的可以点击查看&lt;&lt;ES权威指南中关于倒排索引的解释&gt;&gt; 也可以查看elasticsearch简介和倒排序索引介绍这篇文章,写的很清晰。 1.1 字段和倒排索引的关系 首先,在es中,我们可以把一个doc(文档)理解为数据库中的一行数据,每个doc对应多个field(字段),例如: PUT /employee/group/1 {...

灵翼的专栏 1311

【联邦学习】联邦平均(FedAvg)_附pytorch代码实现

其他代码包括1)数据集划分;2)训练;3)保存结果;4)绘图都可在 https://github.com/kt4ngw/fedavg-pytorch 找到。如果您对文章有建议及指定,也欢迎您留言评论,作者定当虚心修正。

kt4ngw的博客 5117

Elasticsearch 中映射参数doc_values 和 fielddata分析比较

默认情况下,大部分字段是索引的,这样让这些字段可被搜索。倒排索引(inverted index)允许查询请求在词项列表中查找搜索项(search term),并立即获得包含该词项的文档列表。倒排索引(inverted index):如果我们想要获得所有包含 brown 的文档的词的完整列表,我们会创建如下查询:},"aggs" : {倒排索引是根据词项来排序的,所以我们首先在词项列表中找到 brown,然后扫描所有列,找到包含 brown 的文档。

大叶子不小的博客 2072

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

ESP-01S获取网络时间踩坑全记录:AT指令调试、JSON解析乱码、时区处理,一个都不能少

本文详细记录了使用ESP-01S WIFI模块获取网络时间的完整过程,包括AT指令调试、JSON解析乱码处理以及时区转换等关键步骤。通过实战案例和代码示例,帮助开发者避开常见陷阱,实现稳定的网络时间同步功能。

weixin_30460489的博客 295

ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍

ES底层使用 Lucene 存储数据,Lucene 的索引包含以下部分:其中:inverted index:倒排索引。bkd tree: Block k-d tree,用于在高维空间内做索引,如地理坐标的索引。column store:doc values,列式存储,批量读取连续的数据以提高排序和聚合的效率。document store:Store Fileds,行式存储文档,用于控制 doc 原始数据的存储,其中占比最大的是 source 字段。

大叶子不小的博客 1225

流式数据湖存储技术,Apache Paimon是什么?

是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。Paimon 采用开放的数据格式和技术理念,可以与 Apache Flink / Spark / Trino 等诸多业界主流计算引擎进行对接,共同推进 Streaming Lakehouse 架构的普及和发展。

一个写湿的程序猿 2万+

Elasticsearch:inverted index,doc_values 及 source

inverted index 如果不想为字段建立inverted index,可以通过mapping对user进行如下设置 "user": { "type": "object", "enabled": false } 这个字段将不被建立索引,同时也不会建立 doc values。这个字段将不能被用于搜索和做聚合。如果使用这个字段进行搜索的话,不会产生任何的结果。 如果对这个文档进行查询,会查询到信息 GET twitter/_doc/1 显然 user 的信息是存放于 source 里的,只

留不住斜阳的博客 424

科研党必备:用MATLAB批量处理.mat文件数据的3种高效方法

本文为科研人员提供了使用MATLAB批量处理.mat文件数据的三种高效方法,涵盖智能数据加载、专业可视化与自动化报告生成。通过构建自动化框架、多维度数据画图策略及批量处理流程,帮助用户显著提升数据处理效率与图表专业性,解决海量实验数据的管理与分析难题。

weixin_29089057的博客 75

Geant4 案例分析(一): B1

本文是对Geant4 B1的案例分析,其中特定的功能不做介绍,而注重于各个文件的主要功能,以及它们组织的方式。

m0_51809467的博客 1583

ElasticSearch中doc values和fielddata

一 为什么聚合排序不适合使用倒排序索引 假设现在有以下的一个搜索: POST /ecommerce/music/_search {    "size":0,    "query":{        "match":{            "desc":"吉他"         }     },    "aggs":{        "brands":{

happy19870612's blog 1万+

最全教程cadence建立个人CIS数据库

此时如果你删除office365,再装Access数据库,可以安装上,然后你再装office365,系统又会把Access软件给你删除掉,因为冲突了。可以在自己的电脑上新建CIS库,主要包含下面几个内容:数据库文件,原理图封装,PCB封装,数据手册,另外建议做一个器件命名的说明。allegro在调用封装的时候,是看的.psm文件,而不是.dra文件,因此只要是c0402.psm,那么所有的内容都要保持一致。(1)文件夹不要有中文,不要有空格,否则无法识别,可以参考博主的方式,全部使用英文输入法下划线。

D_Katter的博客 255

ES概念区分

source&store (1):_source默认是打开的,将原始文档以JSON的形式存储在_source字段中,在lucene中_source只是一个字段,即在一个字段中存储了一个文档中所有字段的值。_source是es层面的设置,相当于给lucene多加了一个字段用于存储整个原始文档的值。 (2):字段中的store属性默认是false,即为不存储该字段;如果该字段的store属性设置为true,则在lucene中该字段的值被单独存储。 从以上可知,_source字段和字段属性stor.

weixin_40809179的博客 1735

高斯过程的数学理解

G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

gongdiwudu的专栏 3611

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

搜索服务内存优化实战:从原理到Elasticsearch性能调优

在分布式系统与大数据处理领域,内存管理是保障服务稳定性的核心技术。其原理涉及JVM堆内外内存分配、垃圾回收机制以及数据结构的内存驻留。有效的内存优化能显著提升系统吞吐量、降低延迟,对高并发搜索、实时分析等场景至关重要。本文聚焦搜索服务中常见的内存瓶颈,深入剖析倒排索引、Fielddata缓存等核心组件的内存占用机制,并结合Elasticsearch的工程实践,提供从监控诊断到配置调优的完整解决方案,帮助开发者应对内存溢出与GC频繁等典型性能挑战。

weixin_29031161的博客 332

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Elasticsearch v6.6索引设置什么鬼:enabled, index, doc_values, store, _source,_all

文章目录1. 背景介绍2. ES存储–概述3. 配置项速查4. 配置项详解_all_sourceindexdoc_valuesenabledstore 1. 背景介绍 最近在使用ES搭建时序数据和日志的存储,阅读了一下ES的官方文档和博客,ES mapping里有很多设置选项,初看令人眼花缭乱,理不清楚之间的关系。这些选项设置不当,有的可能浪费存储空间,有的可能导致无法使用Aggregation,...

特仑苏专栏 2670

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Elasticsearch 内部数据结构深度解读

题记最近知识星球里几个问题都问到了 doc values、store field、fielddata 等的概念。问题1:”群主有介绍 doc value, field data, sto...

铭毅天下Elasticsearch 6550

25.ElasticSearch索引原理浅析(DocValues 和 Fielddata)

ElasticSearch使用的是倒排索引,既然是倒排索引,对应的肯定有正向索引,我们先来把这两个概念弄清楚 正向索引 正排索引表是以文档的ID为关键字,表中记录文档中每个字段的值信息,主要场景是通过查询id来把整条文档拿出来,一般mysql关系型数据库是这种方式来查询的 正排表结构如下图所示 这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护,当对I...

lm324114的专栏 672

ES应用场景及核心概念二

ES核心操作 映射详解 描述数据结构,映射到es中存储的结构等。 映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表 结构定义,或 solr中的schema。因为lucene索引文档时需要知道该如何来索引存储文档的字段。 创建映射,默认 science就是一个doc type 映射。字段名称 和字段类型。指定type 和 映射 数据。 给mapping添加字段 这些操作。 ES中支持静态映射,动态映射两种方式。 通过dynamic字段来指定mapping的动态效果..

踩踩踩从踩的博客 2173

ElasticSearch核心基础之映射

一  mapping相关的概念 1.1 映射类型 映射类型也就是我们所谓的type,一个索引可以一个或者多个类型。每一个映射类型包括: # 元数据字段:用来定义如何处理文档的元数据。元数据字段包括文档的_index字段、_type、_id、_source字段等 # 字段或者属性,每一个类型都包括一些字段 注意:相同索引,但是类型不同,而名字相同的字段的数据类型必须一致,即拥有相同的映射

happy19870612's blog 7803

【Elasticsearch】mapping设置

Mapping + field type字段类型

codedot 2407

Elastic字段映射(_source,doc_value,fileddata,index,store)

Elastic字段映射(_source,doc_value,filed_data,index,store)

赵成默 1016

elasticsearch 7.4 mapping及常见参数

elasticsearch 7.4 mapping及常见参数

liaomingwu的专栏 1708

_source,store,_all属性区别

_source: _source为原始文档。 store属性: 官方文档中解释store默认是no,我想当然的理解为该field是不会存储的,但实际查询时也能查询出来,此处有冲突。此后通过查找资料store是在_source 之外在独立存储一份,索引数据时, elasticsearch会保存一份源文档到_source ,如果文档的某一字段设置store为yes(默认为no),这时候会在_sourc...

gong_yangyang的博客 434

ES优化方案

1

m0_46598535的博客 1336
上一篇:  Flink  内存
下一篇: ElasticSearch中的field data(正排索引)
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值