- 浏览: 272336 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (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分析器的实现。
Lucene(分词)过滤器TokenFilter类,以及继承它的子类的实现类。
TokenFilter类的继承关系,如图所示:
TokenFilter是一个抽象类,定义了对一个经过分词(Tokenizer)后的TokenStream进行过滤的功能,它的源代码如下所示:
package org.apache.lucene.analysis;
import java.io.IOException;
public abstract class TokenFilter extends TokenStream {
// 通过输入一个TokenStream
protected TokenStream input;
protected TokenFilter(TokenStream input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
ChineseFilter中文过滤器类:
package org.apache.lucene.analysis.cn;
import java.util.Hashtable;
import org.apache.lucene.analysis.*;
// 中文过滤器,包含了含有外文字符的情况,因为中文搜索的关键字可能是:中文+外文
public final class ChineseFilter extends TokenFilter {
// 这里给出了英文的终止词汇,如果直接调用根本对中文没有过滤作用,或者也可以在此添加终止词汇,比如:“也、了、啊、吧、呵……”等等一些助词叹词,因为这些词语对于检索没有意义
public static final String[] STOP_WORDS = {
"and", "are", "as", "at", "be", "but", "by",
"for", "if", "in", "into", "is", "it",
"no", "not", "of", "on", "or", "such",
"that", "the", "their", "then", "there", "these",
"they", "this", "to", "was", "will", "with"
};
private Hashtable stopTable;
// 构造函数,初始化一个终止词汇表 (过滤掉的词汇)
public ChineseFilter(TokenStream in) {
super(in);
stopTable = new Hashtable(STOP_WORDS.length);
for (int i = 0; i < STOP_WORDS.length; i++)
stopTable.put(STOP_WORDS[i], STOP_WORDS[i]);
}
// 如果stopTable为空,说明该过滤类根本没有进行过滤,直接将读入的词条(Token)返回
public final Token next() throws java.io.IOException {
for (Token token = input.next(); token != null; token = input.next()) {
String text = token.termText(); // 获取分词后词条的内容
// 这里,如果chineseChar是单个字,则Character.getType(chineseChar)返回的类型值为5;大写英文字符类型值为1,小写字符类型值为2
if (stopTable.get(text) == null) { // 如果分词后的词条内容没有出现在过滤列表stopTable中
switch (Character.getType(text.charAt(0))) {
case Character.LOWERCASE_LETTER:
case Character.UPPERCASE_LETTER:
// 如果英文词条不是单个字符
if (text.length()>1) {
return token;
}
break;
case Character.OTHER_LETTER:
// 如果中文的过滤词汇表中是单个字的形式,则若是一个词汇中有一个字出现在stopTable中,那么整个词条都被过滤掉了。这是不合理的;所以只要把stopTable设置为空就可以实现,即不对分词的词条进行过滤
// 也可以在这里添加对词条的限制,来实现过滤
return token;
}
}
}
return null;
}
}
再看一个限制词条长度的过滤器类:
package org.apache.lucene.analysis;
import java.io.IOException;
// 词条过长或者过短,则过滤掉
public final class LengthFilter extends TokenFilter {
final int min;
final int max;
// 构造函数,初始化此条长度上限和下限
public LengthFilter(TokenStream in, int min, int max)
{
super(in);
this.min = min;
this.max = max;
}
// 返回长度在min与max之间的词条
public final Token next() throws IOException
{
for (Token token = input.next(); token != null; token = input.next())
{
int len = token.termText().length();
if (len >= min && len <= max) {
return token;
}
// note: else we ignore it but should we index each part of it?
}
return null;
}
}
可见,过滤器的目的就是对分词获得的词条的一些属性信息进行过滤,原则是:这些属性信息对检索没有实际意义。通过阅读标准过滤器类,再综合各种需要,我们就能根据自己的需要实现词条的过滤。Lucene包里给出的标准过滤器类。其实是对英文字符过滤的的,源代码如下:
package org.apache.lucene.analysis.standard;
import org.apache.lucene.analysis.*;
public final class StandardFilter extends TokenFilter
implements StandardTokenizerConstants {
public StandardFilter(TokenStream in) {
super(in);
}
// APOSTROPHE、ACRONYM等都是在一个常量接口类StandardTokenizerConstants里定义的常量,分别代表在过滤中可能要对其进行处理的字符
private static final String APOSTROPHE_TYPE = tokenImage[APOSTROPHE];
private static final String ACRONYM_TYPE = tokenImage[ACRONYM];
// 如果词条不空,进行处理后返回经过过滤处理后的词条
public final org.apache.lucene.analysis.Token next() throws java.io.IOException {
org.apache.lucene.analysis.Token t = input.next();
if (t == null)
return null;
String text = t.termText();
String type = t.type();
// 英文中的 's或'S对检索意义不大,可以删除掉
if (type == APOSTROPHE_TYPE &&
(text.endsWith("'s") || text.endsWith("'S"))) {
return new org.apache.lucene.analysis.Token
(text.substring(0,text.length()-2),t.startOffset(), t.endOffset(), type);
} else if (type == ACRONYM_TYPE) { // 对“圆点”进行处理,直接把出现的“圆点”删除掉,保留其它字符
StringBuffer trimmed = new StringBuffer();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (c != '.')
trimmed.append(c);
}
return new org.apache.lucene.analysis.Token
(trimmed.toString(), t.startOffset(), t.endOffset(), type);
} else {
return t;
}
}
}
常量接口类StandardTokenizerConstants 定义如下:
package org.apache.lucene.analysis.standard;
public interface StandardTokenizerConstants {
int EOF = 0;
int ALPHANUM = 1;
int APOSTROPHE = 2;
int ACRONYM = 3;
int COMPANY = 4;
int EMAIL = 5;
int HOST = 6;
int NUM = 7;
int P = 8;
int HAS_DIGIT = 9;
int ALPHA = 10;
int LETTER = 11;
int CJ = 12;
int KOREAN = 13;
int DIGIT = 14;
int NOISE = 15;
int DEFAULT = 0;
String[] tokenImage = {
"<EOF>",
"<ALPHANUM>",
"<APOSTROPHE>",
"<ACRONYM>",
"<COMPANY>",
"<EMAIL>",
"<HOST>",
"<NUM>",
"<P>",
"<HAS_DIGIT>",
"<ALPHA>",
"<LETTER>",
"<CJ>",
"<KOREAN>",
"<DIGIT>",
"<NOISE>",
};
}
还有一个org.apache.lucene.analysis.StopFilter类,和ChineseFilter类的实现很相似,只是这里把过滤字符列表是初始化一个StopFilter过滤器的时候指定的,而且该类实现了对过滤字符类表中字符进行转换的功能。
我感觉,最应该好好研究的是关于同义词的过滤问题。Lucene包中给了一个org.apache.lucene.index.memory.SynonymTokenFilter过滤类,比较复杂,因为这里面涉及到了一个重要的类:org.apache.lucene.index.memory.SynonymMap。通过研究对英文中同义词的过滤,来考虑中文同义词过滤的问题。
发表评论
-
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 1129关于PhraseQuery。 PhraseQuery查询是将 ... -
Lucene-2.2.0 源代码阅读学习(33)
2009-06-04 14:20 816关于范围查询RangeQuery ... -
Lucene-2.2.0 源代码阅读学习(32)
2009-06-04 14:18 1128关于SpanQuery(跨度搜索),它是Query的子类,但是 ... -
Lucene-2.2.0 源代码阅读学习(31)
2009-06-04 14:15 1073关于前缀查询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 947关于检索的核心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 954阅读了这么多代码, ... -
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 的配置主要包括两个部分:元数据管理层的配置和数据访问层的配置。元数据管理层的...
3. **Compass** (compass-2.2.0.jar): Compass 是一个基于Lucene的搜索引擎库,它使得在Java应用中集成全文搜索引擎变得更加简单。Compass 提供了ORM级别的搜索引擎功能,可以自动同步数据到索引,使得实时搜索成为...
这款软件的开发遵循开源软件的原则,意味着其源代码对公众开放,允许用户查看、修改和分发,促进社区的协作与改进。 在提供的压缩包文件中,我们可以看到以下组件: 1. `makejar.bat`:这是一个批处理文件,通常...