Lucene学习笔记

Lucene基础小知识

  • Lucene它不是一个完整的全文搜索引擎。

  • Lucene只是一个全文检索引擎的框架。

  • Lucene提供了完成的查询引擎和索引引擎,部分文本分析引擎(英文和德文)。

  • Lucene只是个工具包,可在此基础上构建全文检索引擎。

  • Java开发,Apache维护

Lucene的突出优点

  • 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使不同平台能共享索引文件。

  • 在倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引合并,达到优化目的。

  • Lucene查询实现中,默认实现了布尔操作、模糊查询、分组查询等等。

  • Lucene的开源特性,使它比其他商业全文检索引擎更灵活,可以根据用户的实际情况,编写更适合当前应用的引擎。

  • Lucene是面向对象架构设计,方便扩充功能,如中文处理,HTML,PDF处理,而且跨平台。

  • Apache维护,社区强大。

lucene jar包结构:analysis, codesc, document, geo, index, search, store, util。

索引:

索引就是一个工具,可以快速的帮助我们查找单次或者短语。

 

索引创建:一次创建,多次使用。

第一步:获取内容(Accquire Content)

获取一个被索引的文本。

第二步、构建 Document

把要索引的文件转换为一系列的document。每个document由Field组成。

document就是由Field组成,而field就是即将被索引的文章属性。例如:author,title,url,price,content等。

对于每一个document或者field进行加权操作

第三步、Analyzer Docuement

一个文件不会被直接索引,我们队文件的预处理是将字符串拆分成若干短语单元,称为tokens。

每一个token我们可以认为是一个字的信息。

第四部、创建索引

创建索引的过程中,document会被添加到索引库。调用Lucene的API就完成了索引库的建立。

搜索索引

搜索是寻找一个索引词所处的document的过程。

搜索的内容的质量有两个指标:精确度和搜索命中率

Document:

Document是Lucene索引库的基本组成单元。代表一条用户的搜索记录,我们对Lucene的搜索就是对索引库中的document的搜索。创建一个Document: Document document = new Document();

Field:

Field作为Document的组成部分,代表着每一条记录所要存储的项信息。创建一个Field:  Field field=new Field(“name”,”helei”,Store.YES,Index.NOT_ANALYZER);

Analyzer:

Analyzer是将Field中的每一个字段分解成若干个单元,然后将这些单元创建索引库。事实上该类主要是将一段字符文 本拆分为 TokenStream 对象,该对象中保存了分词的一些信息。创建一个分词语 法如下。 创建一个Analyzer:  Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_35); 

IndexWriterConfig:

IndexWriterConfig 该类是主要是通过设置该属性来实现对 IndexWriter 的配置。 实现功能其实并不难。创建一个 IndexWriterConfig 对象的代码如下。IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_35,analyzer);

Directory:

Directory 主要指定索引库的位置,用户可以使用 FSDirectory、 RAMDrectory、FileSwitchDirectory、NRTCachingDirectory 这些类都是 Lucene 为我们提供,创建 一个 Directory 代码如下Directory directory=FSDirectory.open(new File(path));

IndexWiter:

IndexWriter 该类主要负责将 Document 对象写入到磁盘上以及对索引库的添加、修改和删除操作。创建 IndexWriter 的代码: IndexWriter indexWriter=new IndexWriter(directory, config);

IndexReader:

IndexReader 主要提供了用户操作索引库的方法,这个类同样也而用户提供了访问索引库的方法例如 Document 总数量,删除、有效数量等操作。该 IndexWriter 的创建方式如下:IndexReader indexReader=IndexReader.open(directory);

IndexSearcher:

IndexSearcher 主要是根据 Query 查询出所需要的 Document 返回给用户。例如:分页信息查询到的 Document 信息等。该类的创建代码如下。IndexSearcher indexSearcher=new IndexSearcher(indexReader);

Term:

Term 代表索引库中的一个字代表一个简单的搜索单元。创建代码如下。 Term term=new Term("name","heleli");

Query:

Query 主要是由 Term 组成,该类是一个接口,它的实现类有很多,例如 TermQuery、MultiTermQuery 、BooleanQuery 、WildcardQuery 、PhraseQuery、PrefixQuery 、MultiPhraseQuery 、FuzzyQuery 、TermRangeQuery 、 NumericRangeQuery 、org.apache.lucene.search.spans.SpanQuery 等针对于该类 的实现会在后续介绍。创建该类的代码如下:Query query=new TermQuery(term);

TopDocs:

TopDocs 代表收索的文档信息。该类中保存了查询到的文档数目以及命中的文档信息。创建该类的信息方法如下:TopDocs tds=indexSearcher.search(query, 100);

ScoreDoc:

ScoreDoc 代表一个 TopDoc 中的一个 Doc 对象。使用一般在搜索中获取如下。ScoreDoc[] sds=tds.scoreDocs;

lucene与关系型数据库

全文检索对比

对比项

全文检索库(Lucene)

关系型数据库

核心功能

以文本检索为主,插入、删除、修改比较麻 烦,适合于大文本块的查询。

插入、删除、修改十分方便, 有专门的 SQL 命令,但对于大 文本块类型的检索效率较低。

与数据库类似,都可以建多个库,而且各个 库的存储位置可以不同。

可以建多个库。一般每个库都

有控制文件和数据文件等,比

较复杂。

没有严格的表的概念,Lucene 的表只是由 入库时的定义字段松散构成

有严格的表结构,有主键,有

字段类型等

记录

由于没有严格的表的概念,所以记录体现为 一个对象,记录对应的类是 Document。

Record,与表结构对应。

字段

字段类型只有文本和日期两种,字段一般不 支持运算,更无函数功能,字段对应的类是 Field 类。

字段类型丰富,功能强大。

查询结果集

在 Lucene 里表示查询结果集的类是 Hits, 如 hits(doc1,doc2,doc3......)

在 JDBC 中使用 Resultset

模糊查询的对比

对比项

Lucene 全文检索

数据库模糊查询

索引

将数据源中的数据——建立倒排索 引,速度较快

无法使用数据库索引,需要遍历所

有记录进行模糊匹配,所以查询速

度有多个数量级的下降

匹配效 果

通过词元匹配,通过语言分析接口

进行关键诩拆分,能够实现对中文

的支持

由于是模糊查询,匹配不精确,可

能查出无关信息或漏查信息

匹配度

有匹配度算法,将匹配度比较高的

结果排在前面

没有匹配度算法,一个关键词在记

录中出现多少次结果都是一样的

结果输出

通过特别的算法,将匹配度最高的头 100 条结果输出,结果集是缓冲 式的小批量读取的,系统开销较小

返回所有的结果集,在匹配条目非常

多的时候需要大量的内存存放这

些临时结果集,系统开销大

可定制性

通过 API 接口可定制出符合检索排 序需要的排序规则

不可定制

适用情况

高负载的模糊查询应用,索引资料

量比较大,速度要求比较快,匹配

度要求比较高的情况

使用率低,模糊匹配规则的简单或

者需要模糊查询的资料量少的情况

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值