📜  倒排索引(1)

📅  最后修改于: 2023-12-03 15:07:02.138000             🧑  作者: Mango

倒排索引

简介

倒排索引(Inverted index),也称为反向索引、置入档案或反向档案等,是数据库索引技术中常用的一种类型。顾名思义,所谓倒排索引即“单词-文档”关系的映射,即通过单词可以查找到包含该单词的文档。

倒排索引最早用于全文检索,在搜索引擎的基础实现中扮演着至关重要的角色。

实现原理

倒排索引的实现原理是将文档中的所有单词建立一个索引表,每个单词在表中都对应着一个链表,链表中存储了包含该单词的文档编号以及该单词在文档中出现的位置信息。通过倒排索引可以很快地实现文档的全文检索。

下面是根据文档内容构建倒排索引的示意图:

倒排索引

倒排索引的优势在于可快速定位到包含某个单词的文档,避免了扫描所有文档的耗时操作,提高了检索效率。同时,倒排索引可以灵活处理各种查询需求,如模糊查询、近义词查询等。

示例代码

以下是一个简单的倒排索引的构建过程的示例代码:

class InvertedIndex:
    def __init__(self):
        self.index = {}

    def add_document(self, doc_id, document):
        for word in document.split():
            if word not in self.index:
                self.index[word] = [(doc_id, 1)]
            else:
                found = False
                for i, (doc, freq) in enumerate(self.index[word]):
                    if doc == doc_id:
                        self.index[word][i] = (doc_id, freq + 1)
                        found = True
                        break
                if not found:
                    self.index[word].append((doc_id, 1))

    def search(self, query):
        result = set()
        for word in query.split():
            if word in self.index:
                for doc_id, freq in self.index[word]:
                    result.add(doc_id)
        return result

使用示例:

documents = {
    1: "apple pear",
    2: "peach banana",
    3: "orange pear",
    4: "watermelon mango"
}

idx = InvertedIndex()
for doc_id, doc in documents.items():
    idx.add_document(doc_id, doc)

print(idx.search("apple pear")) # {1}
print(idx.search("pear")) # {1, 3}
print(idx.search("watermelon")) # {4}
总结

倒排索引是一种高效的全文检索技术,通过将单词与其所在文档建立映射关系,能够快速定位到包含特定单词的文档,同时可以支持各种灵活的检索需求。在实际应用中,倒排索引已成为搜索引擎的核心技术之一。