[{"data":1,"prerenderedAt":326},["ShallowReactive",2],{"blog:\u002Fblog\u002F2021\u002F09\u002F24\u002Finverted-index\u002F":3},{"id":4,"title":5,"body":6,"categories":311,"comments":313,"date":314,"description":315,"draft":316,"extension":317,"legacySlug":318,"meta":319,"navigation":313,"path":320,"seo":321,"stem":322,"tags":323,"updated":324,"__hash__":325},"blog\u002Fblog\u002F2021\u002F09\u002F24\u002Finverted-index.md","ES：底层实现-倒排索引",{"type":7,"value":8,"toc":300},"minimark",[9,18,23,59,62,65,80,83,103,106,221,224,227,247,251,271,274,277,291,294,297],[10,11,12,13,17],"p",{},"倒排索引（",[14,15,16],"strong",{},"Inverted Index","）是 Elasticsearch 及其他全文搜索引擎的核心数据结构，用于高效地进行全文检索。它将文档中的内容映射到文档的位置，类似于书中词表索引，可以快速找到某个词在哪些章节中出现过。",[19,20,22],"h3",{"id":21},"倒排索引正排索引","倒排索引&正排索引",[24,25,26,42],"ul",{},[27,28,29,32,33,37,38,41],"li",{},[14,30,31],{},"倒排","：即",[34,35,36],"code",{},"词项","=>",[34,39,40],{},"包含当前词项的doc_id的列表","的映射。倒排索引的优势是可以快速查找包含某个词项的文档有哪些。如果用倒排来确定哪些文档中是否包含某个词项就很鸡肋。",[27,43,44,32,47,37,50,53,54],{},[14,45,46],{},"正排",[34,48,49],{},"doc_id",[34,51,52],{},"当前文档包含的所有词项","的映射。正排索引的优势在于可以快速的查找某个文档里包含哪些词项。同理，正排不适用于查找包含某个词项的文档有哪些。\n",[55,56],"img",{"alt":57,"src":58},"inverted-index.jpg","\u002Fblog-assets\u002Finverted-index\u002Finverted-index.jpg",[19,60,61],{"id":61},"倒排索引的组成",[10,63,64],{},"倒排索引由以下两部分组成：",[66,67,68,74],"ol",{},[27,69,70,73],{},[14,71,72],{},"词典（Term Dictionary）","：存储所有在索引中出现的词。",[27,75,76,79],{},[14,77,78],{},"倒排列表（Posting List）","：对于每个词，记录该词在哪些文档中出现，以及它在文档中的位置。",[10,81,82],{},"举个例子，假设我们有以下三个文档：",[24,84,85,91,97],{},[27,86,87,88],{},"文档1：",[34,89,90],{},"\"Elasticsearch 是一个搜索引擎\"",[27,92,93,94],{},"文档2：",[34,95,96],{},"\"搜索引擎 基于 Lucene\"",[27,98,99,100],{},"文档3：",[34,101,102],{},"\"Elasticsearch 使用倒排索引\"",[10,104,105],{},"倒排索引生成的结果可能如下：",[107,108,109,125],"table",{},[110,111,112],"thead",{},[113,114,115,119,122],"tr",{},[116,117,118],"th",{},"词语",[116,120,121],{},"文档ID",[116,123,124],{},"出现位置",[126,127,128,140,151,161,172,182,192,202,212],"tbody",{},[113,129,130,134,137],{},[131,132,133],"td",{},"Elasticsearch",[131,135,136],{},"文档1, 文档3",[131,138,139],{},"1, 1",[113,141,142,145,148],{},[131,143,144],{},"是",[131,146,147],{},"文档1",[131,149,150],{},"2",[113,152,153,156,158],{},[131,154,155],{},"一个",[131,157,147],{},[131,159,160],{},"3",[113,162,163,166,169],{},[131,164,165],{},"搜索",[131,167,168],{},"文档1, 文档2",[131,170,171],{},"4, 1",[113,173,174,177,179],{},[131,175,176],{},"引擎",[131,178,168],{},[131,180,181],{},"5, 2",[113,183,184,187,190],{},[131,185,186],{},"基于",[131,188,189],{},"文档2",[131,191,160],{},[113,193,194,197,199],{},[131,195,196],{},"Lucene",[131,198,189],{},[131,200,201],{},"4",[113,203,204,207,210],{},[131,205,206],{},"使用",[131,208,209],{},"文档3",[131,211,150],{},[113,213,214,217,219],{},[131,215,216],{},"倒排索引",[131,218,209],{},[131,220,160],{},[10,222,223],{},"在此例中，当你搜索“搜索引擎”时，Elasticsearch 可以直接在倒排索引中查找这两个词的倒排列表，然后找出它们同时出现在哪些文档中，并返回文档1和文档2。",[19,225,226],{"id":226},"倒排索引的优点",[24,228,229,235,241],{},[27,230,231,234],{},[14,232,233],{},"高效的搜索","：倒排索引使得全文检索非常高效，因为它直接按词存储，并能快速查找某个词在哪些文档中出现。",[27,236,237,240],{},[14,238,239],{},"支持布尔查询","：通过倒排索引，可以轻松实现布尔查询，例如“词A AND 词B”，或者“词A OR 词B”等。",[27,242,243,246],{},[14,244,245],{},"支持词频和位置","：倒排索引不仅记录词在哪些文档中出现，还记录词在文档中的具体位置（位置向量），这对于短语匹配和相似度计算非常重要。",[19,248,250],{"id":249},"elasticsearch-如何使用倒排索引","Elasticsearch 如何使用倒排索引",[66,252,253,259,265],{},[27,254,255,258],{},[14,256,257],{},"文档分词","：当文档被索引时，Elasticsearch 会使用分词器（Analyzer）将文档的文本内容切分成单词（词条，Token）。",[27,260,261,264],{},[14,262,263],{},"词条映射到文档","：Elasticsearch 将每个词条加入倒排索引，并记录该词条在哪些文档中出现。",[27,266,267,270],{},[14,268,269],{},"查询过程","：当用户发起搜索请求时，Elasticsearch 使用倒排索引快速找到相关文档，并根据词频、位置等信息进行评分，返回最相关的结果。",[19,272,273],{"id":273},"实际应用",[10,275,276],{},"在大规模文本搜索场景中，倒排索引是关键的技术基础，例如：",[24,278,279,285],{},[27,280,281,284],{},[14,282,283],{},"全文搜索","：搜索引擎通过倒排索引快速定位关键词所在的文档。",[27,286,287,290],{},[14,288,289],{},"日志分析","：如 ELK（Elasticsearch、Logstash、Kibana）体系中，Elasticsearch 可以通过倒排索引在大量日志中迅速定位关键字或模式。",[19,292,293],{"id":293},"优化与挑战",[10,295,296],{},"虽然倒排索引对于搜索很高效，但它在处理非常高频率的词（如“the”）时可能会导致索引膨胀，因此 Elasticsearch 采用了不同的技术（如压缩算法）来优化索引的大小和访问速度。",[10,298,299],{},"倒排索引是理解 Elasticsearch 搜索效率的核心概念，在处理大规模数据的搜索需求时，倒排索引结构能显著提升性能。",{"title":301,"searchDepth":302,"depth":302,"links":303},"",2,[304,306,307,308,309,310],{"id":21,"depth":305,"text":22},3,{"id":61,"depth":305,"text":61},{"id":226,"depth":305,"text":226},{"id":249,"depth":305,"text":250},{"id":273,"depth":305,"text":273},{"id":293,"depth":305,"text":293},[312],"ES",true,"2021-09-24","倒排索引（Inverted Index）是 Elasticsearch 及其他全文搜索引擎的核心数据结构，用于高效地进行全文检索。它将文档中的内容映射到文档的位置，类似于书中词表索引，可以快速找到某个词在哪些章节中出现过。 倒排索引&正排索引 倒排：即词项=>包含当前词项的docid的列表的映射。倒",false,"md","inverted-index",{},"\u002Fblog\u002F2021\u002F09\u002F24\u002Finverted-index",{"title":5,"description":315},"blog\u002F2021\u002F09\u002F24\u002Finverted-index",[312],null,"S5BOaZWL9JqsEnJLEDJL_BnAwgdMm8uiTmYhrE0gBn0",1783807996339]