`

lucene 3.0 分词例子 转载

阅读更多

 源:http://hxraid.iteye.com/blog/634577

 

首先我们用下面的代码来看看打印标准分词器的运行结果  (在2.9下也可以运行)

 

  
class StandardTest{
	public static void main(String[] args) throws IOException{
		//输入流
		StringReader s=new StringReader(new String("I'm a student. these are apples"));
                //标准分词
		TokenStream tokenStream = new StandardTokenizer(Version.LUCENE_CURRENT, s);
		//标准过滤
                tokenStream=new StandardFilter(tokenStream);
                //大小写过滤
		tokenStream=new LowerCaseFilter(tokenStream);
		
		TermAttribute termAtt=(TermAttribute)tokenStream.getAttribute(TermAttribute.class);
		TypeAttribute typeAtt=(TypeAttribute)tokenStream.getAttribute(TypeAttribute.class);
		OffsetAttribute offsetAtt=(OffsetAttribute)tokenStream.getAttribute(OffsetAttribute.class);
		PositionIncrementAttribute  posAtt=(PositionIncrementAttribute)tokenStream.getAttribute(PositionIncrementAttribute.class);
  		
		
		System.out.println("termAtt       typeAtt       offsetAtt       posAtt");
		while (tokenStream.incrementToken())  {  
			System.out.println(termAtt.term()+" "+typeAtt.type()+" ("+offsetAtt.startOffset()+","+offsetAtt.endOffset()+")   "+posAtt.getPositionIncrement());  
		} 
        }
}

 

打印结果:

termAtt typeAtt offsetAtt posAtt
i'm <APOSTROPHE> (0,3) 1
a <ALPHANUM> (4,5) 1
student <ALPHANUM> (6,13) 1
these <ALPHANUM> (15,20) 1
are <ALPHANUM> (21,34) 1
apples <ALPHANUM> (25,31) 1

 

前面讲 StandardTokenizer的的时候,我们已经谈到了token的这四种属性。在这里我们再次强调一下这些Lucene的基础知识。

 

Lucene 3.0之后,TokenStream中的每一个token不再用next()方法返回,而是采用了incrementToken()方法(具体参见上面)。每调用一次incrementToken(),都会得到token的四种属性信息(org.apache.lucene.analysis.tokenattributes包中):

 

如上例:

原文本:I'm a student. these are apples     

TokenSteam: [1:  I'm ]  [2:a]   [3:student]     [4:these]   [5:are ]   [6:apples]

 

(1) TermAttribute: 表示token的字符串信息。比如"I'm"

(2) TypeAttribute: 表示token的类别信息(在上面讲到)。比如 I'm 就属于<APOSTROPHE>,有撇号的类型

(3) OffsetAttribute:表示token的首字母和尾字母在原文本中的位置。比如 I'm 的位置信息就是(0,3)

(4) PositionIncrementAttribute:这个有点特殊,它表示tokenStream中的当前token与前一个token在实际的原文本中相隔的词语数量。

       比如: 在tokenStream中[2:a] 的前一个token是[1:  I'm ] ,它们在原文本中相隔的词语数是1,则token="a"的PositionIncrementAttribute值为1。如果token是原文本中的第一个词,则默认值为1。因此上面例子的PositionIncrementAttribute结果就全是1了。

       如果我们使用停用词表来进行过滤之后的话:TokenSteam就会变成: [1:  I'm ]   [2:student]    [3:apples]这时student的PositionIncrementAttribute值就不会再是1,而是与[1:  I'm ]在原文本中相隔词语数量=2。而apples则变成了5。

       那么这个属性有什么用呢,用处很大的。加入我们想搜索一个短语student apples(假如有这个短语)。很显然,用户是要搜索出student apples紧挨着出现的文档。这个时候我们找到了某一篇文档(比如上面例子的字符串)都含有student apples。但是由于apples的PositionIncrementAttribute值是5,说明肯定没有紧挨着。怎么样,用处很大吧。轻而易举的解决了短语搜索的难题哦。

 

其实还有两种:PayloadAttribute和FlagsAttribute。

分享到:
评论

相关推荐

    lucene3.0使用介绍及实例

    在这个例子中,我们创建了一个索引,包含一个文档,然后搜索包含"Lucene 3.0"的文档。这个简单的示例展示了Lucene的基本用法,实际应用中可以根据需要扩展,例如添加更多的文档字段、实现更复杂的查询逻辑,或者使用...

    lucene 3.0 例子

    这里的“lucene 3.0 例子”是针对Lucene 3.0版本的一个示例项目,旨在帮助新手快速理解和掌握Lucene的基本用法。 首先,让我们了解一下Lucene 3.0的核心概念: 1. **索引(Indexing)**:Lucene首先将文档内容转化...

    lucene 3.0 入门实例

    通过运行这个例子,你将对 Lucene 3.0 的基本使用有更深入的理解。 总的来说,Lucene 3.0 提供了一套完整的工具集,用于构建高效、灵活的搜索功能。通过熟练掌握 Lucene API,开发者可以轻松地将全文搜索集成到各种...

    lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)-附件资源

    lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)-附件资源

    lucene in action 书中例子源码

    7. **分布式搜索**:虽然3.0版本的Lucene不直接支持分布式搜索,但书中可能包含如何在单机环境下模拟多节点索引和查询的方法,这对于理解后来的Solr或Elasticsearch等分布式搜索系统非常有帮助。 8. **性能优化**:...

    Lucene In Action second edition

    本书主要介绍了 Apache Lucene 3.0 的最新特性与应用方法,适合所有对 Lucene 技术感兴趣的学习者。 #### 二、Lucene 概述 ##### 2.1 什么是 Lucene? Apache Lucene 是一个高性能、全功能的文本搜索引擎库。它...

    解密搜索引擎技术实战Java精华版

    在全文检索部分,结合Lucene3.0介绍了搜索引擎的原理与进展。用简单的例子介绍了Lucene的最新应用方法。包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。本书还进一步介绍了实现准实时搜索的方法,展示了...

    IKAnalyzer中文分词器V3.1.1使用手册

    最初作为开源项目Lucene的一部分,它主要服务于该搜索引擎框架,通过结合词典分词与语法分析算法实现了中文文本的高效分词。 ##### 1.1 结构设计 - **正向迭代最细粒度切分算法**:这是IKAnalyzer的核心算法之一,...

    IKAnalyzer中文分词器V3.2.8使用手册

    | 3.2.0G及后续版本 | 兼容Lucene2.9及3.0版本 | 仅对solr1.4提供接口实现 | 请注意参考对应的版本使用手册以确保正确使用。 ##### 2.3 安装部署 IKAnalyzer的安装包包含了《IKAnalyzer中文分词器V3.X使用手册》...

Global site tag (gtag.js) - Google Analytics