
- 外文名
- Lucene
- 类 属
- 搜索引擎
- 开发时间
- 2000年
- 中文名
- 全文搜索引擎
- 开发人
- Doug Cutting
-
Lucene
2015-04-30 11:52:13 -
LUCENE
2016-07-08 11:33:44Lucene总的来说是: 一个高效的,可扩展的,全文检索库。 全部用Java实现,无须配置。 仅支持纯文本文件的索引(Indexing)和搜索(Search)。 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程...Lucene总的来说是:
- 一个高效的,可扩展的,全文检索库。
- 全部用Java实现,无须配置。
- 仅支持纯文本文件的索引(Indexing)和搜索(Search)。
- 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。
在Lucene in action中,Lucene 的构架和过程如下图,
说明Lucene是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。
让我们更细一些看Lucene的各组件:
- 被索引的文档用Document对象表示。
- IndexWriter通过函数addDocument将文档添加到索引中,实现创建索引的过程。
- Lucene的索引是应用反向索引。
- 当用户有请求时,Query代表用户的查询语句。
- IndexSearcher通过函数search搜索Lucene Index。
- IndexSearcher计算term weight和score并且将结果返回给用户。
- 返回给用户的文档集合用TopDocsCollector表示。
那么如何应用这些组件呢?
让我们再详细到对Lucene API 的调用实现索引和搜索过程。
- 索引过程如下:
- 创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
- 创建一个Document代表我们要索引的文档。
- 将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReader的SRC_FILE就表示要索引的源文件。
- IndexWriter调用函数addDocument将索引写到索引文件夹中。
- 搜索过程如下:
- IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
- 创建IndexSearcher准备进行搜索。
- 创建Analyer用来对查询语句进行词法分析和语言处理。
- 创建QueryParser用来对查询语句进行语法分析。
- QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。
- IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector。
以上便是Lucene API函数的简单调用。
然而当进入Lucene的源代码后,发现Lucene有很多包,关系错综复杂。
然而通过下图,我们不难发现,Lucene的各源码模块,都是对普通索引和搜索过程的一种实现。
此图是上一节介绍的全文检索的流程对应的Lucene实现的包结构。(参照http://www.lucene.com.cn/about.htm中文章《开放源代码的全文检索引擎Lucene》)
- Lucene的analysis模块主要负责词法分析及语言处理而形成Term。
- Lucene的index模块主要负责索引的创建,里面有IndexWriter。
- Lucene的store模块主要负责索引的读写。
- Lucene的QueryParser主要负责语法分析。
- Lucene的search模块主要负责对索引的搜索。
- Lucene的similarity模块主要负责对相关性打分的实现。
了解了Lucene的整个结构,我们便可以开始Lucene的源码之旅了。
如上图所示,Lucene源码中共包括7个子包,每个包完成特定的功能:
Lucene包结构功能表
包名功能org.apache.lucene.analysis 语言分析器,主要用于的切词,支持中文主要是扩展此类 org.apache.lucene.document 索引存储时的文档结构管理,类似于关系型数据库的表结构 org.apache.lucene.index 索引管理,包括索引建立、删除等 org.apache.lucene.queryParser 查询分析器,实现查询关键词间的运算,如与、或、非等 org.apache.lucene.search 检索管理,根据查询条件,检索得到结果 org.apache.lucene.store 数据存储管理,主要包括一些底层的I/O操作 org.apache.lucene.util 一些公用类 1、analysis对需要建立索引的文本进行分词、过滤等操作
2、standard是标准分析器
3、document提供对Document和Field的各种操作的支持。
4、index是最重要的包,用于向Lucene提供建立索引时各种操作的支持
5、queryParser提供检索时的分析支持
6、search负责检索
7、store提供对索引存储的支持
8、util提供一些常用工具类和常量类的支持
Lucene中的类主要组成如下:
1)org.apache.1ucene.analysis语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。
2)org.apache.1uceene.document索引存储时的文档结构管理,类似于关系型数据库的表结构。
3)document包相对而言比较简单,该包下面有3个类,document相对于关系型数据库的记录对象,Field主要负责字段的管理。
4)org.apache.1ucene.index索引管理,包括索引建立、删除等。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
5)org.apache.1ucene.queryParser查询分析器,实现查询关键词间的运算,如与、或、非等。
6)org.apache.1ucene.search检索管理,根据查询条件,检索得到结果。
7)org.apache.1ucene.store数据存储管理,主要包括一些底层的I/0操作。
8)org.apache.1ucene.util一些公用类。
lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。
写入流程:源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。将索引写入存储器,存储器可以是内存或磁盘。
读出流程:用户提供搜索关键词,经过analyzer处理。对处理后的关键词搜索索引找出对应的Document。用户根据需要从找到的Document中提取需要的Field。
索引过程:从命令行读取文件名(多个),将文件分路径(path字段)和内容(body字段)2个字段进行存储,并对内容进行全文索引:索引的单位是Document对象,每个Document对象包含多个字段Field对象,针对不同的字段属性和数据输出的需求,对字段还可以选择不同的索引/存储字段规则。创建document:这一步骤所指的document是lucene索引是使用的一个数据对象,每个document对应一个数据即一个页面或是数据库中的一行数据等等。数据被抓取之后,需要将数据中的信息分解为多个field,并将这些field通过document组织起来。将数据分解为field并保存到document之后,可以为field以及document指定激励因子以影响结果集的排名。每一个文档最终被封装成了一个 Document 对象。
analysis document:接下来就是分析文档(analyze document)。搜索引擎不对直接对创建的document对象创建索引,它会对document中包含的数据字段进行分析,分解为多个token。文档分析阶段会涉及很多问题,例如同义词,词汇的变形,以及多语言等问题。lucene提供了一些分析器用以分析文档,用户也可自定义分析器用以分析文档数据。
分析文档之后就是将文档添加到索引中,这个步骤lucene已经提供了API让用户可以轻松创建索引。
索引创建完成之后,数据的准备工作已经完成,之后就是等待用户使用搜索引擎搜索了。一般是通过浏览器或客户端提交检索词,搜索引擎接受到用户请求之后,会将检索词转换为一个Query对象,即Build Query阶段。Lucene提供了一个QueryParser的包来讲用户提交的检索词转换为Query对象,检索词中有可能包含布尔操作符或通配符或是限制结果集数量的条件,如果你的页面上想要实现控制结果集数量或是其他限制条件的话,也是需要通过一定的逻辑将其转换为相应的查询条件。通常,lucene提供的QueryParser足以应付用户提交的检索词,如果想要添加自己的逻辑的话也可以自定义QueryParser。
lucene使用Query对象查询是一个查询索引以及提取与Query对象匹配的文档并按照用户需要对结果集进行排序的过程。lucene已经封装了具体的搜索实现并提供了简便的API,如果用户需要实现特殊的查询逻辑,整个查询实现也是可以拓展的。这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。
搜索算法当前大概有三种:
1、纯布尔模型:该模型对于文档的判断仅限于匹配与不匹配,并不存在相关性判断。
2、向量空间模型:将检索词与document抽象为N维向量空间中的向量,每一个term作为一个维度,通过计算检索词与document向量之间的距离来判断相似性与相关性。
3、概率模型:使用概率的方法来判断一个document的相关性
lucene使用的检索方法是纯布尔模型以及向量空间模型的联合体。
一旦我们获得了与检索词相匹配的document,经过排序,然后就是向用户展示检索结果。lucene并没有提供展示检索结果的功能,但是在lucene中提供了动态摘要以及高亮检索词的功能。
-
lucene
2014-11-04 21:46:05solr/lucene和nutch/lucene的区别 发信站: 水木社区 (Sun Feb 24 11:34:40 2013), 站内 lucene是一个做搜索用的类库。 nutch和solr都是基于lucene的,二者都是可直接运行的应用程序。 solr是lucene的服务器化,...solr/lucene和nutch/lucene的区别
lucene是一个做搜索用的类库。
nutch和solr都是基于lucene的,二者都是可直接运行的应用程序。
solr是lucene的服务器化,内嵌了jetty,提供REST接口,
用户可以直接post数据给solr,然后由solr进行索引。
solr不包含下载系统,用户需要负责下载,转成solr所需要的格式。
solr还提供查询接口供用户查询。
nutch可以看成一个out-of-box的搜索引擎,包含了crawler,indexer和查询接口。
但nutch更偏向于下载系统。
一般可以使用nutch做crawler,而使用solr做indexer和查询接口。
1. 导入性能,es更强
2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升
3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。
elasticsearch solr对比评测:http://engineering.socialcast.com/2011/05/realtime-search-solr-vs-elasticsearch/
elasticsearch官网:http://www.elasticsearch.org/
-
Lucene
2010-12-17 10:25:40预览文章: Lucene 3.0 原理与代码分析 永久链接: http://ji-gl.iteye.com/blog/653970 Lucene 3.0 原理与代码分析 在系统维护中偶然间接触到了搜索引擎这个概念,在网上一搜,找到了这个好的博客,就转载了,...预览文章: Lucene 3.0 原理与代码分析
永久链接: http://ji-gl.iteye.com/blog/653970
Lucene 3.0 原理与代码分析
在系统维护中偶然间接触到了搜索引擎这个概念,在网上一搜,找到了这个好的博客,就转载了,附件中有pdf文档,想好好研究这个东东,也希望能给大家帮助:
本系列文章将详细描述几乎最新版本的Lucene的基本原理和代码分析。
其中总体架构和索引文件格式是Lucene 2.9的,索引过程分析是Lucene 3.0的。
鉴于索引文件格式没有太大变化,因而原文没有更新,原理和架构的文章中引用了前辈的一些图,可能属于早期的Lucene,但不影响对原理和架构的理解。
本系列文章尚在撰写之中,将会有分词器,段合并,QueryParser,查询语句与查询对象,搜索过程,打分公式的推导等章节。
Lucene学习总结之一:全文检索的基本原理
http://forfuture1978.iteye.com/blog/546771
Lucene学习总结之二:Lucene的总体架构
http://forfuture1978.iteye.com/blog/546808
Lucene学习总结之三:Lucene的索引文件格式(1)
http://forfuture1978.iteye.com/blog/546824
Lucene学习总结之三:Lucene的索引文件格式(2)
http://forfuture1978.iteye.com/blog/546832
Lucene学习总结之三:Lucene的索引文件格式(3)
http://forfuture1978.iteye.com/blog/546841
Lucene学习总结之四:Lucene索引过程分析(1)
http://forfuture1978.iteye.com/blog/587113
Lucene学习总结之四:Lucene索引过程分析(2)
http://forfuture1978.iteye.com/blog/587116
Lucene学习总结之四:Lucene索引过程分析(3)
http://forfuture1978.iteye.com/blog/587120
Lucene学习总结之四:Lucene索引过程分析(4)
http://forfuture1978.iteye.com/blog/587122 -
Lucene Solr 811
2019-10-29 23:11:30文章目录solrlucene倒排索引实际举例lucene API 介绍创建索引新建 maven 项目,添加依赖创建测试类,添加以下代码查看索引运行 luke查看文档指定分词器,并测试分词查询测试从索引查询solr 安装把 solr-8.1.1.tgz 传到... -
Lucene整理
2017-03-23 00:24:20Lucene -
lucene详细使用教程
2017-05-12 09:39:41lucene -
Lucene介绍与使用
2018-09-27 21:29:241、了解搜索技术 1.1 什么是搜索 简单的说,搜索就是搜寻、查找,在IT行业中就是指用户输入关键字,通过相应的算法,查询并返回用户所需要的信息。 1.2 普通的数据库搜索 类似:select * from 表名 where 字段名... -
Lucene系列二:Lucene(Lucene介绍、Lucene架构、Lucene集成)
2020-03-02 13:46:34一、Lucene介绍 1. Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的...
-
21年新接口自动化测试视频postman教程 零基础接口测试
-
攻防世界 Web_python_template_injection wp
-
2020浙江省电赛A题方案.7z
-
RabbitMQ如何保证有序消费消息?如何防止消息被重复消费?
-
苹果手机越狱绕ID助手 purpleSLIVER最新版
-
23种JAVA设计模式
-
数字化城市大脑赋能社会治理现代化体系新动能.docx
-
不插入sim卡 不连接wifi,连接网线,网线识别成功,重启手机,状态栏网线图标有感叹号,但上网正常
-
Java星选一卡通
-
JavaScript基础学习笔记(五)
-
3.2最小拍数字控制系统
-
Servlet基础入门
-
JAVA不熟练的基础
-
web前端开发规范
-
PCI Express IP核应用参考设计.7z
-
公安视频图像分析系统:视频图像内容分析及描述技术要求.pdf
-
单元测试UnitTest+Pytest【Selenium3】
-
Vue中的template标签的使用和在template标签上使用v-for
-
2021最新Kubernetes(k8s)集群实战精讲
-
单片机多功能调试助手.rar