理解Lucene中的Analyzer
学习一个库,最好去官网。因为很多库API变动十分大,从博客上找的教程都过时了。
Lucene原理就是简简单单的“索引”,以空间换时间。但是Lucene将这件事做到了极致,后人再有想写倒排索引的,只能算是练练手。
Lucene的重要模块之一就是分析器模块,这个模块负责对输入文本进行一些处理,比如分词、去除停止词(如“的”、“着”)等琐碎操作。
这个模块产生的token,就相当于键,求token的哈希值,然后把文档id放到对应的桶中。
中文Analyzer有三个,分别是:
- ChineseAnalyzer (in the analyzers/cn package): 一个汉字是一个token。
- CJKAnalyzer (in the analysis/cjk package): 两个汉字是一个token。
- SmartChineseAnalyzer (in the analyzers/smartcn package): 每一个词语是一个token。
这三个Analyzer只有CJKAnalyzer是Lucene标准库中的,另外两个需要额外添加依赖。
它们的效果分别如下:
Example phrase: "我是中国人"
- ChineseAnalyzer: 我-是-中-国-人
- CJKAnalyzer: 我是-是中-中国-国人
- SmartChineseAnalyzer: 我-是-中国-人
显而易见,ChineseAnalyzer和CJKAnalyzer太难用,只有SmartChineseAnalyzer自带分词功能。
下面这段代码,演示了如何创建Analyzer,获取Analyzer的TokenStream,从tokenStream中读取词组。
Analyzer analyzer = new SmartChineseAnalyzer(); // or any other analyzer
TokenStream ts = analyzer.tokenStream("myfield", new StringReader("床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
// The Analyzer class will construct the Tokenizer, TokenFilter(s), and CharFilter(s),
// and pass the resulting Reader to the Tokenizer.
OffsetAttribute offsetAtt = ts.addAttribute(OffsetAttribute.class);
try {
ts.reset(); // Resets this stream to the beginning. (Required)
while (ts.incrementToken()) {
// Use AttributeSource.reflectAsString(boolean)
// for token stream debugging.
System.out.println("token: " + ts.reflectAsString(true));
System.out.println("token start offset: " + offsetAtt.startOffset());
System.out.println(" token end offset: " + offsetAtt.endOffset());
}
ts.end(); // Perform end-of-stream operations, e.g. set the final offset.
} finally {
ts.close(); // Release resources associated with this stream.
}
tokenStream对象可以添加以下属性,用来获取token的附加信息
- OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
- PositionIncrementAttribute positionIncrementAttribute = tokenStream.addAttribute(PositionIncrementAttribute.class);
- CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
- TypeAttribute typeAttribute = tokenStream.addAttribute(TypeAttribute.class);
以上内容来自Lucene官方文档,但是据我观察ChineseAnalyzer已经不见了,因为它跟StandardAnalyzer没啥区别。
可见即便是官方文档也存在各种版本问题。
所以学习一定要随随便便学点,不能过于较真,不能过于相信文档。
理解Lucene中的Analyzer的更多相关文章
- 理解Lucene中的Query
Query是一个接口,它有很多实现类. QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuer ...
- Lucene中Analyzer语句分析
Lucene中Analyzer语句分析,利用lucene中自带的词法分析工具Analyzer,进行对句子的分析. 源代码如下: package com.test; import java.io.IOE ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- 基础:从概念理解Lucene的Index(索引)文档模型
转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Fi ...
- lucene 中关于Store.YES 关于Store.NO的解释
总算搞明白 lucene 中关于Store.YES 关于Store.NO的解释了 一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储. 这样的解释有点郁闷:字面意 ...
- 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析
通过第四章的学习,可以了解lucene的分析过程是怎样的,并且可以学会如何使用lucene内置分析器,以及自定义分析器.下面是具体总结 1. 分析(Analysis)是什么? 在lucene中,分析就 ...
- lucene中Field简析
http://blog.csdn.net/zhaoxiao2008/article/details/14180019 先看一段lucene3代码 Document doc = new Document ...
- Lucene 中的Tokenizer, TokenFilter学习
lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用后产生语汇单元序列的类,其中有两个类型:Tokenizer和TokenFilte ...
- 如何理解javaSript中函数的参数是按值传递
本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...
随机推荐
- (转载)ios的一些知识点
ios的一些知识点 一 非ARC的内存管理情况 1-autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一 段落 ...
- oracle和mysql功能相同的函数
wm_concat ---->mysql 的group_concat decode (两条件的)----->mysql 的 if decode (3个及以上条件的)---------> ...
- SQL中以count或sum为条件的查询方式
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7 例1:查询出现 ...
- HDU1161 Eddy's mistakes
Eddy's mistakes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- UICamera(NGUI Event system)原理
看了UICamera的源码就显而易见了: UICamera « on: November 21, 2013, 12:21:48 AM » Overview UICamera is a somewh ...
- Package.json小结
生成package.json 定位到想放置package.json的目录,运行npm init,根据提示就可以生成package.json文件,其中test command可以为空. 安装mo ...
- 有关String的转换的一篇好文章
Pay Close Attention - String Handling I need to make a detour for a few moments, and discuss how t ...
- 3. Layout -- 1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orient ...
- windowsclient开发--duilib显示html
今天与大家分享的就是duilib这个库中,怎样做到显示html的. 有些控件,如Text能够通过showhtml函数来设置是否显示html富文本. 加粗 {b}加粗{/b} 斜体 {i}斜体{/i} ...
- AngularJS是什么?
AngularJS扩展了HTML? 看了几天AngularJS的各种中文教程,一直没有理解AngularJS是做什么的. 直到今天了英文文档,才有了初步了解. HTML是静态语言. JavaScrip ...