`
文章列表
关于Lucene得分的计算。 在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示: public Explanation explain(Weight weight, int doc) throws IOException {    return weight.explain(reader, doc);} 返回的这个Explanation的实例解释了Lucene中Document的得分情况。我们可以测试一下,直观地感觉一下到底这个Explanation的实例都记录了一个Document的哪些信息。 写一个测试类,如下所示: package org.shi ...
关于QueryParser。 QueryParser是用来解析用户输入的查询的,将用户的输入的短语进行分析,从而提交Query查询来实现检索。 QueryParser一共有三个构造方法,我们通过使用如下的构造方法: public QueryParser(String f, Analyzer a) {    this(ne ...
关于MultiTermQuery查询。 这里研究继承自MultiTermQuery的WildcardQuery查询。 WildcardQuery查询,就是使用通配符进行查询,通配符可以使用“*”和“?”这两种:“*”可以代表0~N个字符串,“?”只能代表一个字符串,而且它们可以在一 ...
关于MultiTermQuery查询。 这里研究FuzzyQuery查询。 MultiTermQuery是一个抽象类,继承自它的一种有3个,分别为:FuzzyQuery、WildcardQuery、RegexQuery,其中RegexQuery使用了第三方提供的服务,可以使用正则表达式,如果你对正则表达式很熟 ...
关于MultiPhraseQuery(多短语查询)。 MultiPhraseQuery可以通过多个短语的拼接来实现复杂查询。 举个例子:现在使用StandardAnalyzer分析器建立索引,索引中是将单个的汉字作为一个一个地词条。使用这个分析器,因为没有像“今天”这样两个汉字组成词条,所以要想单独按照索引中的词条进行检索是不可能查询出任何结果的。 当然,有很多方案可以选择,其中MultiPhraseQuery就能够实现: 它可以指定一个前缀,比如“今”,而后缀是一个Term[]数组,可以是{new Term("年"),new Term("天")} ...
关于PhraseQuery。 PhraseQuery查询是将多个短语进行合并,得到一个新的词条,从索引库中检索出这个复杂的词条所对应的目标数据文件。 举个例子:假如用户输入关键字“网络安全”,如果索引库中没有单独的“网络安全”这个词条,但是具有“网络”和“安全”这两个词条,我们可以使用PhraseQuery进行查询,将“网络”和“安全”这两个词条合并后能够检索出匹配“网络安全”的所有词条对应的结果集。 现在,使用StandardAnalyzer分析器,对目标数据进行建立索引,也就是,把单独的每个汉字都作为一个词条,存储到索引文件中。可想而知,建立索引花费的时间可能会比较多,因为要对单个汉字 ...
关于范围查询RangeQuery。 RangeQuery是由两个词条作为上界和下界进行查询,同时指定了一个Boolean型参数,表示是否包括边界,这可以从RangeQuery的构造方法看到:     public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive)    {   ...
关于SpanQuery(跨度搜索),它是Query的子类,但是SpanQuery仍然是一个抽象类,它有6个直接子类实现类。继承关系如图所示: 其中SpanTermQuery是一个最基础的跨度搜索实现类,SpanTermQuery与SpanQuery的关系,就如同TermQuery与Query的关系:SpanTermQuery是为SpanQuery其它的具体实现子类服务的,其实TermQuery也是为Query的具体子类实现类服务的,例如构造一个BooleanQuery查询,可以向其中添加多个TermQuery查询子句。 SpanTermQuery跨度搜索 SpanTermQuery的应 ...
关于前缀查询PrefixQuery(前缀查询)。 准备工作就是为指定的数据源文件建立索引。这里,我使用了ThesaurusAnalyzer分析器,该分析器有自己特定的词库,这个分词组件可以从网上下载。 PrefixQuery其实就是指定一个词条的前缀,不如以前缀“文件”作为前缀的词条有很多:文件系统、文件管理、文件类型等等。但,是在你要检索一个有指定的前缀构成的词条(只有一个前最也是一个词条)时,必须保证你在建立索引的时候,也就是分词生成的词条要有具有这个前缀构成的词条,否则什么也检索不出来。 Lucene中,指定某个前缀,检索过程中会以该前缀作为一个词条进行检索,比如“文件”前缀,如果词 ...
关于Query的学习。 主要使用TermQuery和BooleanQuery,它们是最最基础的Query。 我感觉Query的灵活性太大了,这就使得它那么地具有魅力。 当用户提交了检索关键字以后,首先就是要根据这个关键字进行分析,因为不同的用户提交的关键词具有不同的特点,所以使用不同方式来构造Query是极其关键的,从而使提供的检索服务最大程度地满足用户的意愿。 先看看Query抽象类的继承关系,如图所示: 最简单最基础的就是构造一个TermQuery,根据词条本身直接来构造一个Query,从而进行检索。 Query类抽象类了进行检索所具有的共同特征,源代码实现如下所示: pa ...
关于IndexSearcher检索器。 在学习IndexSearcher检索器之前,先大致了解一下下面几项: 1、首先,要知道Weight(接口)存在的目的: 使得检索不改变一个Query,使得Query可以重用。所以就出现了Weight,一个Weight可以保存与某次检索相关 ...
关于检索的核心IndexSearcher类。 IndexSearcher是Lucene的检索实现的最核心的实现类,它继承自抽象类Searcher,该抽象类中包含了用于检索的一些核心的方法的实现。而Searcher抽象类有实现了Searchable接口,Searchable接口是实现检索的抽象网络协议,可以基于此协议来实现对远程服务器上的索引目录的访问。这一点,可以从Searchable接口所继承的java.rmi.Remote接口来说明。 java.rmi.Remote接口在JDK中给出了说明,如下所示:     也就是说,继承java.rmi.Remote的接口具有的特性是: ...
关于Lucene的检索(IndexSearcher)的内容。 通过一个例子,然后从例子所涉及到的内容出发,一点点地仔细研究每个类的实现和用法。 先写一个简单的使用Lucene实现的能够检索的类,如下所示: package org.shirdrn.lucene; import java.io.IOException;import java.util.Date;import java.util.List; import org.apache.lucene.document.Document;import org.apache.lucene.document.Fieldable;impo ...
如果在初始化一个IndexWriter索引器的时候,指定 useCompoundFile =false,则在指定的索引目录中生成的索引文件就不是.cfs复合索引文件。 通过这种方式生成的索引文件,它的不同格式表明了它锁存储的关于索引的不同内容。 至少, ...
复合索引文件格式(.cfs)是如何产生的?从这个问题出发,研究索引文件是如何合并的,这都是IndexWriter类中定义的一些重要的方法。 在建立索引过程中,生成的索引文件的格式有很多种。 在文章 Lucene-2.2.0 源代码阅读学习(4) 中测试的那个例子,没有对IndexWriter进行任何的客户化设置,完全使用Lucene 2.2.0默认的设置(以及,对Field的设置使用了Lucene自带的Demo中的设置)。 运行程序以后,在本地磁盘的索引目录中生成了一些.扩展名为.cfs的索引文件,即复合索引格式文件。如图(该图在文章 Lucene-2.2.0 源代码阅读学习(4) 中介绍 ...
Global site tag (gtag.js) - Google Analytics