zoukankan      html  css  js  c++  java
  • Lucene 源码分析之倒排索引(一)

    倒排索引是 Lucene 的核心数据结构,该系列文章将从源码层面(源码版本:Lucene-7.3.0)分析。该系列文章将以如下的思路展开。

    1. 什么是倒排索引?
    2. 如何定位 Lucene 中的倒排索引?
    3. 倒排索引是如何搜索的?
    4. 倒排索引是如何增删改的?

    本文将介绍什么是倒排索引。

    了解什么是倒排索引,其实是去了解为什么要有倒排索引。考虑这样一种场景,给你很多篇文档,现在要求找出包含指定单词的文档。第一种解决方案,遍历所有文档,自然能得到结果。第二种解决方案,遍历所有文档,得到结果后记录下来,下次再有这种请求时直接读取结果。如果把所有单词的结果都记录下来,之后的任何请求都能直接从结果中读取,这个结果的集合就叫做倒排索引。

    以两个文档为例:

    1.hello world!
    2.hello china!
    

    如何找出包含 china 的文档?一眼扫过去就知道是第 2 个文档(但在文档数量很多内容很大的情况下,可能需要很多眼)。

    但如果将所有结果(即倒排索引)提前记录如下。

    单词 文档
    hello 1,2
    world 1
    china 2

    让你找出包含 china 的文档。不需要再去扫文档,根据倒排索引可知是第 2 个文档(在文档数量很多内容很大的情况下,能极大地提升效率)。

    有些同学会问,两种解决方案都要去遍历文档,为什么采用第二种解决方案?因为后者只需要遍历一次,以后每次查询的时候直接查询倒排索引即可。

    有些同学会问,如果采用第二种解决方案,当增删改文档的时候,倒排索引文件就不对了,那还是得重新遍历一次?不需要,将增删改文档转换为增删改倒排索引即可。

    有些同学会问,增删改倒排索引的性能会不会很差?这个答案会在后面的文章中给出。而这也成为 Lucene 不断优化的目标之一。

  • 相关阅读:
    《数据结构与算法之美》03——数组
    设计模式系列三-代理模式
    Docker系列2-image详解
    docker系列2-centos7下安装docker
    docker系列1-简介
    idea设置JDK无效
    java引用传递还是值传递问题解析
    MySQL优化系列4-全文索引
    MySQL优化系列3-存储引擎
    Redis深入解析系列:分布式锁详解
  • 原文地址:https://www.cnblogs.com/studyhs/p/9088048.html
Copyright © 2011-2022 走看看