Apache Lucene是Apache的一个核心开源项目,是目前最好的搜索框架。扩展性强,支持全文检索,各种各样的数据结构,支持不同的查询需求。

目前使用Apache Lucene最好的两款开源软件:

  • Apache solr,Apache 旗下的开源搜索引擎,支持各种数据格式的检索(json、pdf、csv等),实时性较差
  • Elasticsearch,目前最火的开源搜索引擎,实时性强,扩展性强。

如果说Elasticsearch和solr是超跑,那Lucene可以说是汽车的发动机。

以下是Lucene官方自夸:

  • Scalable, High-Performance Indexing
  • Powerful, Accurate and Efficient Search Algorithms

本文解析Lucene基于Lucene7.2.1,也会带一些以前的版本。

#基本概念
#Index(索引)
Lucene中的index是由很多个Documents组成的一个数据体,可以理解成是数据库中的表,而表中的行就是Document。Lucene中数据即索引的概念跟普通关系型数据库还是有很大区别的。它是把数据按照不同的索引方式全部索引起来,用来进行检索。

#Document(文档)
就像上面提到的,可以理解成为数据库的行,或者mongo中的Document。一个index下有很多Documents,每个Document会有一个DocId。

#Field(字段)
可以理解成数据库行中的字段,一个Document包含至少一个Field。Lucene提供多种不同类型的Field,例如StringField、TextField、LongFiled或NumericDocValuesField等,Lucene内部会根据Field的类型(FieldType)来判断该数据要采用哪种类型的索引方式(Invert Index、Store Field、DocValues或N-dimensional等),关于Field和FieldType后面会再细说。

#Term和Term Dictionary
Lucene最小的索引单位,一个Field至少由一个Term组成。如果对Field内容进行分词,则每个分词结果都是一个term。
Term Dictionary即Term词典,是根据条件查找Term的基本索引。

#Segment
索引文件,一个index至少由一个Segment组成,并且一般情况下一个index下包含很多的Segments。Segment是提供对外检索的索引文件。所有数据最终都会形成Segment,来提供搜索功能。每个Segment都是独立的,并且一旦形成不可修改。

Lucene接收到数据后,会在缓存中生成索引,然后每隔一段时间从缓存中flush成Segment,这个时候的Segment才可以被检索。所以Lucene是near real time。

这里需要注意一点就是Lucene是不支持对已经形成Segment的数据进行update的,但是可以delete。所以Lucene中的所有update实际上都是delete+index。

#DocId
每个Document都会有一个唯一的DocId,这个不难理解,但是有几点要也别注意:

  • DocId唯一并不是全局的,而是在一个Segment文件之内是唯一的。但这并不意味着不同Segment之间的DocId会重复,你可以理解成 Segment-1 下DocId是1~100,Segment-2 下的DocId是100~200。
  • DocId有顺序,但不连续。
  • DocId可能会发生变化(发生merge)

DocId采用一个从0开始底层的Int32值,并且在查询时引入了SkipList等数据结构。这些后续会介绍。

#索引类型
上面介绍了不同类型字段会使用不同类型的索引方式,这里首先介绍字段类型的几个重要属性:

  • stored,存储着Document原文信息。可以选择禁用该字段,但这样查询结果可能会不包含Document全部信息。

  • tokenized,分词。如果对Field做分词,则每个分词结果会作为一个term进入倒排索引,如果不对Field分词,则Field_value(字段值)会作为一个term进入倒排。

  • termVector,保存一个Document内所有terms的信息,包括term值、出现次数(frequencies)以及位置(positions)等。开启termVector的作用主要有两个:关键词高亮和相似度匹配。

  • omitNorms,相关性计算系数,虽然每个字段只占一个字节,但每个文档都会单独存储,并且它是要加载到内存的,所以合理使用,避免浪费资源。

  • indexOptions,倒排索引中选择存储的参数:
    – NONE:什么都不存
    – DOCS:只存储DocId
    – DOCS_AND_FREQS:存储DocId和词频(Term Freq)
    – DOCS_AND_FREQS_AND_POSITIONS:存储doc_id、词频(Term Freq)和位置
    – DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS:存储doc_id、词频(Term Freq)、位置和偏移(offset)

  • docValuesType,DocValue是Lucene 4.0引入的正排索引,类似传统关系型数据库的索引,采用列式存储。主要是针对需要聚合,排序的Field。

  • dimension,Lucene支持多维数据的索引,一般应用场景是地理位置经纬度索引,用的不多。

这里拿Lucene关于字符串类型字段的举例:

参考源码地址:
https://github.com/apache/lucene-solr/blob/1d85cd783863f75cea133fb9c452302214165a4d/lucene/core/src/java/org/apache/lucene/document/StringField.java

public final class StringField extends Field {/** Indexed, not tokenized, omits norms, indexes*  DOCS_ONLY, not stored. */public static final FieldType TYPE_NOT_STORED = new FieldType();/** Indexed, not tokenized, omits norms, indexes*  DOCS_ONLY, stored */public static final FieldType TYPE_STORED = new FieldType();static {TYPE_NOT_STORED.setOmitNorms(true);TYPE_NOT_STORED.setIndexOptions(IndexOptions.DOCS);TYPE_NOT_STORED.setTokenized(false);TYPE_NOT_STORED.freeze();TYPE_STORED.setOmitNorms(true);TYPE_STORED.setIndexOptions(IndexOptions.DOCS);TYPE_STORED.setStored(true);TYPE_STORED.setTokenized(false);TYPE_STORED.freeze();}

可以看到对于string类型有两种定义:TYPE_NOT_STORED和TYPE_STORED。区别是一个存储原文一个不存原文。并且可以看出omitNorms为true,tokenized为falsezongjie
#总结
本文作为深入了解Lucene系列博客开篇,主要介绍了Lucene中的一些基本概念。


更多文章关注公众号

更多:Elasticsearch深入理解专栏
——————————————————————————————————
作者:桃花惜春风
转载请标明出处,原文地址:
https://blog.csdn.net/xiaoyu_BD/article/details/82715652
如果感觉本文对您有帮助,您的支持是我坚持写作最大的动力,谢谢!

Lucene原理(一):基本概念相关推荐

  1. lucene原理讲解

    1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用 ...

  2. Lucene 原理与代码分析完整版

    原文地址为: Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新. 完整版pdf可由以下链接下载. Lucene 原理与代码分析完整版 ...

  3. Lucene原理与代码分析(高手博客备忘)

    2019独角兽企业重金招聘Python工程师标准>>> 随笔 - 69  文章 - 77  评论 - 687 随笔分类 - Lucene原理与代码分析 Lucene 4.X 倒排索引 ...

  4. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  5. 建矩阵力学奠基新量子论 不确定原理颠覆经典概念|量子群英传

    建矩阵力学奠基新量子论 不确定原理颠覆经典概念|量子群英传 "大师之师"索末菲是旧量子论的最后守卫者,他在慕尼黑大学的"理论物理摇篮",却摇出了海森堡这位新量子 ...

  6. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库. 那么什么是全文检索,为什么需要全文检索? 目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结 ...

  7. 人脸支付技术原理和基本概念介绍

    https://www.toutiao.com/a6697925553745297923/ 2019-06-02 21:31:57 从2015年,马云在德国展示人脸支付技术以来,经过几年发展,人脸支付 ...

  8. 翻译: 漫画HTTPS原理四 解析概念HTTPS、SSL、TLS

    漫画HTTPS原理五部曲 翻译: 漫画HTTPS原理一 为什么我们需要HTTPS 翻译: 漫画HTTPS原理二 了解对称和非对称加密 翻译: 漫画HTTPS原理三 浏览器和互联网之间的秘密握手 翻译: ...

  9. 白话Lucene原理

    前言 在日常开发中,我们经常遇到问题就会找度娘和谷歌,只要输入相关的关键字立马检索出相关的文档,我便可以参见相关的文档学习和了解自己想要的知识,这种强大的搜素功能是屡试不爽啊.这个强大的搜素功能就是靠 ...

最新文章

  1. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  2. 2015年二级c语言真题及答案,2015年计算机二级C语言测试题及答案(4)
  3. 030_SpringBoot全局属性配置文件
  4. php与java的关系_PHP基本语法以及和Java的区别
  5. Magento--修改已存在的订单的运费
  6. Qt 4.7.1 和 Mobility 1.1.0 已发布
  7. c# 智能升级程序代码(2)
  8. python好用 appium fiddler_python3 爬虫实战:mitmproxy 对接 python 下载抖音小视频
  9. qt 不允许 dllimport 静态数据成员 的定义_C++类和对象的定义
  10. 官方实力榜:绿军居首黄蜂第二 火箭小降雄鹿飙升
  11. 中国计划建设自己的卫星导航系统
  12. window10+cuda+cudnn下载
  13. ThoughtWorks面试篇
  14. 如何判断一个文件是否是jpeg格式?
  15. 使用accton进行进程会计处理
  16. 恢复SVN的Replacing操作
  17. 阿里Apsara Clouder专项技能认证:实现调用API接口——笔记
  18. 新手程序员如何快速成长?
  19. 谈一谈第一代5G手机的射频设计
  20. 《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q13)

热门文章

  1. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
  2. [转帖]戳穿优化Windows XP的N个经典谣言
  3. 2022年信息学奥赛CPS-JS各地分数线汇总
  4. 利用普通充电器给三星平板电脑充电的改造
  5. 灰度数据表示(为什么要除255)
  6. 受疫情影响,企业异地办公,如何实现团队协同?
  7. Error mounting /dev/sda2 at /media/mk90/F: Command-line `mount -t ntfs -o
  8. html炫光字体代码,css文字特效-冰冻文字(带炫光)
  9. 安卓权限Manifest.permission
  10. 淘宝视觉装修设计要点有哪些?