学习一个库,最好去官网。因为很多库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的更多相关文章

  1. 理解Lucene中的Query

    Query是一个接口,它有很多实现类. QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuer ...

  2. Lucene中Analyzer语句分析

    Lucene中Analyzer语句分析,利用lucene中自带的词法分析工具Analyzer,进行对句子的分析. 源代码如下: package com.test; import java.io.IOE ...

  3. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.ƒDirectory.ƒAnalyzer.ƒDocument.ƒField 1.IndexWriter IndexWr ...

  4. 基础:从概念理解Lucene的Index(索引)文档模型

    转:http://blog.csdn.net/duck_genuine/article/details/6053430   目录(?)[+]   Lucene主要有两种文档模型:Document和Fi ...

  5. lucene 中关于Store.YES 关于Store.NO的解释

    总算搞明白 lucene 中关于Store.YES  关于Store.NO的解释了 一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储. 这样的解释有点郁闷:字面意 ...

  6. 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析

    通过第四章的学习,可以了解lucene的分析过程是怎样的,并且可以学会如何使用lucene内置分析器,以及自定义分析器.下面是具体总结 1. 分析(Analysis)是什么? 在lucene中,分析就 ...

  7. lucene中Field简析

    http://blog.csdn.net/zhaoxiao2008/article/details/14180019 先看一段lucene3代码 Document doc = new Document ...

  8. Lucene 中的Tokenizer, TokenFilter学习

      lucene中的TokenStream,TokenFilter之间关系   TokenStream是一个能够在被调用后产生语汇单元序列的类,其中有两个类型:Tokenizer和TokenFilte ...

  9. 如何理解javaSript中函数的参数是按值传递

    本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...

随机推荐

  1. vim/vi 命令详解

    在工作中,要对服务器上的文件进行的修改,可以使用ssh远程登录到服务器上,并且使用vi进行快速的编辑即可,在没有图形界面的环境下,要编辑文件,vi是最佳选择! vi命令是Linux中最经典的文本编辑器 ...

  2. C语言:内存的分配与管理

    1.内存区域的划分标准: 代码段             存储代码 数据段             静态/全局数据.常量(const)      堆区(heap)           动态内存分配(更 ...

  3. 混沌数学之Rössler(若斯叻)吸引子

    若斯叻吸引子(Rössler attractor)是一组三元非线性微分方程: frac{dx(t)}{dt} = -y(t)-z(t) frac{dy(t)}{dt} = x(t)+a*y(t) fr ...

  4. 关于opacity的思考

    今天在封装图片轮播的插件的时候,产生了这个opacity的小小思考. 我这个轮播的思路不是以前baidu输入法官网的设置外层容器overflow为hidden,position为relative用se ...

  5. IE6与CSS样式兼容问题汇总

    1.PNG半透明图片的问题 虽然可以通过JS等方式解决,但依然存在载入速度等问题,所以,这个上能不要用还是尽量不要用.以达到网站最大优化. 2.IE6下的圆角 IE6不支持CSS3的圆角属性,比较好的 ...

  6. 宿主机为linux、windows分别实现VMware三种方式上网(转)

    一.VMware三种方式工作原理1 Host-only连接方式  让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ...

  7. Android生成带图片的二维码

    一.问题描述 在开发中需要将信息转换为二维码存储并要求带有公司的logo,我们知道Google的Zxing开源项目就很好的帮助我们实现条形码.二维码的生成和解析,但带有logo的官网并没有提供demo ...

  8. idea 设置代码的颜色

  9. ZH奶酪:在博客中添加Latex公式

    1. 点击编辑器中的插入图片: 2.在URL输入下边的地址: http://latex.codecogs.com/gif.latex?你的latex代码 就可以了-

  10. 在自己的服务器上部署 GitLab 社区版

    GitLab 简介 因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.这篇文章是在 Gitlab 7.4 的环境下配置的,相关内容可能已经过时. 后续做了一次迁移,将 Gi ...