学习一个库,最好去官网。因为很多库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. 阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量

    阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) 作者:用户 来源:互联网 时间:2016-03-30 13:32:40 安全流量事件https互联网资源 摘要:  ...

  2. wtforms的简单示例

    1.先定义一个类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by xxx on 2017/3/13 from wtforms i ...

  3. C语言获取系统当前时间

    C语言获取系统当前时间 time_t -- 时间类型 struct tm -- 时间结构 time(&now)函数获取当前时间距1970年1月1日的秒数,以秒计数单位. localtime ( ...

  4. java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean

    项目报错:java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean 解决方法: 在pom.xml中加入如下依赖: ...

  5. CSS中英文字符两端对齐实现

    两端对齐实现 一般加上下面2行就可实现 display: inline-block; text-align: justify; 但是对于中英文混杂的情况,中英文难一起实现对齐,原因在下面有分析,需要如 ...

  6. Spark Streaming updateStateByKey案例实战和内幕源码解密

    本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: upda ...

  7. 编写批处理文件编译.Net工程

    使用随Visual Studio一块安装的devenv.com,再加上参数可以对.Net进行编译,如下 "D:\Program Files\Microsoft Visual Studio 8 ...

  8. URAL 1807

    题目大意:给出一个正整数n(n为合数),求n的一个划分(a1,a2,...,ak,...)(k>=2).使得其在存在最大的最大公约数之下,存在最大的最小公倍数. KB     64bit IO ...

  9. 笔记本建立wifi热点的实用详细步骤

    准备工作: (1) 首先要打开开始菜单--->搜索“services.msc” 并打开(或者用win+R快捷键打开“运行”输入“service.msc”,点击确定)--->找到“WLAN ...

  10. ML—朴素贝叶斯

    华电北风吹 日期:2015/12/12 朴素贝叶斯算法和高斯判别分析一样同属于生成模型.但朴素贝叶斯算法须要特征条件独立性如果,即样本各个特征之间相互独立. 一.朴素贝叶斯模型 朴素贝叶斯算法通过训练 ...