商丘市做网站的公司,网站改版重新备案,微信商城小程序平台,什么是网络营销?与电商营销有什么区别?在 Elasticsearch 中#xff0c;mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问#xff0c;为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题#xff0c;并引入列式存储的概念#xff0c;帮助大家更好地理解 Elasticsearch 的存储和查… 在 Elasticsearch 中mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题并引入列式存储的概念帮助大家更好地理解 Elasticsearch 的存储和查询机制。 1、问题描述 我们创建了一个名为 my-index-000001 的索引并为其添加了一个名为 employee-id 的字段该字段的 index 属性被设置为 false。 按理说这个字段不应该被索引也不应能被检索但在执行查询时却能检索到该字段。这是为什么呢 PUT /my-index-000001
{mappings: {properties: {employee-id: {type: keyword,index: false}}}
}POST /my-index-000001/_doc/1
{employee-id: 1111
}POST /my-index-000001/_search
{query: {term: {employee-id: 1111}}
} 问题来源https://t.zsxq.com/GuwKP 2、原因分析 在 Elasticsearch 中index 选项控制字段值是否被索引。 默认情况下所有字段都是被索引的 (index: true)。当 index 设置为 false 时字段不会被索引因此不能通过常规查询方法高效地检索该字段。 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index.html 然而对于某些特定类型的字段即使设置了 index: false它们仍然可以通过 doc_values 进行查询。 这其实就是咱们的问题所在 这些特定字段类型包括 数值类型Numeric types日期类型Date types布尔类型Boolean typeIP 类型IP type地理点类型Geo_point type关键字类型Keyword type 对于这些类型的字段即使 index 设置为 false只要 doc_values 启用它们仍然可以被查询。 查询效率会较低因为需要对整个索引进行全扫描full scan。 3、列式存储概述 列式存储Columnar Storage是指将每个字段的数据独立存储这种存储方式不同于传统的行式存储。 在数据仓库和大数据处理系统中列式存储优化了读取和分析操作。 以下是一些常见的列式存储格式及其应用 Parquet广泛用于 Apache Hadoop 生态系统中的数据处理提供高效的存储和压缩。ORCOptimized Row Columnar主要用于 Apache Hive 和 Hadoop 生态系统提供优化的列存储格式。Cassandra分布式数据库系统采用行和列的混合存储方式支持列级别的高效查询。 列式存储 VS 行式存储 在 Elasticsearch 中doc_values 是一种列式存储机制用于存储字段的数据以支持高效的排序和聚合操作。 这里就是明显区别于“倒排索引”的一种正排索引技术详细解读参见《一本书讲透 Elasticsearch》P97-P98。 Doc values 是指在文档索引时创建的存储在磁盘数据结构它们以列式存储的方式保存与 _source 相同的数据从而大大提高了排序和聚合操作的效率。除文本 text 和带注释的文本annotated_text 新类型字段外几乎所有字段类型都支持 doc values。 https://www.elastic.co/guide/en/elasticsearch/reference/current/doc-values.html 3.1 列式存储示例词组数据举例 假设我们有以下文档集合这些文档包含多个字段包括 employee-id 雇员 id 序号和 address 地址信息 [{employee-id: 1111, name: Alice, age: 30, address: 123 Main St, Springfield, IL},{employee-id: 1112, name: Bob, age: 25, address: 456 Elm St, Springfield, IL},{employee-id: 1113, name: Charlie, age: 35, address: 789 Oak St, Springfield, IL}
] 列式存储如下图所示 当这些文档被索引到 Elasticsearch 中时启用了 doc_values 的字段会以列式存储的方式独立存储。 假设我们为 employee-id、address 字段启用了 doc_values其存储结构如下 employee-id 列存储 1111
1112
1113 address 列存储 123 Main St, Springfield, IL
456 Elm St, Springfield, IL
789 Oak St, Springfield, IL 3.2 列式存储查询行为 回到开篇问题在这种情况下如果我们对 employee-id 进行查询 POST /my-index/_search
{profile: true, query: {term: {employee-id: 1111}}
} 由于 employee-id 字段启用了 doc_values但没有被索引Elasticsearch 会使用基于 doc_values 的查询机制来处理。 这个查询会遍历 employee-id 列的数据找到匹配 1111 的文档。 这里就分析出了 index:false, 依然可以被检索的原因。 再进一步验证 PUT /my-index-0606
{mappings: {properties: {employee-id: {type: keyword,doc_values: true},name: {type: text},age: {type: integer,doc_values: true},address: {type: keyword,index:false}}}
}POST /my-index-0606/_bulk
{ index: { _id: 1 } }
{ employee-id: 1111, name: Alice, age: 30, address: 123 Main St, Springfield, IL }
{ index: { _id: 2 } }
{ employee-id: 1112, name: Bob, age: 25, address: 456 Elm St, Springfield, IL }
{ index: { _id: 3 } }
{ employee-id: 1113, name: Charlie, age: 35, address: 789 Oak St, Springfield, IL }POST my-index-0606/_search
{query: {term: {address: 123 Main St, Springfield, IL}}
} 得到结果如下 这就是基于正排索引做的轮询的结果。 3.3 列式存储的优势和劣势 优势 列式存储使得对特定字段的聚合和排序操作更加高效因为只需要读取相关列的数据而不是整个文档的所有字段。 举例说明假设我们有一个包含员工信息的索引在之前基础上新增了字段文档结构如下 [{employee-id: 1111, name: Alice, age: 30, salary: 5000, address: 123 Main St, Springfield, IL},{employee-id: 1112, name: Bob, age: 25, salary: 6000, address: 456 Elm St, Springfield, IL},{employee-id: 1113, name: Charlie, age: 35, salary: 7000, address: 789 Oak St, Springfield, IL}
] 如果行式存储读取每个文档时所有字段数据都被加载即使我们只关心其中一个字段的数据。 行式存储举例——计算平均薪资时整个文档包括 name、age、address 等都要被读取。如下图所示 读取整行信息有点类似 MySQL 如下操作 SELECT * FROM employees WHERE employee-id 1111; 返回结果 {employee-id: 1111, name: Alice, age: 30, salary: 5000, address: 123 Main St, Springfield, IL} 如果列式存储只读取特定字段的数据。 列式存储举例——计算平均薪资时只需读取 salary 列的数据即可避免了读取无关字段的数据。如下图所示。 列式存储读取一列数据有点类似 MySQL如下操作 SELECT age FROM employees; 返回结果 [30, 25, 35] 劣势对于未被索引的字段查询效率较低因为需要遍历整个列的数据来匹配查询条件。 4、结论 通过这些示例我们可以更清楚地理解 Elasticsearch 中列式存储和 doc_values 的应用。 列式存储使得对特定字段的聚合和排序操作更加高效但对于未被索引的字段查询效率较低因为需要遍历整个列的数据来匹配查询条件。 希望这些解释能帮助你更好地理解 Elasticsearch 的存储和查询机制。 如果你对字段的查询和聚合有特定需求合理使用 index 和 doc_values 设置可以大大提升性能和效率。 新时代写作与互动《一本书讲透 Elasticsearch》读者群的创新之路 更短时间更快习得更多干货 和全球超2000 Elastic 爱好者一起精进 elastic6.cn——ElasticStack进阶助手 比同事抢先一步学习进阶干货