lucene
文章平均质量分 76
wjboy49
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
全文检索的基本原理
一、总论根据http://lucene.apache.org/java/docs/index.html定义:Lucene是一个高效的,基于Java的全文检索库。所以在了解Lucene之前要费一番工夫了解一下全文检索。那么什么叫做全文检索呢?这要从我们生活中的数据说起。我们生活中的数据总体分为两种:结构化数据和非结构化数据。结构化数据:指...原创 2010-02-25 10:22:08 · 163 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(35)
关于MultiPhraseQuery(多短语查询)。MultiPhraseQuery可以通过多个短语的拼接来实现复杂查询。举个例子:现在使用StandardAnalyzer分析器建立索引,索引中是将单个的汉字作为一个一个地词条。使用这个分析器,因为没有像“今天”这样两个汉字组成词条,所以要想单独按照索引中的词条进行检索是不可能查询出任何结果的。当然,有很多方案可以选择,其中MultiP...原创 2009-09-04 18:36:39 · 113 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(34)
关于PhraseQuery。PhraseQuery查询是将多个短语进行合并,得到一个新的词条,从索引库中检索出这个复杂的词条所对应的目标数据文件。举个例子:假如用户输入关键字“网络安全”,如果索引库中没有单独的“网络安全”这个词条,但是具有“网络”和“安全”这两个词条,我们可以使用PhraseQuery进行查询,将“网络”和“安全”这两个词条合并后能够检索出匹配“网络安全”的所有词条对应的...原创 2009-09-04 18:36:14 · 112 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(33)
关于范围查询RangeQuery。RangeQuery是由两个词条作为上界和下界进行查询,同时指定了一个Boolean型参数,表示是否包括边界,这可以从RangeQuery的构造方法看到: public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive) { if (lowerTe...原创 2009-09-04 18:35:38 · 119 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(32)
关于SpanQuery(跨度搜索),它是Query的子类,但是SpanQuery仍然是一个抽象类,它有6个直接子类实现类。继承关系如图所示:其中SpanTermQuery是一个最基础的跨度搜索实现类,SpanTermQuery与SpanQuery的关系,就如同TermQuery与Query的关系:SpanTermQuery是为SpanQuery其它的具体实现子类服务的,其实TermQu...原创 2009-09-04 18:35:17 · 117 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(31)
关于前缀查询PrefixQuery(前缀查询)。准备工作就是为指定的数据源文件建立索引。这里,我使用了ThesaurusAnalyzer分析器,该分析器有自己特定的词库,这个分词组件可以从网上下载。PrefixQuery其实就是指定一个词条的前缀,不如以前缀“文件”作为前缀的词条有很多:文件系统、文件管理、文件类型等等。但,是在你要检索一个有指定的前缀构成的词条(只有一个前最也是一个词条)...原创 2009-09-04 18:34:42 · 136 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(30)
关于Query的学习。主要使用TermQuery和BooleanQuery,它们是最最基础的Query。我感觉Query的灵活性太大了,这就使得它那么地具有魅力。当用户提交了检索关键字以后,首先就是要根据这个关键字进行分析,因为不同的用户提交的关键词具有不同的特点,所以使用不同方式来构造Query是极其关键的,从而使提供的检索服务最大程度地满足用户的意愿。先看看Query抽象类的继...原创 2009-09-04 18:34:10 · 126 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(29)
关于IndexSearcher检索器。在学习IndexSearcher检索器之前,先大致了解一下下面几项:1、首先,要知道Weight(接口)存在的目的:使得检索不改变一个Query,使得Query可以重用。所以就出现了Weight,一个Weight可以保存与某次检索相关的IndexSearcher检索器的独立状态值。其实Weight间接保存了IndexSearcher索引器的独立状态...原创 2009-09-04 18:33:45 · 115 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(28)
关于检索的核心IndexSearcher类。IndexSearcher是Lucene的检索实现的最核心的实现类,它继承自抽象类Searcher,该抽象类中包含了用于检索的一些核心的方法的实现。而Searcher抽象类有实现了Searchable接口,Searchable接口是实现检索的抽象网络协议,可以基于此协议来实现对远程服务器上的索引目录的访问。这一点,可以从Searchable接口所...原创 2009-09-04 18:33:28 · 130 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(27)
关于Lucene的检索(IndexSearcher)的内容。通过一个例子,然后从例子所涉及到的内容出发,一点点地仔细研究每个类的实现和用法。先写一个简单的使用Lucene实现的能够检索的类,如下所示:package org.shirdrn.lucene;import java.io.IOException;import java.util.Date;import java....原创 2009-09-04 18:33:08 · 136 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(36)
关于MultiTermQuery查询。这里研究FuzzyQuery查询。MultiTermQuery是一个抽象类,继承自它的一种有3个,分别为:FuzzyQuery、WildcardQuery、RegexQuery,其中RegexQuery使用了第三方提供的服务,可以使用正则表达式,如果你对正则表达式很熟悉,可以尝试着使用RegexQuery查询。FuzzyQuery查询,即模糊查询。...原创 2009-09-04 18:37:07 · 160 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(37)
关于MultiTermQuery查询。这里研究继承自MultiTermQuery的WildcardQuery查询。WildcardQuery查询,就是使用通配符进行查询,通配符可以使用“*”和“?”这两种:“*”可以代表0~N个字符串,“?”只能代表一个字符串,而且它们可以在一个词条Term的任何位置出现,从WildcardQuery的构造方法中可以看出:public Wildcard...原创 2009-09-04 18:37:39 · 135 阅读 · 0 评论 -
lucene 分组 bobo-Browse 排序的问题
今天碰到了一个问题,用bobo分组后对价格升序 居然1000比2排在前面。显然它是用的字符串排序。1001000220201然后我到网上找了一下关于这方面的文章,基本没有找到。没办法只好自己看源码。 很傻很天真的找到了BrowseRequest中的setFacetSpecO(String name,FacetSpec facetSpec)方法。FacetSpec类中有个...原创 2010-02-01 16:18:18 · 151 阅读 · 0 评论 -
开源搜索引擎
开放源代码搜索引擎为人们学习、研究并掌握搜索技术提供了极好的途径与素材,推动了搜索技术的普及与发展,使越来越多的人开始了解并推广使用搜索技术。使用开源搜索引擎,可以大大缩短构建搜索应用的周期,并可根据应用需求打造个性化搜索应用,甚至构建符合特定需求的搜索引擎系统。搜索引擎的开源,无论是对技术人员还是普通用户,都是一个福音。搜索引擎的工作流程主要分为三步:从互联网抓取网页→创建抓取网...原创 2010-02-01 14:31:25 · 147 阅读 · 0 评论 -
刚下载,开始学习lucene时看的文章
Lucene 2.0.0下载安装及测试【下载】下载链接:http://apache.mirror.phpchina.com/lucene/java/archive/以选择lucene-2.0.0.zip下载为例。 【安装】1、在本地磁盘解压缩lucene-2.0.0.zip文件;2、将lucene-demos-2.0.0.jar和lucene-c...原创 2009-09-04 18:43:59 · 197 阅读 · 0 评论 -
Lucene-2.3.1 阅读学习(42)
关于Hits类。这个Hits类可是非常的重要,因为Lucene使用了缓存机制,关于缓存的实现就是在这个Hits类中。Hits工作过程中,使用了LRU算法,即通过一个HitDoc结构来实现一个双向链表,使用LRU置换算法,记录用户最近访问过的Document。开门见山,直接拿出Hits类的实现代码来说话。package org.apache.lucene.search;import ...原创 2009-09-04 18:42:22 · 99 阅读 · 0 评论 -
Lucene 2.3.1 阅读学习(41)
当执行Hits htis = search(query);这一行代码的时候,到底中间经过了怎样的过程,最终使得我们获取到了含有检索结果的集合Hits hits呢?这里,以最简单的检索为例,追踪并理解Lucene(2.2.0版本)获取到检索结果的过程。1、IndexSearcher继承自Searcher类的最简单的search方法,如下所示:public final Hits s...原创 2009-09-04 18:42:05 · 125 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(40)
关于Lucene检索结果的排序问题。已经知道,Lucene的默认排序是按照Document的得分进行排序的。当检索结果集中的两个Document的具有相同的得分时,默认按照Document的ID对结果进行排序。下面研究几种设置/改变检索结果排序的方法。■ 改变Document的boost(激励因子)改变boost的值实现改变检索结果集的排序,是最简单的方法,只需要在建立索引的过...原创 2009-09-04 18:41:47 · 141 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(39)
关于Lucene得分的计算。在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示:public Explanation explain(Weight weight, int doc) throws IOException { return weight.explain(reader, doc);}返回的这个Explanation的实例解释了Luc...原创 2009-09-04 18:41:09 · 108 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(39)
关于Lucene得分的计算。在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示:public Explanation explain(Weight weight, int doc) throws IOException { return weight.explain(reader, doc);}返回的这个Explanation的实例解释了Luc...原创 2009-09-04 18:38:38 · 120 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(38)
关于QueryParser。QueryParser是用来解析用户输入的查询的,将用户的输入的短语进行分析,从而提交Query查询来实现检索。QueryParser一共有三个构造方法,我们通过使用如下的构造方法:public QueryParser(String f, Analyzer a) { this(new FastCharStream(new StringReader(...原创 2009-09-04 18:38:05 · 171 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(26)
如果在初始化一个IndexWriter索引器的时候,指定 useCompoundFile =false,则在指定的索引目录中生成的索引文件就不是.cfs复合索引文件。通过这种方式生成的索引文件,它的不同格式表明了它锁存储的关于索引的不同内容。至少,明确了在建立索引过程中,经过加工处理的数据究竟去向如何,能够加深对Lucene索引过程的理解。通过在文章 Lucene-2.2.0 源代...原创 2009-09-04 18:32:37 · 164 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(25)
复合索引文件格式(.cfs)是如何产生的?从这个问题出发,研究索引文件是如何合并的,这都是IndexWriter类中定义的一些重要的方法。在建立索引过程中,生成的索引文件的格式有很多种。在文章 Lucene-2.2.0 源代码阅读学习(4) 中测试的那个例子,没有对IndexWriter进行任何的客户化设置,完全使用Lucene 2.2.0默认的设置(以及,对Field的设置使用了...原创 2009-09-04 18:31:58 · 129 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(5)
研究Lucene分析器的实现。Analyzer抽象类所有的分析器的实现,都是继承自抽象类Analyzer,它的源代码如下所示:package org.apache.lucene.analysis;import java.io.Reader;public abstract class Analyzer {// 通过Field的名称,和一个Reader对象,创建一个分词流,该方...原创 2009-09-04 18:20:15 · 116 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(4)
建立索引,通过已经生成的索引文件,实现通过关键字检索。写了一个类MySearchEngine,根据上述思想实现,把Lucene自带的递归建立索引的方法提取出来,加了一个搜索的方法:package org.shirdrn.lucene;import java.io.File;import java.io.FileNotFoundException;import java.io.I...原创 2009-09-04 18:19:48 · 119 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(3)
org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中红色部分:static ...原创 2009-09-04 18:19:08 · 126 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(2)
IndexWriter是一个非常重要的工具。建立索引必须从它开始。而且,从它的构造函数开始。Document和Field是Lucene中两个最重要的概念。在建立索引的时候,也就是实例化一个索引器IndexWriter的之前,必须通过已经建立好的Document逻辑文件,将Document的对象添加到IndexWriter实例中,才能算是建立索引。Document汇集数据源,这个数据源是通过...原创 2009-09-04 18:18:40 · 118 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(1)
Lucene-2.3.1 源代码阅读学习 源码下载地址:http://lucene.apache.orgpackage org.apache.lucene.demo;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.index.IndexWriter;import...原创 2009-09-04 18:18:08 · 142 阅读 · 0 评论 -
加速 lucene 的搜索速度 ImproveSearchingSpeed
本文为简单翻译,原文在:http://wiki.apache.org/lucene-java/ImproveSearchingSpeed* Be sure you really need to speed things up.Many of the ideas here are simple to try, but others will necessarily add som...原创 2009-09-03 13:07:22 · 102 阅读 · 0 评论 -
lucene中的filter器群组及其缓存大盘点
lucene中的filter其实并不起眼,大家对其对性能的影响也不是很关注,但实际上filter是除了单纯搜索以外,其他搜索附加功能的必选组件,其性能很大程度上会直接影响搜索的性能,之前我一直认为filter的性能比query高,但事实说明并不完全如此(这里所说的负荷是指io消耗并不是cpu),实际上在lucene中充满着各种io流,也就是说很多东西都无法从根本上保存,这也给缓存带来了很大难度(这...原创 2010-01-20 23:18:09 · 144 阅读 · 0 评论 -
利用bobo-browse 实现lucene的分组统计功能
bobo-browse 是一用java写的lucene扩展组件,通过它可以很方便在lucene上实现分组统计功能。可以从http://code.google.com/p/bobo-browse/上下载和查看相关文档。下面介绍如何使用:第一步:设置相关配置文件 bobo-browse 使用了spring,这里主要配置bobo.spring和field.xm...原创 2010-01-18 17:50:08 · 259 阅读 · 0 评论 -
Lucene范围查询(RangeQuery)的几个问题
对要进行范围查询(RangeQuery)的字段 创建索引的时候要按照 储存 不分词 的方式创建索引。new Field(name, value, Field.Store.YES, Field.Index.UN_TOKENIZED); 1.数字的范围查询对数字进行范围查询,必须先把数字格式化为一样长度的字符串。位数不够的在前面补零。如:Java代码 NumberForma...原创 2009-07-31 08:19:17 · 384 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(6)
Lucene分析器的实现。Lucene分词器Tokenizer,它的继承子类的实现。Tokenizer类的继承关系,如图所示:ChineseTokenizer类实现中文分词中文分词在Lucene中的处理很简单,就是单个字分。它的实现类为ChineseTokenizer,在包org.apache.lucene.analysis.cn中,源代码如下:package org.ap...原创 2009-09-04 18:21:47 · 132 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(7)
CharTokenizer是一个抽象类,它主要是对西文字符进行分词处理的。常见的英文中,是以空格、标点为分隔符号的,在分词的时候,就是以这些分隔符作为分词的间隔符的。package org.apache.lucene.analysis;import java.io.IOException;import java.io.Reader;// CharTokenizer 是一个抽象类publ...原创 2009-09-04 18:22:16 · 107 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(24)
阅读了这么多代码,该综合总结一下了。通过在文章 Lucene-2.2.0 源代码阅读学习(4) 中的那个例子,跟踪一下一个IndexWriter索引器实例化过程,及其建立索引的过程中都经过了哪些处理(主要看涉及到了哪些类来完成建立索引的强大功能)。在文章 Lucene-2.2.0 源代码阅读学习(4) 中的主函数如下所示:public static void main(...原创 2009-09-04 18:31:35 · 125 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(23)
通过对DocumentWriter类的writePostings()方法进行学习。同时,研究并解决几个我一直感到困惑的几个类的用途,以及到底怎样阐述能使自己有一种感性的认识。 writePostings()方法的实现writePostings()方法是对已经经过倒排的文档,将词条的一些有用信息写入到索引段文件中。该方法的实现如下所示:private final vo...原创 2009-09-04 18:31:12 · 136 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(22)
关于FieldInfos类和FieldInfo类。FieldInfo类与一个Document中的一个Field相对应,而FieldInfos类又是多个FieldInfo的容器,对每个Document的所有Field对应的FieldInfo进行管理。FieldInfos类和FieldInfo类之间的关系,恰似SegmentInfos类(可以参考文章 Lucene-2.2.0 源代码阅读学习(...原创 2009-09-04 18:30:33 · 120 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(21)
回到IndexWriter索引器类中来,学习该类添加Document的方法。这时,需要用到一个非常重要的类:DocumentWriter,该类对Document进行了很多处理,比如“文档倒排”就是其中的一项重要内容。实例化一个IndexWriter索引器之后,要向其中添加Document,在IndexWriter类中有两个实现该功能的方法:public void addDocument...原创 2009-09-04 18:30:10 · 116 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(20)
关于Field类和Document类。初始化一个IndexWriter索引器之后,就可以向其中添加Document了。然而,Document逻辑文件能够与一个物理文件对应起来,在Lucene中,Document主要是维护添加到其中的多个Field。关于Field在文章 Lucene-2.2.0 源代码阅读学习(3) 中可以了解到一点相关内容,Field类的定义比较简单,它给出了7种...原创 2009-09-04 18:28:51 · 107 阅读 · 0 评论 -
Lucene-2.3.1 源代码阅读学习(19)
研究SegmentInfo类的实现。虽然在阅读代码的时候,是一件很枯燥的事情,尤其是当代码非常地长,这使得我们感觉这是一种压力,但是如果把代码当成是一种乐趣的时候,你会发现代码是那样的富有感情色彩。呵呵。SegmentInfo类在Lucene 2.0.0版本的时候,定义非常简单,就定义了一个构造函数,如下所示:package org.apache.lucene.index;impo...原创 2009-09-04 18:28:28 · 129 阅读 · 0 评论
分享