- 浏览: 272136 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (195)
- EXT学习 (2)
- hibernate (3)
- drools (1)
- TDD测试驱动开发 (3)
- js (7)
- php (3)
- appfuse (2)
- css (5)
- 站长文库 (15)
- flex (6)
- lucene (43)
- 业务建模 (1)
- Pentaho Report Designer (1)
- 代码质量 (10)
- webservice (2)
- 美工 (3)
- dot net (7)
- 人生 (5)
- 方法论 (3)
- html (4)
- 需求管理 (2)
- 资源分享 (2)
- JAVA (6)
- IDE--intelij文章收集 (5)
- 爬虫学习 (1)
- air (2)
- json转换 (1)
- Linux (2)
- C C++ (1)
- mysql word export 导出 (1)
- avast windows server 2003 (3)
- Linux yum (1)
- flash as3 actionscript 错误码 参考 (1)
- actionscript (1)
- 快速开发 (2)
- ios (0)
- erLang (1)
- 手机开发 (1)
- mysql (1)
- 苹果 MacOs (1)
最新评论
-
cuidongdong1234:
有没有源码分析呀?
初步了解jackson -
ieblaze:
您好!我测试了下 ,启动不成警告: Could not get ...
Embed Tomcat 开发,调试项目 -
Feegle7:
楼主,你这个ppt太花了,估计,大家根本没心思看内容了
drools的学习总结 -
filix:
zhoche2008 写道本来写得挺好的。非要搞一些PPT动画 ...
drools的学习总结 -
zhoche2008:
这PPT真耗资源,服了
drools的学习总结
研究Lucene分析器的实现。
Analyzer抽象类
所有的分析器的实现,都是继承自抽象类Analyzer,它的源代码如下所示:
package org.apache.lucene.analysis;
import java.io.Reader;
public abstract class Analyzer {
// 通过Field的名称,和一个Reader对象,创建一个分词流,该方法是抽象方法
public abstract TokenStream tokenStream(String fieldName, Reader reader);
//个人理解,感觉这个方法是在后台分词用的,因为对一个文件建立索引,要构造Field,可能有重复的。
public int getPositionIncrementGap(String fieldName)
{
return 0;
}
}
这里,tokenStream()的作用非常大。它返回一个TokenStream类对象,这个TokenStream类对象应该是已经经过分词器处理过的。
与Analyzer抽象类有关的其他类
TokenStream也是一个抽象类:
package org.apache.lucene.analysis;
import java.io.IOException;
// 对后台选择的待分析处理的文件,一个TokenStream对象包含了对这个文件分词的词条序列
public abstract class TokenStream {
// 返回下一个分词的词条
public abstract Token next() throws IOException;
// 重置一个分词流,恢复到分词工作的开始状态
public void reset() throws IOException {}
// 关闭分词流,停止分词
public void close() throws IOException {}
}
TokenStream类的方法表明,它最基本的是对分词流的状态进行管理。具体地,它如何对分析的对象处理,应该从继承该抽象类的子类的构造来看。
在包org.apache.lucene.analysis下可以看到有两个TokenStream的子类:Tokenizer和TokenFilter,它们还都是抽象类,从这两个抽象类可以看出,是在TokenStream的基础上,按照功能进行分类实现:处理分词、过滤分词。
Tokenizer类在Lucene中定义如下所示:
package org.apache.lucene.analysis;
import java.io.Reader;
import java.io.IOException;
// Tokenizer所处理的输入来源是一个Reader对象
public abstract class Tokenizer extends TokenStream {
// 一个Reader对象作为它的成员
protected Reader input;
protected Tokenizer() {}
protected Tokenizer(Reader input) {
this.input = input;
}
// 关闭输入流
public void close() throws IOException {
input.close();
}
}
接着,看看TokenFilter类的实现,TokenFilter类在Lucene中定义如下所示:
package org.apache.lucene.analysis;
import java.io.IOException;
// TokenFilter是TokenStream的子类,在分词之后进行,起过滤器的作用
public abstract class TokenFilter extends TokenStream {
// 它以一个TokenStream对象作为成员
protected TokenStream input;
protected TokenFilter(TokenStream input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
TokenFilter是可以嵌套Tokenizer的:
当一个Tokenizer对象不为null时,如果需要对其进行过滤,可以构造一个TokenFilter来对分词的词条进行过滤。
同样地,在包org.apache.lucene.analysis下可以找到继承自Tokenizer类的具体实现类。
很明显了,实现Tokenizer类的具体类应该是分词的核心所在了。
对指定文本建立索引之前,应该(1)先构造Field对象,在此基础上(2)再构造Document对象,然后(3)添加到IndexWriter中进行分析处理。在(4)这个分析处理过程中,包含对其进行分词(Tokenizer),而(5)经过分词处理以后,返回的是一个Token对象(经过分词器得到的词条),它可能是Field中的一个Term的一部分。
看一看Token类都定义了哪些内容:
package org.apache.lucene.analysis;
import org.apache.lucene.index.Payload;
import org.apache.lucene.index.TermPositions;
public class Token implements Cloneable {
String termText; // 一个词条的内容
int startOffset; // 记录在源文件中第一次出现的位置
int endOffset; // 记录在源文件中最后一次出现的位置t
String type = "word"; // lexical type
Payload payload;
private int positionIncrement = 1; // 位置增量
public Token(String text, int start, int end) { // 初始化一个词条实例时,初始化词条文本内容、开始位置、最后位置
termText = text;
startOffset = start;
endOffset = end;
}
public Token(String text, int start, int end, String typ) { // 初始化一个词条实例时,初始化词条文本内容、开始位置、最后位置、类型
termText = text;
startOffset = start;
endOffset = end;
type = typ;
}
// 设置位移增量的,相对于TokenStream中该Token的前一个,只能设置为1或0
//默认为1,如果为0,则表示多个Term都具有同一个位置。
public void setPositionIncrement(int positionIncrement) {
if (positionIncrement < 0)
throw new IllegalArgumentException
("Increment must be zero or greater: " + positionIncrement);
this.positionIncrement = positionIncrement;
}
public int getPositionIncrement() { return positionIncrement; }
// 设置词条(Token)的内容
public void setTermText(String text) {
termText = text;
}
public final String termText() { return termText; }
// 返回该词条(Token)在一个文件(待建立索引的文件)中的起始位置
public final int startOffset() { return startOffset; }
// 返回该词条(Token)在一个文件(待建立索引的文件)中的结束位置
public final int endOffset() { return endOffset; }
// 返回Token's lexical type
public final String type() { return type; }
// Payload是一个元数据(metadata)对象,对每个检索的词条(Term)都设置相应的Payload,存储在index中,通过Payload可以获取一个词条(Term)的详细信息
public void setPayload(Payload payload) {
this.payload = payload;
}
public Payload getPayload() {
return this.payload;
}
// 将一个词条(Token) 的信息,转换成字符串形式,在该字符串中,使用逗号作为每个属性值的间隔符
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("(" + termText + "," + startOffset + "," + endOffset);
if (!type.equals("word"))
sb.append(",type="+type);
if (positionIncrement != 1)
sb.append(",posIncr="+positionIncrement);
sb.append(")");
return sb.toString();
}
// 需要的时候,该Token对象 可以被克隆
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e); // shouldn't happen since we implement Cloneable
}
}
}
继承Tokenizer类的直接子类
Tokenizer类的直接子类有:
CharTokenizer(抽象类)、KeywordTokenizer、
org.apache.lucene.analysis.standard.StandardTokenizer、
org.apache.lucene.analysis.cn.ChineseTokenizer、
org.apache.lucene.analysis.ngram.NGramTokenizer、
org.apache.lucene.analysis.ngram.EdgeNGramTokenizer。
其中:
CharTokenizer是一个抽象类,它又有3个子类,如下:
org.apache.lucene.analysis.ru.RussianLetterTokenizer、
.WhitespaceTokenizer、LetterTokenizer(都和CharTokenizer类在包org.apache.lucene.analysis里)。
最后,LowerCaseTokenizer是最终类,又是LetterTokenizer类的子类
发表评论
-
Lucene-2.2.0 源代码阅读学习(40)
2009-06-04 14:37 1209关于Lucene检索结果的排序问题。 已经知道,Luce ... -
Lucene-2.2.0 源代码阅读学习(39)
2009-06-04 14:35 898关于Lucene得分的计算。 在IndexSearche ... -
Lucene-2.2.0 源代码阅读学习(38)
2009-06-04 14:34 1499关于QueryParser。 QueryPars ... -
Lucene-2.2.0 源代码阅读学习(37)
2009-06-04 14:32 970关于MultiTermQuery查询。 ... -
Lucene-2.2.0 源代码阅读学习(36)
2009-06-04 14:23 1054关于MultiTermQuery查询。 ... -
Lucene-2.2.0 源代码阅读学习(35)
2009-06-04 14:22 763关于MultiPhraseQuery(多短语查询)。 Mul ... -
Lucene-2.2.0 源代码阅读学习(34)
2009-06-04 14:21 1124关于PhraseQuery。 PhraseQuery查询是将 ... -
Lucene-2.2.0 源代码阅读学习(33)
2009-06-04 14:20 816关于范围查询RangeQuery ... -
Lucene-2.2.0 源代码阅读学习(32)
2009-06-04 14:18 1126关于SpanQuery(跨度搜索),它是Query的子类,但是 ... -
Lucene-2.2.0 源代码阅读学习(31)
2009-06-04 14:15 1071关于前缀查询PrefixQuery(前缀查询)。 准备工作就 ... -
Lucene-2.2.0 源代码阅读学习(30)
2009-06-04 14:14 864关于Query的学习。 主要使用TermQuery和Bool ... -
Lucene-2.2.0 源代码阅读学习(29)
2009-06-04 14:12 1051关于IndexSearcher检索器。 ... -
Lucene-2.2.0 源代码阅读学习(28)
2009-06-04 14:09 945关于检索的核心IndexSearcher类。 IndexSe ... -
Lucene-2.2.0 源代码阅读学习(27)
2009-06-04 14:07 871关于Lucene的检索(IndexSearcher)的内容 ... -
Lucene-2.2.0 源代码阅读学习(26)
2009-06-04 14:06 1136如果在初始化一个IndexWr ... -
Lucene-2.2.0 源代码阅读学习(25)
2009-06-04 14:03 874复合索引文件格式(.cfs)是如何产生的?从这个问题出发,研究 ... -
Lucene-2.2.0 源代码阅读学习(24)
2009-06-04 13:58 952阅读了这么多代码, ... -
Lucene-2.2.0 源代码阅读学习(23)
2009-06-04 13:55 829通过对DocumentWriter类的writePosting ... -
Lucene-2.2.0 源代码阅读学习(22)
2009-06-04 13:54 878关于FieldInfos类和FieldInfo类。 Fi ... -
Lucene-2.2.0 源代码阅读学习(21)
2009-06-04 13:53 850回到IndexWriter索引器类 ...
相关推荐
lucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-...
《深入剖析Lucene 2.2.0源代码》 Lucene是一款强大的开源全文搜索引擎库,由Apache软件基金会开发并维护。它为Java开发者提供了一种高性能、可扩展的文本检索核心工具。本文将深入探讨Lucene 2.2.0版本的源代码,...
在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...
2. **Tomcat 安装**: Tomcat 是一个免费的开放源代码的 Web 应用服务器,文中提到使用的是 Tomcat 5.0 版本。同样地,当前的 Tomcat 版本已经更新到了更高的版本,例如 Tomcat 9 或者 10。安装完成后,需要配置 ...
安装过程可以分为两步:首先下载 Atlas2.2.0 的源代码,然后使用 Maven 编译和打包 Atlas2.2.0。 Atlas2.2.0 的配置 Atlas2.2.0 的配置主要包括两个部分:元数据管理层的配置和数据访问层的配置。元数据管理层的...
5. **Lucene** (lucene-core.jar): Lucene 是Apache软件基金会的一个开源全文搜索引擎库,提供索引和搜索功能,具有高效、灵活的特点。在巴巴运动网项目中,Lucene可能被用作底层的搜索技术,通过Compass进行封装和...
5. `lucene-core-2.2.0.jar`:Lucene是一个高性能、全文本搜索库,这里可能是用于SidekickNotes的搜索功能,帮助用户快速查找和检索笔记。 6. `junit.jar`:JUnit是Java编程语言的一个单元测试框架,开发者可能用它...