
Lucene3.0+
文章平均质量分 51
ssbunny
这个作者很懒,什么都没留下…
展开
-
1) 第一章 初识Lucene:简介
1. Lucene是什么 Lucene是一个高性能、可扩展的IR(Information Retrieval)库。 注意:它并非一个完整的web搜索引擎。 2. Lucene能做什么 为你的应用增加全文检索能力。(索引 --> 搜索) 3. Lucene的历史 具体Lucene的发展史网上很多介绍。 作者是Doug Cutting, 这孩子...原创 2011-05-30 14:05:47 · 126 阅读 · 0 评论 -
12) 第二章 索引:规则(Norms)
在索引阶段,文档(Document)中每个被索引的域(Field)都可能有一个优先权重因数(boost),它是一个浮点值。该值由三部分联合计算得到:文档自身的boost值;每个域的值;Lucene根据各词元在域中的频度算出的boost值; 得到最终的boost值后,Lucene会通过一些巧妙的方法把它转换成一个字节,并将其存入文档的各个域。待到搜索阶段,每个被查询域的规则都...2011-06-10 10:32:44 · 202 阅读 · 0 评论 -
13) 第二章 索引:用Lucene索引日期和时间
对Lucene而言,每个域都是String类型。然而在真实的应用中,我们还会遇到诸如日期、整数、浮点数等其它类型。如何是好?Lucene自然有其处理之道。 先让我们来看看Lucene是怎么处理日期类型的吧! 日期类型的使用场景可谓多之又多:邮件的寄出、收到日期;文件的创建日期、最后修改日期;HTTP响应中的最后修改日期等等。总之,绝大多数情况下,你会有处理日期的遭...2011-06-10 17:46:33 · 325 阅读 · 0 评论 -
14) 第二章 索引:用Lucene索引数字
索引数字的场景主要有两种:一是把它们当作字符串一样处理,比如“要是搁以前,术士能暴击10000多,有木有!”中的"10000",它和其它的词没什么区别,你可以把它仅仅想成一个字符串;另一种场景则是某个域只索引数字,且可以搜索数字的范围等,比如设计了某个Field存储邮件的大小,现在要搜索大小在3M-10M的邮件。 对于第一种情况,你要做的仅仅是选一个不会对数字进行分词...2011-06-13 14:28:36 · 120 阅读 · 0 评论 -
15) 第二章 索引:设计用来排序的域
这一节非常非常简单,场景是这样的:我们对Lucene原生的排序结果不感兴趣,而是希望按我们的意志针对某个域排序。 记住三点: 1) 设计这么一个单独的域,用它来排序; 2) 保证此Field下每个文档中仅含一个词元(通常的方法是设置Field.Index.NOT_ANALYZED,当然,采用KeywordAnalyzer等仅会产生一个词元的分析器...2011-06-14 09:38:30 · 95 阅读 · 0 评论 -
16) 第二章 索引:设置Field的截断
针对Field我们还有最后一个特性要讨论:截断(truncation)。其实就是之前"基本索引操作"中提到的 MaxFieldLength 问题。如果只是从字面上感觉,它就是个设置Field最大长度的值。 那么它到底是设置一个文档中同名域的最大个数还是不同文档的同名域的最大个数?是设置同名域的最大Term数还是一个域的最大Term数? 答案是:一个域的最大Term...2011-06-14 16:57:21 · 164 阅读 · 0 评论 -
17) 第二章 索引:优化索引(Optimizing)
索引文件的多个段可以合并成一个或少量几个。这样将节省一部分硬盘空间,更重要的是,它可以加快搜索速度。需要注意的是,是加快搜索速度,并非加快索引速度。方法很简单:optimize(int maxNumSegments, boolean doWait); maxNumSegments 代表合并后可能存在的最大段数,也就是传入5,合并完可能存在1或2或3或4或5个段;另外就是,...2011-06-23 13:59:54 · 150 阅读 · 0 评论 -
18) 第二章 索引:锁策略--Lucene自身提供的锁实现
首先需要清楚一个大前提:在同一个索引文件上,一次只能存在一个writer! 那如果有多个IndexWriter要访问一个索引文件该怎么办?加锁! Lucene自身提供了4种锁策略: 1) SimpleFSLockFactory 这是基于文件系统的索引默认使用的锁的实现方式。 SimpleFSLockFactory的思路其实就是在Ind...2011-07-08 17:57:39 · 134 阅读 · 0 评论 -
20) 第二章 索引:缓冲
Lucene在添加或删除文档时,并不会立即将这些操作写入磁盘,而是在内存中先做缓存。毋庸置疑,这是针对IO性能问题而作出的优良策略。 在三种情况下,Lucene会对缓冲区进行flush操作: 1. 缓存区内存空间已满 通过IndexWriter的setRAMBufferSizeMB()设置缓冲区大小。默认为16.0MB。值得注意的是,内存大小的设定并非绝对精确,因而你不...2012-04-20 22:38:00 · 125 阅读 · 0 评论 -
11) 第二章 索引:文档优先策略(Boosting)
请先确认一句话:“并非人人生而平等!”。对于Document和Field也是如此。 假设你现在需要索引一些邮件。要求是,搜索结果中,船长发出的邮件要排在船员的前面!如何实现? 还好Lucene为你提供了它的实现,而且非常简单:boosting. 每个文档都拥有一个优先权重因数,默认情况下它的值是1.0, 你可以通过改变此值来实现上面的要求。重要的文档(此例中为船长的邮件...2011-06-09 14:47:38 · 186 阅读 · 0 评论 -
10) 第二章 索引:Field中含多个值的问题
假设你的Document中有一个名为"author"的Field, 然而有时一篇文章的作者不止一个。如何解决这个问题呢?一种方法是,你可以先循环遍历所有作者,将他们的名字拼接成一个String,然后再根据这个String去创建Lucene的Field;另一种更为优雅的方式,则是直接往这个Field中加入不同的值: Document doc = new Document(...2011-06-08 17:17:37 · 241 阅读 · 0 评论 -
9) 第二章 索引:Field的设置
Field也许算是Lucene索引阶段最重要的类,它是存储被索引值的类。当创建Field时,Lucene为其提供了诸多选项供你选择。 1. 索引 索引选项(Field.Index.*)用来控制域中的文本如何通过反向索引搜索。共有如下选项: 1) Index.ANALYZED 最常用的设置,采用分词策略,将原文拆分成词元(通常用在正文、...2011-06-08 16:25:01 · 228 阅读 · 0 评论 -
2) 第一章 初识Lucene:索引和搜索
1. 为什么需要搜索 为什么需要高效的、准确的搜索? 你说呢? 2. 怎么样快速搜索 这个道理很简单。为什么你从《现代汉语词典》中找一个词相当快速,而从一本小说中找起来费劲? 词典是按一定顺序编排过的。那么,如果我给小说的每个词都编个目录来说明在哪些页码能找到它们呢? 好吧,编排目录需要花点时间对吗?但是一次性编排完了,以后找起来就会很方便而且不用每次查找都再...原创 2011-05-30 15:31:11 · 121 阅读 · 0 评论 -
3) 第一章 初识Lucene:一个简单的实例
还是看代码来的直接: 1. 索引 import java.io.File;import java.io.FileReader;import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.docu...原创 2011-05-30 16:37:59 · 102 阅读 · 0 评论 -
4) 第一章 初识Lucene:理解核心索引类
1. IndexWriter IndexWriter是索引过程的核心组件。这个类用于创建新的索引文件或者打开一个已经存在的索引文件,之后,它负责增加、删除、更新对应文件中的document. 你可以把它理解成这样一个对象:它提供对索引文件的"写"操作,然而你不能通过它进行"读"和"搜索"操作。IndexWriter需要一个空间以存储索引文件,这正是Directory的作用。...原创 2011-05-30 17:18:04 · 105 阅读 · 0 评论 -
5) 第一章 初识Lucene:理解核心搜索类
1. IndexSearcher IndexSearcher用来搜索由IndexWriter索引的内容:它是与索引文件之间的重要通道,并提供了一些搜索方法。你可以把IndexSearcher理解成这样一个类:它以"只读"方式打开索引文件。它提供了大量搜索方法,其中一些方法继承自其抽象父类Searcher. 其典型用法如下:IndexSearcher searcher = ...2011-05-31 17:22:27 · 97 阅读 · 0 评论 -
6) 第二章 索引:Lucene索引的文档模型
1. 文档(Document)和域(Field) Document是Lucene索引和搜索的最小单元。然而实际上它只是一个或多个Field的容器,Field中保存着真正的内容。 Field由三部分组成:名称(作为域的唯一标识); 值(文本或二进制值); 选项(针对该域的一些细节描述) 2. Field的高级设置 1) 值可以被索引或不索引。被索引的域才能...原创 2011-06-07 10:57:58 · 104 阅读 · 0 评论 -
7) 第二章 索引:理解Lucene索引过程
Lucene索引的API非常简单,然而在其简易的API背后,它做了许多有趣的、相对复杂的操作。我们可以明确得将这些操作分为三条:抽取文本(extract text);分析(analysis);索引(index)。 1. 抽取文本并创建文档(document) 在用Lucene索引数据之前,必须先将其抽取为纯文本。第一章的例子中我们索引了扩展名为 .txt 的文...原创 2011-06-07 11:32:11 · 109 阅读 · 0 评论 -
8) 第二章 索引:基本索引操作
先上示例代码,原意看的就看,不愿意看的先略过,回头再对照着看也行: import java.io.IOException;import junit.framework.TestCase;import org.apache.lucene.analysis.WhitespaceAnalyzer;import org.apache.lucene.document...2011-06-07 15:09:43 · 110 阅读 · 0 评论 -
Hibernate Search常用注解总结
1. @Indexed -> index 指定索引名称 2. @Field -> name 指定当前属性在Lucene Document中存储的名称,默认为属性名 -> store 指定当前属性是否被存储在Lucene index中,可选值为: 1) Store.YES 占用大量的索引空间,支持"投影(projection)" ...原创 2011-06-08 14:08:42 · 156 阅读 · 0 评论 -
19) 第二章 索引:用IndexReader删除文档
除了IndexWriter外,IndexReader也可以用来删除文档。那么两者之间有什么区别呢? A. IndexReader可以按文档id删除一个文档。 IndexReader用来删除文档的核心方法为:public synchronized void deleteDocument(int docNum) throws StaleReaderException, ...2012-04-19 22:17:55 · 182 阅读 · 0 评论