倒排索引是 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 不断优化的目标之一。

Lucene 源码分析之倒排索引(一)的更多相关文章

  1. Lucene 源码分析之倒排索引(三)

    上文找到了 collect(-) 方法,其形参就是匹配的文档 Id,根据代码上下文,其中 doc 是由 iterator.nextDoc() 获得的,那 DefaultBulkScorer.itera ...

  2. Lucene 源码分析之倒排索引(二)

    本文以及后面几篇文章将讲解如何定位 Lucene 中的倒排索引.内容很多,唯有静下心才能跟着思路遨游. 我们可以思考一下,哪个步骤与倒排索引有关,很容易想到检索文档一定是要查询倒排列表的,那么就从此处 ...

  3. 一个lucene源码分析的博客

    ITpub上的一个lucene源码分析的博客,写的比较全面:http://blog.itpub.net/28624388/cid-93356-list-1/

  4. lucene源码分析的一些资料

    针对lucene6.1较新的分析:http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/conansonic/article/d ...

  5. lucene源码分析(1)基本要素

    1.源码包 core: Lucene core library analyzers-common: Analyzers for indexing content in different langua ...

  6. lucene源码分析(8)MergeScheduler

    1.使用IndexWriter.java mergeScheduler.merge(this, MergeTrigger.EXPLICIT, newMergesFound); 2.定义MergeSch ...

  7. lucene源码分析(7)Analyzer分析

    1.Analyzer的使用 Analyzer使用在IndexWriter的构造方法 /** * Constructs a new IndexWriter per the settings given ...

  8. lucene源码分析(6)Query分析

    查询的入口 /** Lower-level search API. * * <p>{@link LeafCollector#collect(int)} is called for ever ...

  9. lucene源码分析(5)lucence-group

    1. 普通查询的用法 org.apache.lucene.search.IndexSearcher public void search(Query query, Collector results) ...

随机推荐

  1. IOS开发之----全局变量extern的使用

    extern,作用在IOS中,为了使用全局变量.比写在appDelegate和定义单例方便一些: 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import &quo ...

  2. adb devices 找不到夜神模拟器解决方法

    先打开命令行窗口,输入adb devices,查看连接信息,大致意思是sdk的adb版本与夜神的adb版本不一致,导致. C:\Users\cz9025>adb devices List of ...

  3. day01_12.字符串

    1.字符转义 在字符串中,出现一些比较特殊的字符,容易引起歧义 我们需要转义这些引起歧义的字符串 <?php $a = 'ab\\c'; //转义字符2个 \' \\ $b = 'ab\'c'; ...

  4. day03_12 缩进介绍

    python比较变态,必须缩进,而C可以不缩进,世界上只有python这门语言要求必须缩进 tab键是缩进,shift+tab往左移动 SyntaxError:invalid syntax 语法错误 ...

  5. 【转】javascript操作Select标记中options集合

    先来看看options集合的这几个方法:options.add(option)方法向集合里添加一项option对象:options.remove(index)方法移除options集合中的指定项:op ...

  6. map/set/object/array对比

    map () { //数据结构横向对比, 增,查,改,删 let map = new Map() let array = [] //增 map.set('t',1) array.push({t:1}) ...

  7. POJ——3061Subsequence(尺取法或二分查找)

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11224   Accepted: 4660 Desc ...

  8. 解决 Could not load hsdis-amd64.dll

    win10下想查看JIT编译的汇编源码 结果提示: Could not load hsdis-amd64.dll; library not loadable; PrintAssembly is dis ...

  9. Python基础教程总结(一)

    引言: 一直都听说Python很强大,以前只是浏览了一些博客,发现有点像数学建模时使用的Matlab,就没有深入去了解了.如今Python使用的地方越来越多,最近又在学习机器学习方面的知识,因此想系统 ...

  10. Python图像处理库PIL从入门到精通

    https://blog.csdn.net/column/details/pythonpil.html 示例: from PIL import Image import pytesseract pyt ...