lucene
文章平均质量分 78
filix2006xujianhui
这个作者很懒,什么都没留下…
展开
-
Lucene-2.2.0 源代码阅读学习(40)
关于Lucene检索结果的排序问题。已经知道,Lucene的默认排序是按照Document的得分进行排序的。当检索结果集中的两个Document的具有相同的得分时,默认按照Document的ID对结果进行排序。下面研究几种设置/改变检索结果排序的方法。■ 改变Document的boost(激励因子)改变boost的值实现改变检索结果集的排序,是最简单的方法,只需要在建立索引的过...原创 2009-06-04 14:37:05 · 75 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(28)
关于检索的核心IndexSearcher类。IndexSearcher是Lucene的检索实现的最核心的实现类,它继承自抽象类Searcher,该抽象类中包含了用于检索的一些核心的方法的实现。而Searcher抽象类有实现了Searchable接口,Searchable接口是实现检索的抽象网络协议,可以基于此协议来实现对远程服务器上的索引目录的访问。这一点,可以从Searchable接口所继承...原创 2009-06-04 14:09:46 · 96 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(27)
关于Lucene的检索(IndexSearcher)的内容。通过一个例子,然后从例子所涉及到的内容出发,一点点地仔细研究每个类的实现和用法。先写一个简单的使用Lucene实现的能够检索的类,如下所示:package org.shirdrn.lucene;import java.io.IOException;import java.util.Date;import java.ut...原创 2009-06-04 14:07:46 · 98 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(26)
如果在初始化一个IndexWriter索引器的时候,指定 useCompoundFile =false,则在指定的索引目录中生成的索引文件就不是.cfs复合索引文件。通过这种方式生成的索引文件,它的不同格式表明了它锁存储的关于索引的不同内容。至少,明确了在建立索引过程中,经过加工处理的数据究竟去向如何,能够加深对Lucene索引过程的理解。通过在文章 Lucene-2.2.0 源代码阅...原创 2009-06-04 14:06:09 · 89 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(25)
复合索引文件格式(.cfs)是如何产生的?从这个问题出发,研究索引文件是如何合并的,这都是IndexWriter类中定义的一些重要的方法。在建立索引过程中,生成的索引文件的格式有很多种。在文章 Lucene-2.2.0 源代码阅读学习(4) 中测试的那个例子,没有对IndexWriter进行任何的客户化设置,完全使用Lucene 2.2.0默认的设置(以及,对Field的设置使用了Luce...原创 2009-06-04 14:03:04 · 83 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(24)
阅读了这么多代码,该综合总结一下了。通过在文章 Lucene-2.2.0 源代码阅读学习(4) 中的那个例子,跟踪一下一个IndexWriter索引器实例化过程,及其建立索引的过程中都经过了哪些处理(主要看涉及到了哪些类来完成建立索引的强大功能)。在文章 Lucene-2.2.0 源代码阅读学习(4) 中的主函数如下所示:public static void main(String...原创 2009-06-04 13:58:19 · 76 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(23)
通过对DocumentWriter类的writePostings()方法进行学习。同时,研究并解决几个我一直感到困惑的几个类的用途,以及到底怎样阐述能使自己有一种感性的认识。 writePostings()方法的实现writePostings()方法是对已经经过倒排的文档,将词条的一些有用信息写入到索引段文件中。该方法的实现如下所示:private final void...原创 2009-06-04 13:55:47 · 95 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(22)
关于FieldInfos类和FieldInfo类。FieldInfo类与一个Document中的一个Field相对应,而FieldInfos类又是多个FieldInfo的容器,对每个Document的所有Field对应的FieldInfo进行管理。FieldInfos类和FieldInfo类之间的关系,恰似SegmentInfos类(可以参考文章 Lucene-2.2.0 源代码阅读学...原创 2009-06-04 13:54:33 · 77 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(21)
回到IndexWriter索引器类中来,学习该类添加Document的方法。这时,需要用到一个非常重要的类:DocumentWriter,该类对Document进行了很多处理,比如“文档倒排”就是其中的一项重要内容。实例化一个IndexWriter索引器之后,要向其中添加Document,在IndexWriter类中有两个实现该功能的方法:public void addDocument...原创 2009-06-04 13:53:25 · 92 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(29)
关于IndexSearcher检索器。在学习IndexSearcher检索器之前,先大致了解一下下面几项:1、首先,要知道Weight(接口)存在的目的:使得检索不改变一个Query,使得Query可以重用。所以就出现了Weight,一个Weight可以保存与某次检索相关的IndexSearcher检索器的独立状态值。其实Weight间接保存了IndexSearcher索引器的独立状态...原创 2009-06-04 14:12:25 · 68 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(30)
关于Query的学习。主要使用TermQuery和BooleanQuery,它们是最最基础的Query。我感觉Query的灵活性太大了,这就使得它那么地具有魅力。当用户提交了检索关键字以后,首先就是要根据这个关键字进行分析,因为不同的用户提交的关键词具有不同的特点,所以使用不同方式来构造Query是极其关键的,从而使提供的检索服务最大程度地满足用户的意愿。先看看Query抽象类的继...原创 2009-06-04 14:14:43 · 77 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(31)
关于前缀查询PrefixQuery(前缀查询)。准备工作就是为指定的数据源文件建立索引。这里,我使用了ThesaurusAnalyzer分析器,该分析器有自己特定的词库,这个分词组件可以从网上下载。PrefixQuery其实就是指定一个词条的前缀,不如以前缀“文件”作为前缀的词条有很多:文件系统、文件管理、文件类型等等。但,是在你要检索一个有指定的前缀构成的词条(只有一个前最也是一个词条)...原创 2009-06-04 14:15:38 · 67 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(39)
关于Lucene得分的计算。在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示:public Explanation explain(Weight weight, int doc) throws IOException { return weight.explain(reader, doc);}返回的这个Explanation的实例解释了Lucen...原创 2009-06-04 14:35:38 · 67 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(38)
关于QueryParser。QueryParser是用来解析用户输入的查询的,将用户的输入的短语进行分析,从而提交Query查询来实现检索。QueryParser一共有三个构造方法,我们通过使用如下的构造方法:public QueryParser(String f, Analyzer a) { this(new FastCharStream(new StringReader(""...原创 2009-06-04 14:34:42 · 81 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(37)
关于MultiTermQuery查询。这里研究继承自MultiTermQuery的WildcardQuery查询。WildcardQuery查询,就是使用通配符进行查询,通配符可以使用“*”和“?”这两种:“*”可以代表0~N个字符串,“?”只能代表一个字符串,而且它们可以在一个词条Term的任何位置出现,从WildcardQuery的构造方法中可以看出:public Wildcard...原创 2009-06-04 14:32:50 · 89 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(36)
关于MultiTermQuery查询。这里研究FuzzyQuery查询。MultiTermQuery是一个抽象类,继承自它的一种有3个,分别为:FuzzyQuery、WildcardQuery、RegexQuery,其中RegexQuery使用了第三方提供的服务,可以使用正则表达式,如果你对正则表达式很熟悉,可以尝试着使用RegexQuery查询。FuzzyQuery查询,即模糊查...原创 2009-06-04 14:23:09 · 78 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(35)
关于MultiPhraseQuery(多短语查询)。MultiPhraseQuery可以通过多个短语的拼接来实现复杂查询。举个例子:现在使用StandardAnalyzer分析器建立索引,索引中是将单个的汉字作为一个一个地词条。使用这个分析器,因为没有像“今天”这样两个汉字组成词条,所以要想单独按照索引中的词条进行检索是不可能查询出任何结果的。当然,有很多方案可以选择,其中MultiP...原创 2009-06-04 14:22:09 · 79 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(34)
关于PhraseQuery。PhraseQuery查询是将多个短语进行合并,得到一个新的词条,从索引库中检索出这个复杂的词条所对应的目标数据文件。举个例子:假如用户输入关键字“网络安全”,如果索引库中没有单独的“网络安全”这个词条,但是具有“网络”和“安全”这两个词条,我们可以使用PhraseQuery进行查询,将“网络”和“安全”这两个词条合并后能够检索出匹配“网络安全”的所有词条对应的...原创 2009-06-04 14:21:20 · 66 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(33)
关于范围查询RangeQuery。RangeQuery是由两个词条作为上界和下界进行查询,同时指定了一个Boolean型参数,表示是否包括边界,这可以从RangeQuery的构造方法看到: public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive) { if (lowerTerm =...原创 2009-06-04 14:20:20 · 71 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(32)
关于SpanQuery(跨度搜索),它是Query的子类,但是SpanQuery仍然是一个抽象类,它有6个直接子类实现类。继承关系如图所示:其中SpanTermQuery是一个最基础的跨度搜索实现类,SpanTermQuery与SpanQuery的关系,就如同TermQuery与Query的关系:SpanTermQuery是为SpanQuery其它的具体实现子类服务的,其实TermQuer...原创 2009-06-04 14:18:08 · 79 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(20)
关于Field类和Document类。初始化一个IndexWriter索引器之后,就可以向其中添加Document了。然而,Document逻辑文件能够与一个物理文件对应起来,在Lucene中,Document主要是维护添加到其中的多个Field。关于Field在文章 Lucene-2.2.0 源代码阅读学习(3) 中可以了解到一点相关内容,Field类的定义比较简单,它给出了7种构造一个...原创 2009-06-04 13:52:08 · 71 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(19)
研究SegmentInfo类的实现。虽然在阅读代码的时候,是一件很枯燥的事情,尤其是当代码非常地长,这使得我们感觉这是一种压力,但是如果把代码当成是一种乐趣的时候,你会发现代码是那样的富有感情色彩。呵呵。SegmentInfo类在Lucene 2.0.0版本的时候,定义非常简单,就定义了一个构造函数,如下所示:package org.apache.lucene.index;impo...原创 2009-06-04 13:50:56 · 66 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(18)
关于SegmentInfos类的具体实现大致已经在文章 Lucene-2.2.0 源代码阅读学习(17) 中有了一个简单的印象,可以在文章 Lucene-2.2.0 源代码阅读学习(17) 中的末尾部分看到一点非常有用的总结。然而,到底SegmentInfos类能够实现哪些功能,让我们能够亲眼看到它产生了哪些东西呢?我们可以从SegmentInfos类的一些重要的成员方法中开始追踪一些真实存在...原创 2009-06-04 13:48:14 · 86 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(6)
Lucene分析器的实现。Lucene分词器Tokenizer,它的继承子类的实现。Tokenizer类的继承关系,如图所示:ChineseTokenizer类实现中文分词中文分词在Lucene中的处理很简单,就是单个字分。它的实现类为ChineseTokenizer,在包org.apache.lucene.analysis.cn中,源代码如下:package org.ap...原创 2009-06-03 11:06:21 · 88 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(5)
研究Lucene分析器的实现。Analyzer抽象类所有的分析器的实现,都是继承自抽象类Analyzer,它的源代码如下所示:package org.apache.lucene.analysis;import java.io.Reader;public abstract class Analyzer {// 通过Field的名称,和一个Reader对象,创建一个分词流,...原创 2009-06-03 11:03:24 · 66 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(4)
建立索引,通过已经生成的索引文件,实现通过关键字检索。写了一个类MySearchEngine,根据上述思想实现,把Lucene自带的递归建立索引的方法提取出来,加了一个搜索的方法:package org.shirdrn.lucene;import java.io.File;import java.io.FileNotFoundException;import java.io.IOE...原创 2009-06-03 11:01:55 · 75 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(3)
org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中:static void...原创 2009-06-03 11:00:16 · 85 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(2)
IndexWriter是一个非常重要的工具。建立索引必须从它开始。而且,从它的构造函数开始。Document和Field是Lucene中两个最重要的概念。在建立索引的时候,也就是实例化一个索引器IndexWriter的之前,必须通过已经建立好的Document逻辑文件,将Document的对象添加到IndexWriter实例中,才能算是建立索引。Document汇集数据源,这个数据源是...原创 2009-06-03 10:59:11 · 66 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(1)
package org.apache.lucene.demo;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.index.IndexWriter;import java.io.File;import java.io.FileNotFoundException;impor...原创 2009-06-03 10:57:21 · 67 阅读 · 0 评论 -
Lucene下载及测试
下载下载链接:http://apache.mirror.phpchina.com/lucene/java/以选择lucene-2.0.0.zip下载为例。 安装1、在本地磁盘解压缩lucene-2.0.0.zip文件;2、将lucene-demos-2.0.0.jar和lucene-core-2.0.0.jar拷贝到JDK目录的lib目录下,例如:D:\Progra...原创 2009-06-03 10:55:08 · 89 阅读 · 0 评论 -
Lucene关于几种中文分词的总结
前提:文章基于lucene2.2。 目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要。 另外网友谈的比较多的中文分词器还有: CJKAnalyzer ChineseAnalyzer IK_CAnalyzer(MIK_CAnalyzer) 还有一些热心网友自己写的比较不错的分词器在此就不说了,有兴趣的可以自己研究研究。 以...原创 2009-05-15 14:12:50 · 82 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(7)
CharTokenizer是一个抽象类,它主要是对西文字符进行分词处理的。常见的英文中,是以空格、标点为分隔符号的,在分词的时候,就是以这些分隔符作为分词的间隔符的。package org.apache.lucene.analysis;import java.io.IOException;import java.io.Reader;// CharTokenizer 是一个抽象类pu...原创 2009-06-03 11:10:04 · 63 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(8)
Lucene分析器的实现。Lucene(分词)过滤器TokenFilter类,以及继承它的子类的实现类。TokenFilter类的继承关系,如图所示:TokenFilter是一个抽象类,定义了对一个经过分词(Tokenizer)后的TokenStream进行过滤的功能,它的源代码如下所示:package org.apache.lucene.analysis;im...原创 2009-06-03 11:13:40 · 84 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(9)
Lucene的StandardAnalyzer分析器。不同的Lucene分析器Analyzer,它对TokenStream进行分词的方法是不同的,这需要根据具体的语言来选择。比如英文,一般是通过空格来分割词条,而中文汉字则不能通过这种方式,最简单的方式就是单个汉字作为一个词条。TokenStream是通过从设备或者其他地方获取数据源而构造的一个流,我们要执行分词的动作,应该对这个Tok...原创 2009-06-03 11:15:03 · 71 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(17)
根据 Lucene-2.2.0 源代码阅读学习(16) 中对IndexFileDeleter类和CommitPoint类的源代码的阅读学习,在此进行总结:一个提交点所具有的信息如下所示: long gen; // 下次提交索引段segments_N的版本 List files; // 属于当前索引目录的索引段的一个列表 String segmentsFile...原创 2009-06-04 13:46:19 · 81 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(16)
在接触到索引删除的策略IndexDeletionPolicy 的时候,提到一个提交点(IndexCommitPoint)的概念。在合适的时机,根据策略需求,需要对这些提交点(IndexCommitPoint)执行删除操作。这些个提交点(IndexCommitPoint)究竟具有怎样的特征呢?IndexCommitPoint是一个索引提交点的接口类,定义非常简单,如下所示:packa...原创 2009-06-04 13:43:00 · 68 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(15)
关于索引删除的策略IndexDeletionPolicy 。public IndexWriter(Directory d, Analyzer a, boolean create) throws CorruptIndexException, LockObtainFailedException, IOException { init(d, a, create, false, nu...原创 2009-06-04 13:40:40 · 61 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(14)
RAMDirectory类是与内存目录相关的,它和FSDirectory有很大地不同,这主要从它的构造函数来看:public RAMDirectory() { setLockFactory(new SingleInstanceLockFactory());}初始化的时候,指定的是LockFactory抽象类的一个具体实现类SingleInstanceLockFactory。Singl...原创 2009-06-04 11:48:31 · 69 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(13)
Directory抽象类比较常用的具体实现子类应该是FSDirectory类和RAMDirectory类。FSDirectory类是与文件系统的目录相关的,而RAMDirectory类是与内存相关的,即是指内存中的一个临时非永久的区域。FSDirectory类源代码定义如下:package org.apache.lucene.store;import java.io.File;im...原创 2009-06-03 11:26:15 · 62 阅读 · 0 评论 -
Lucene-2.2.0 源代码阅读学习(12)
接着昨天学习的Lucene-2.2.0 源代码阅读学习(11)继续学习。IndexWriter的一个构造器,定义如下所示:public IndexWriter(String path, Analyzer a, boolean create) throws CorruptIndexException, LockObtainFailedException, IOExceptio...原创 2009-06-03 11:24:13 · 98 阅读 · 0 评论