lucene 简介

lucene是一个java编写的开源的全文检索引擎,是一个框架,一套api,是一个核心模块,并不包括用户交互、高亮结果等外围模块。

gradle依赖

dependencies{ 
	compile 'org.apache.lucene:lucene-core:6.0.0'
	compile 'org.apache.lucene:lucene-analyzers-common:6.0.0'
	compile 'org.apache.lucene:lucene-demo:6.0.0'
}

示例工程https://code.csdn.net/chuchus/lucenedemo/

1.关系型数据库的对比

lucene拥有倒排文档。
lucene以文档(document)为单位进行检索。与关系型数据库不同,文档不需要有固定的结构,每个文档可以有不同的字段。

2.索引

即倒排索引。简化版的索引可看作 <term,docIDList>这样一个map。

每个索引由若干个段(segment)组成。段的特性是写一次,读多次。段一旦建立便不可更改,直到下次合并。

2.1 文档的更新与删除

段不可更改,这样的设计简化了一些东西,但同时也引入了额外的工作,比如说删除。

被删除的文档信息存储在一个单独的文件中,但该段自身不被更新。那么底层的搜索就是这样的:第一次的搜索结果含有被删的文档,然后再读删除信息,把这个文档从返回结果中过滤掉。

对于更新操作也类似,底层实现是先删除再添加。

2.2 文档的添加


2.3 段合并

多个段在必要的时候会被lucene合并(merging)为一个大段。在合并时,不再需要的信息将被删除(例如被删除的文档)。

段合并的IO开销很大,所以需要控制合并操作的时机与频率。段的合并策略由MergePolicy类负责。

3.域处理

lucene可以对域进行三种操作。

  • 域值可以被索引或不被索引。如果需要搜索一个域,必须对它进行索引。被索引的域值必须是文本格式的,二进制格式的域值只能被存储而不能被索引。
  • 域被索引后,还可以选择性的存储项向量。
  • 域值可以被单独存储。

3.1多值域

向同一个域写多个值是合理的。如一本书有多个作者。此时的代码见下:

for(String author:authors)
	doc.add(new StringField("author",author,Field.Store.YES));

4.package概览

Lucene 软件包的发布形式是一个 JAR 文件,下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包,使读者对之有个初步的了解。 
Package: org.apache.lucene.store
数据存储管理包,主要包括一些底层的IO操作。
Package: org.apache.lucene.codecs
编码管理包,用于方便地自定义索引的编码和结构。
Package: org.apache.lucene.queryParser
查询分析包,实现查询语法,支持关键词之间的运算,如 '或' '且' '非'。
Package: org.apache.lucene.util
lucene公用的算法类
Package: org.apache.lucene.document 
文档结构包,用于描述/索引存储时/的文档结构,类似于关系型数据库中/表/的结构。含有 Document, Field类。这样,每一个文档最终被封装成了一个 Document 对象。 
Package: org.apache.lucene.analysis 
语言分析包。这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。 
Package: org.apache.lucene.index 
索引管理包。这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。 
Package: org.apache.lucene.search 
检索管理包。这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值