lucene的Analyzer类里面主要包含这个方法:
public abstract class Analyzer{
public abstract TokenStream tokenStream(String fieldName, Reader reader);
}
-------------------------------------------------------------------
public abstract class TokenStream {
......
public Token next(final Token reusableToken) throws IOException {
// We don't actually use inputToken, but still add this assert
assert reusableToken != null;
return next();
}
......
}
所有要实现analyzer的类都要重写这个方法,获取自己制定的Tokenizer(Tokenizer继承于TokenStream)。而分词的主要方法就是TokenStream里面提供的next()方法,所有继承TokenStream类的方法都要重写这个next()方法,以制定自己分词器。
//下面分析一下StandAnalyzer,它继承于Analyzer,StandAnalyzer里面的tokenStream方法如下:
public class StandardAnalyzer extends Analyzer {
......
public TokenStream tokenStream(String fieldName, Reader reader) {
StandardTokenizer tokenStream = new StandardTokenizer(reader, replaceInvalidAcronym); //使用了StandardTokenizer
tokenStream.setMaxTokenLength(maxTokenLength);
TokenStream result = new StandardFilter(tokenStream);
result = new LowerCaseFilter(result);
result = new StopFilter(result, stopSet);
return result;
}
}
-----------------------------------------------------------------
//StandardTokenizer的next方法如下:
public class StandardTokenizer extends Tokenizer {
.......
public Token next(final Token reusableToken) throws IOException {
assert reusableToken != null;
int posIncr = 1;
while(true) {
int tokenType = scanner.getNextToken();
if (tokenType == StandardTokenizerImpl.YYEOF) {
return null;
}
if (scanner.yylength() <= maxTokenLength) {
reusableToken.clear();
reusableToken.setPositionIncrement(posIncr);
scanner.getText(reusableToken);
final int start = scanner.yychar();
reusableToken.setStartOffset(start);
reusableToken.setEndOffset(start+reusableToken.termLength());
// This 'if' should be removed in the next release. For now, it converts
// invalid acronyms to HOST. When removed, only the 'else' part should
// remain.
if (tokenType == StandardTokenizerImpl.ACRONYM_DEP) {
if (replaceInvalidAcronym) {
reusableToken.setType(StandardTokenizerImpl.TOKEN_TYPES[StandardTokenizerImpl.HOST]);
reusableToken.setTermLength(reusableToken.termLength() - 1); // remove extra '.'
} else {
reusableToken.setType(StandardTokenizerImpl.TOKEN_TYPES[StandardTokenizerImpl.ACRONYM]);
}
} else {
reusableToken.setType(StandardTokenizerImpl.TOKEN_TYPES[tokenType]);
}
return reusableToken;
} else
// When we skip a too-long term, we still increment the
// position increment
posIncr++;
}
}
......
}
测试代码:
public class TestAnalyzer {
final static String TEXT = "hadoop is very good,xina a tooken finished!";
@SuppressWarnings("deprecation")
public void testTokenizer() throws IOException{
Reader reader = new StringReader(TEXT);
StandardTokenizer tokenizer = new StandardTokenizer(reader);
for (Token t = tokenizer.next();t!=null;t = tokenizer.next()) {
System.out.println(t.startOffset() +"--" + t.endOffset() + ": "+ t.termText());
}
}
public static void main(String[] args) throws IOException {
TestAnalyzer t = new TestAnalyzer();
t.testTokenizer();
}
}
//lucene2.4.1新API的测试用法:
TokenStream ts = analyzer.tokenStream("text", new StringReader(txt));
for(Token t= new Token(); (t=ts.next(t)) !=null;) {
System.out.println(t);
}
分享到:
相关推荐
用java实现的,利用了lucene里面的standardAnalyzer分析器实现的分词,可以去停用词,再利用波特算法实现 词干提取 最后排序 和词频统计输出
本文构造出一种适应中英文信息处理的Lucene语言分析器,该分析器的核心模块——分词器所使用的分词算法是一种基于词典的中文分词算法,该算法具体实现上采用了基于词前缀哈希技术来进行逐字匹配,采用基于规则统计...
lucene自带的词频分析功能,该源代码流程为:先从数据库中读取数据,写入TXT文本中,使用lucene进行索引,然后得出词频分析结果。
非常珍贵的Lucene入门实例,让你在最短时间内掌握Lucene快速创建索引,中文分词查询的技巧。 内赠送lucene驱动包,物超所值哦!!
IKAnalyzer是一个开源的,基于Java语言开发的轻量级的中文分词语言包,它是以Lucene为应用主体,结合词典分词和文法分析算法的中文词组组件。从3.0版本开始,IK发展为面向java的公用分词组件,独立Lucene项目,同时...
Struts标签Lucene中文分词构建基于词典的Lucene分析器使用Log4j进行日志记录 您使用过旅游指南吗?它总是能让我们快速的找到目的地。我对此有深刻的印象,希望这篇指南也能使您快速的完成Struts标签相关的任务。我...
IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版... 在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
本系列文章尚在撰写之中,将会有分词器,段合并,QueryParser,查询语句与查询对象,搜索过程,打分公式的推导等章节。 提前给大家分享,希望大家批评指正。 Lucene学习总结之一:全文检索的基本原理 ...
IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...
最初是一个基于开源项目 Luence 为主要应用,结合词典分词和语法分析算法的中文分词组件。 从3.0版本开始,IK已经发展成为Java通用的分词组件,独立于Lucene项目,同时提供了Lucene的默认优化实现。 在 2012 版本中...
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IK Analyzer 3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
此版本是基于IK-Analyzer-2012FF修改而来,专门适用于Lucene 5.2.1。 IK Analyzer 是一个开源的,基于java语言...在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IK...在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
针对Lucene自带中文分词器分词效果差的缺点,在分析现有分词词典机制的基础上,设计了基于全哈希整词二分算法的分词器,并集成到Lucene中,算法通过对整词进行哈希,减少词条匹配次数,提高分词效率。该分词器词典...
1.IKAnalyzer3.0介绍 IKAnalyzer是一个开源的,基于java... * 针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
Lucene的基础知识 1、案例分析:什么是全文检索...a) 测试分析器的分词效果 b) 第三方中文分析器 7、索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 Lucene的高级查询、solr入门 solr在项目中的应用及电商搜索实现
根据lucene最新版本5.5做同义词分析器,熟悉内部分析构造
使用Lucene 分词器Jsceg IkAnalyzer jar包 ucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
(1) 自定义Stop分词器 26 (2) 实现简单同义词索引 27 第五章 高级搜索 32 5.1 搜索排序 34 (1) 建立搜索类 34 (2) 默认排序 35 (3) 根据评分排序 35 (4) 根据索引号排序 36 (5) 根据文件大小排序 36 (6) 根据日期...