倒排索引,分片机制

目录

1. 倒排索引及其数据结构以及优缺点

1.1 倒排索引

1.2 倒排索引结构

1.3 倒排索引不可变

2. 分片、扩容以及容错机制

2.1 primary shard 和 replica shard机制

2.2 极限扩容

2.3 容错机制

1. 倒排索引及其数据结构以及优缺点

1.1 倒排索引

Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

  1. Term Doc_1 Doc_2

  2. -------------------------

  3. Quick | | X

  4. The | X |

  5. brown | X | X

  6. dog | X |

  7. dogs | | X

  8. fox | X |

  9. foxes | | X

  10. in | | X

  11. jumped | X |

  12. lazy | X | X

  13. leap | | X

  14. over | X | X

  15. quick | X |

  16. summer | | X

  17. the | X |

  18. ------------------------

现在,如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档:

  1. Term Doc_1 Doc_2

  2. -------------------------

  3. brown | X | X

  4. quick | X |

  5. ------------------------

  6. Total | 2 | 1

两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

但是,我们目前的倒排索引有一些问题:

  • Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。
  • fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。
  • jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)只有同时出现 Quick 和 fox 的文档才满足这个查询条件,但是第一个文档包含 quick fox ,第二个文档包含 Quick foxes 。

我们的用户可以合理的期望两个文档与查询匹配。我们可以做的更好。

如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。例如:

  • Quick 可以小写化为 quick 。
  • foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。
  • jumped 和 leap 是同义词,可以索引为相同的单词 jump 。

现在索引看上去像这样:

  1. Term Doc_1 Doc_2

  2. -------------------------

  3. brown | X | X

  4. dog | X | X

  5. fox | X | X

  6. in | | X

  7. jump | X | X

  8. lazy | X | X

  9. over | X | X

  10. quick | X | X

  11. summer | | X

  12. the | X | X

  13. ------------------------

这还远远不够。我们搜索 +Quick +fox 仍然 会失败,因为在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询 +quick +fox ,这样两个文档都会匹配!

1.2 倒排索引结构

(1)包含这个关键词的document list
(2)包含这个关键词的所有document的数量:IDF(inverse document frequency)
(3)这个关键词在每个document中出现的次数:TF(term frequency)
(4)这个关键词在这个document中的次序
(5)每个document的长度:length norm
(6)包含这个关键词的所有document的平均长度

1.3 倒排索引不可变

优点

(1)不需要锁,提升并发能力,避免锁的问题
(2)数据不变,一直保存在os cache中,只要cache内存足够
(3)filter cache一直驻留在内存,因为数据不变
(4)可以压缩,节省cpu和io开销

缺点

每次都要重新构建整个索引,比较繁琐。

2. 分片、扩容以及容错机制

2.1 primary shard 和 replica shard机制

(1):index包含多个shard;

(2):每个shard都是一个最小的工作单元,承载部分的数据,Lucene实例,完整的简历索引和处理请求的能力;

(3):增减节点时,shard会自动在nodes中负载均衡;

(4):primary shard和replica shard,每一个doc只会存在某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard中;

(5):replica shard是primary shard的副本,负责容错,以及承担读请求负载(通常情况可以让primary shard负责写,replica shard负责读,来实现读写分离);

(6):primary shard 的数量在创建索引的时候就固定了,replica shard的数量可以随时修改;

(7):primary shard的默认数量是5,replica shard默认是1,默认有10个shard,其中5个primary shard以及5个replica shard;

(8):primary shard和replica shard不能和自己的replica shard 放在一个节点中(这样规定是为避免节点宕机的时候,primary shard和replica shard数据都都丢失,起不到容错的作用),但是可以和其他的primary shard的replica shard放在同一个节点中;

2.2 极限扩容

性能扩容

就像上面说的primary shard 在创建的时候就已经固定了,不可以再修改。也就是说如果我在创建的时候设置了primary shard是3(6个shard,3 primary,3 replica),最多扩容到6台机器,每个shard可以占用单台服务器的所有资源,性能最好。那如果我们的超出了上面所说的扩容极限了怎么办呢?primary shard不是不能修改么?

是的,primary shard 在创建后是不能修改的,但是replica shard可以添加啊,我们可以创建9个shard(3primary,6 replica),将服务器扩容到9台机器,吞吐量会大大增加,是3台服务器的三倍,当然为了提高容错率也可以在此基础上在每台服务器上部署多个shard(primary和replica不能在同一台服务器上)

容量扩容

上述的扩容指的是性能上的扩容(即高可用),但是在实际生活中可能会面临需要内存上扩容,他的极限就是每个primary shard部署单台服务器(3个primary shard分别部署3台服务器),所以在创建的时候自己要注意创建primary shard的数量,如果内存上问题还是不能解决,那么就需要通过扩容磁盘和定期清理数据来解决内存问题了

2.3 容错机制

master node宕机后,会自动重新选举master,此时为red;
replica容错:新master是将replica提升为primary shard,此时为yellow(因为replica被升级为primary了,此时replica并不齐全);
重启宕机node,master copy replica到该node,但是该node使用原有的shard并同步宕机后的修改(即仅同步宕机后丢失的数据),此时为green;

 

转载:ElasticSearch教程——倒排索引及其数据结构以及优缺点

         ElasticSearch教程——分片、扩容以及容错机制

<think>嗯,用户让我详细解释一下倒排索引,也就是ES中的倒排索引。首先,我需要确认倒排索引的基本概念。倒排索引是什么?和正排引有什么区别呢?对了,正排引是文档到关键词的映射,而倒排索引是关键词到文档的映射,这样能快速定位包含某个词的文档。 接下来,要说明倒排索引的结构。通常包括几个部分:词典(Term Dictionary)、倒排列表(Posting List)。词典里是所有不重复的词汇,每个词对应一个倒排列表。倒排列表里可能有文档ID、词频、位置信息等等。比如在ES中,每个词项会记录出现在哪些文档,频率多少,位置在哪里,这对短语查询很重要。 然后需要讲清楚倒排索引的构建过程。比如文档如何被分析,分词、过滤停用词、标准化(比如转为小写),然后生成词项,再建立映射。这里可能需要提到分析器(Analyzer)的作用,包括字符过滤器、分词器、Token过滤器。 还要比较倒排索引的优势,比如高效的全文搜,快速查找包含特定词项的文档,支持布尔查询、短语查询、模糊查询等。但也要提到它的缺点,比如占用存储空间,更新成本高,特别是实时性要求高的时候,可能需要额外的处理。 然后,结合Elasticsearch的具体实现,可以讲一下ES如何优化倒排索引,比如使用FST(Finite State Transducer)来压缩词典,节省内存;倒排列表用Skip List或者Roaring Bitmaps来优化联合查询的效率。此外,ES的分片机制如何影响引的分布和查询。 还要考虑用户可能的疑问,比如为什么倒排索引适合全文搜,和关系型数据库的B树引有什么不同。这时候可以解释倒排索引针对文本搜优化,而B树更适合范围查询和精确匹配。 可能用户是开发者,需要了解如何在实际应用中使用ES的倒排索引,所以可以提一下映射(Mapping)的设置,比如是否需要分词,是否存储词向量等。或者如何通过配置分析器来优化搜效果,比如加入同义词过滤、停用词过滤等。 另外,倒排索引在搜时的流程,比如如何解析查询语句,分词后查找各个词项的倒排列表,进行合并(AND/OR操作),计算相关性打分,最后返回结果。这里可以提到TF-IDF或者BM25算法在打分中的应用。 还需要注意一些细节,比如ES的倒排索引是不可变的,更新时会生成新段,然后定期合并,这样设计的好处和潜在问题。比如查询效率高,因为不需要锁,但写入吞吐量可能受影响,需要Merge操作来优化。 有没有遗漏的部分呢?比如倒排索引如何处理动态更新?ES的实时性通过什么机制保证?比如使用translog和refresh间隔,每1秒生成新的segment,使数据可被搜,但尚未持久化,直到flush操作。 或者举例说明倒排索引的应用场景,比如日志分析、电商搜、文档检等,说明其适用性。 可能用户还想知道倒排索引和其他数据结构结合使用的情况,比如结合正排引(Doc Values)来处理聚合和排序,因为倒排索引本身不适合做这些操作,而ES使用列式存储来优化。 总结的时候需要分点清晰,结构明确,确保用户能够逐步理解倒排索引的原理、结构、构建过程、优缺点,以及在ES中的具体实现和优化手段。同时要注意使用中文,LaTeX公式的正确格式,行内公式用$包围,独立公式用$$,虽然当前问题可能不需要太多公式,但如果有数学表达比如TF-IDF公式的话需要处理。不过在这个问题中可能不太涉及,但需要保持警惕。 最后检查是否符合系统级指令,比如结构是否清晰,分点是否明确,语言是否准确,没有使用Markdown,正确使用LaTeX格式。例如,如果有提到TF-IDF公式的话,应该写成:TF-IDF的计算公式为 $w_{t,d} = \text{tf}_{t,d} \times \log\left(\frac{N}{\text{df}_t}\right)$,其中... 但当前问题可能不需要,所以可能不需要插入公式。但需要确保如果出现的话格式正确。 总之,整理这些思路,分步骤详细解释倒排索引,确保用户能理解其工作原理和在ES中的应用。</think>以下是对 **倒排索引(Inverted Index)** 的详细解析,结合 Elasticsearch(ES)的实现说明: --- ### 一、倒排索引的定义 倒排索引是**面向词项(Term)**的引结构,核心思想是将文档中的内容转换为“词项 → 文档”的映射关系。与正排引(文档 → 词项)相反,倒排索引通过词项快速定位包含该词项的文档。 --- ### 二、倒排索引的组成 1. **词典(Term Dictionary)** 存储所有**唯一词项**,通常按字典序排列,便于快速查找(如二分查找、跳表)。 2. **倒排列表(Posting List)** 每个词项对应一个倒排列表,包含: - **文档 ID**:包含该词项的文档标识。 - **词频(Term Frequency, TF)**:词项在文档中出现的次数。 - **位置信息(Position)**:词项在文档中的具体位置(用于短语查询)。 - **偏移量(Offset)**:词项在文档中的起止字符位置。 --- ### 三、倒排索引的构建流程 1. **文档分析(Analysis)** - 使用**分析器(Analyzer)**对文本处理: 1. **字符过滤**:去除 HTML 标签、特殊符号。 2. **分词(Tokenization)**:按规则切分文本(如按空格、标点)。 3. **标准化(Normalization)**:转为小写、词干提取(如 `running` → `run`)、过滤停用词(如 `the`, `a`)。 2. **生成词项** 处理后的词项加入词典,并记录其所在文档的元数据。 3. **引写入** 将词项与文档的映射关系持久化到磁盘。 --- ### 四、倒排索引的查询过程 1. **解析查询语句**:如搜 `"quick brown fox"`。 2. **词项分析**:拆分为 `quick`、`brown`、`fox`,并标准化。 3. **查找倒排列表**:从词典中找到每个词项对应的倒排列表。 4. **合并结果**: - **布尔查询**:如 `AND` 操作需取文档 ID 的交集。 - **短语查询**:需验证词项位置是否连续。 5. **相关性评分**:使用算法(如 BM25)计算文档与查询的相关性。 --- ### 五、Elasticsearch 中的优化 1. **词典压缩** - 使用 **FST(Finite State Transducer)** 压缩词典,减少内存占用。 2. **倒排列表优化** - **Roaring Bitmaps**:高效压缩文档 ID 集合,加速 `AND/OR` 操作。 - **Skip List**:快速跳过不匹配的文档。 3. **分片(Shard)机制** 将引划分为多个分片,分布到不同节点,实现并行查询与水平扩展。 --- ### 六、倒排索引的优缺点 | **优点** | **缺点** | |------------------------------|-----------------------------------| | 快速全文搜 | 占用存储空间较大 | | 支持复杂查询(短语、模糊等) | 更新成本高(需重建引或增量更新)| | 适合高并发读场景 | 实时性受刷新间隔限制 | --- ### 七、应用场景 1. **全文搜引擎**:如 Elasticsearch、Solr。 2. **日志分析**:快速检日志关键词。 3. **电商平台**:商品标题、描述的搜。 --- ### 八、示例 假设有以下两个文档: - Doc1: `The quick brown fox.` - Doc2: `A fox jumps over the lazy dog.` 倒排索引结构如下: ``` Term | Posting List ----------------------------- quick → [Doc1 (TF:1, Pos:1)] brown → [Doc1 (TF:1, Pos:2)] fox → [Doc1 (TF:1, Pos:3), Doc2 (TF:1, Pos:2)] ... ``` --- 通过倒排索引,Elasticsearch 实现了高效的文本搜能力,适用于海量数据的实时检场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值