elastcisearch 倒排索引
时间: 2023-05-10 11:49:47 浏览: 91
Elasticsearch是一个流行的分布式搜索引擎,它基于倒排索引(inverted index)进行搜索。倒排索引是一种用于搜索的数据结构,它记录每个单词在哪些文档出现过。我们可以将倒排索引看作是一个颠倒过来的字典,以单词为key,以该单词所在的文档集合为value。每个文档由一个文档id标识。
在ES中,倒排索引由一个叫做Lucene的开源工具库维护。当我们创建一个索引时,需要指定一个或多个field(字段)。ES将这些field中的每个单词都进行分词(tokenizer),然后将分得的词项(term)保存到倒排索引中。在现代搜索引擎中,一般会先将文本进行标准化(normalization)处理,例如将大写字母转换成小写、去除标点符号、去除停用词等,以方便进行匹配。
例如,我们有以下两个文档:
Doc1: "I like to eat apples."
Doc2: "I like to eat bananas."
在建立索引之前,我们需要指定field,比如这里我们将文档内容保存到body字段中。ES会对每个文档进行分词,分得的词项如下:
Doc1: {"I", "like", "to", "eat", "apples"}
Doc2: {"I", "like", "to", "eat", "bananas"}
然后ES会将这些term依次加入到倒排索引中,每次加入都要记录该term在哪个文档(doc1或doc2)中出现过。因此,倒排索引会保存如下映射关系:
- "i" -> [Doc1, Doc2]
- "like" -> [Doc1, Doc2]
- "to" -> [Doc1, Doc2]
- "eat" -> [Doc1, Doc2]
- "apples" -> [Doc1]
- "bananas" -> [Doc2]
在查询时,我们输入一个查询语句,ES会将其分词生成term,然后根据倒排索引找到文档集合,计算相关度得分,最后返回相关的文档。例如,查询语句为“like bananas”,分词后得到term为{"like", "bananas"},我们在倒排索引中找到这两个term所在的文档集合:
- "like" -> [Doc1, Doc2]
- "bananas" -> [Doc2]
这两个集合的交集为[Doc2],因此最终返回的是文档2,即“我喜欢吃香蕉。”
总之,倒排索引是ES中非常重要的组成部分,它提供了高效的文本检索和搜索引擎的核心功能。