目录

  返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html

  本项目Demo已上传GitHub,欢迎大家fork下载学习:https://github.com/kencery/Lucene_Compass(项目内部有很详细的注释)

1.分词器的作用

  a. 在创建索引的时候需要用到分词器,在使用字符串搜索的时候也会用到分词器,并且这两个地方要使用同一个分词器,否则可能会搜索不出来结果。

  b. 分词器(Analyzer)的作用是把一段文本中的词按规则取出所包含的所有词,对应的是Analyzer类,这是一个抽象类(public abstract class org.apache.lucene.analysis.Analyzer),切分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不同的分词器。

  c.关于分词器的详细运行代码,请在GitHub上下载,下载地址:https://github.com/kencery/Lucene_Compass/tree/master/Lucene_5.5,对应的分支为:lucene_five。

2.英文分词器的原理

  a.英文的处理流程为:输入文本,词汇切分,词汇过滤(去除停用词),词干提取(形态还原)、大写转小写,结果输出。

  b. 何为形态还原,意思是:去除单词词尾的形态变化,将其还原为词的原形,这样做可以搜索出更多有意义的结果,比如在搜索student的时候,同事也可以搜索出students的结果。

  c. 任何一个分词法对英文的支持都是还可以的。

3.中文分词器的原理

  a.中文分词比较复杂,并没有英文分词那么简单,这主要是因为中文的词与词之间并不是像英文那样用空格来隔开,

因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如:"我们是中国人","是中"就不是一个词,对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。

    a.1 单字分词:就是按照中文一个字一个字的进行分词,比如:"我们是中国人",分词的效果就是"我","们","是","中","国","人",StandardAnalyzer分词法就是单字分词。

    a.2 二分法分词:按照两个字进行切分,比如:"我们是中国人",分词的效果就是:"我们","们是","是中","中国","国人",CJKAnalyzer分词法就是二分法分词

    a.3 词库分词:按照某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语,通常词库分词被认为是最好的中文分词算法,如:"我们是中国人",分词的效果就是:"我们","中国人",极易分词

MMAnalyzer、庖丁分词、IkAnalyzer等分词法就是属于词库分词。

  b.分词器还有很大,请大家自行查询,它们的实现基本一致,都是Analyzer的子类,故而可以很完美的继承到Lucene中。

4.停用词的规则

  a. 有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的"a、an、the、of"或中文的"的、了、着、是",以及各种标点符号等,这样的词称为停用词,文本经过分词处理后,停用词通常会被过滤掉,不会被进行索引,在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉,这是因为用户输入哦查询字符串也要进行分词处理,排除停用词可以硷蒉建立索引的速度,减小索引库文件的大小。

5.分词器的使用代码

 package com.lyzj.kencery.unit;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* 测试分词器
* 分词器工作流程
* 1.切分,将需要分词的内容进行切分成每个单词或者词语
* 2.去除停用词,有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的“的、了、着、是”,以及各种标点符号等,
* 这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,
* 检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,减小索引库文件的大小。
* 3.对于英文字母,转为小写,因为搜索的时候不区分大小写
* @author kencery
*
*/
public class AnalyzerTest { /**
* StandardAnalyzer分词法测试,对中文支持不是很好,将中文分词成1个字(单字分词)
* @throws Exception
*/
@Test
public void StandardAnalyzerTest() throws Exception{
//英文测试
String text="An IndexWriter creaters and maintains an index.";
Analyzer analyzer=new StandardAnalyzer();
displayTokens(analyzer,text);
//中文测试
String text1="Lucene是全文检索框架";
displayTokens(analyzer,text1);
} /**
* CJKAnalyzerTest分词法测试,对中文支持不是很好,将中文分词成2个字(二分法分词)
*
* @throws Exception
*/
@Test
public void CJKAnalyzerTest() throws Exception{
//英文测试
String text="An IndexWriter creaters and maintains an index.";
Analyzer analyzer=new CJKAnalyzer();
displayTokens(analyzer,text);
//中文测试
String text1="Lucene是全文检索框架";
displayTokens(analyzer,text1);
} /**
* IKAnalyzerTest分词法测试,对中文支持很好,词库分词
* @throws Exception
*/
@Test
public void IKAnalyzerTest() throws Exception{
//英文测试
String text="An IndexWriter creaters and maintains an index.";
Analyzer analyzer=new IKAnalyzer();
displayTokens(analyzer,text);
//中文测试
String text1="韩迎龙易淘食的Lucene是全文检索框架";
displayTokens(analyzer,text1);
} /**
* 使用指定的分词器对指定的文本进行分词,并打印出分出的词,测试分词法的方法
* 备注说明:这里注意版本问题,暂无方法解决
* @param analyzer
* @param text
* @throws Exception
*/
public static void displayTokens(Analyzer analyzer, String text) throws Exception {
System.out.println("当前使用的分词器:" + analyzer.getClass().getName());
//分词流,即将对象分词后所得的Token在内存中以流的方式存在,也说是说如果在取得Token必须从TokenStream中获取,而分词对象可以是文档文本,也可以是查询文本。
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));
//表示token的首字母和尾字母在原文本中的位置。比如I'm的位置信息就是(0,3),需要注意的是startOffset与endOffset的差值并不一定就是termText.length(),
//因为可能term已经用stemmer或者其他过滤器处理过;
OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
//这个有点特殊,它表示tokenStream中的当前token与前一个token在实际的原文本中相隔的词语数量,用于短语查询。比如: 在tokenStream中[2:a]的前一个token是[1:I'm ],
//它们在原文本中相隔的词语数是1,则token="a"的PositionIncrementAttribute值为1;
PositionIncrementAttribute positionIncrementAttribute = tokenStream.addAttribute(PositionIncrementAttribute.class); //问题说明:这里需要使用jdk1.7,如果使用jdk1.8或者jdk1.6则会出现报错信息
//>>如果大家谁有相应的解决方案,请提交到git上我将会合并或者添加我的QQ我们互相讨论
CharTermAttribute charTermAttribute= tokenStream.addAttribute(CharTermAttribute.class); //表示token词典类别信息,默认为“Word”,比如I'm就属于<APOSTROPHE>,有撇号的类型;
TypeAttribute typeAttribute = tokenStream.addAttribute(TypeAttribute.class);
tokenStream.reset(); int position = 0;
while (tokenStream.incrementToken()) {
int increment = positionIncrementAttribute.getPositionIncrement();
if(increment > 0) {
position = position + increment;
}
int startOffset = offsetAttribute.startOffset();
int endOffset = offsetAttribute.endOffset();
String term ="输出结果为:"+ charTermAttribute.toString();
System.out.println("第"+position+"个分词,分词内容是:[" + term + "]" + ",分词内容的开始结束位置为:(" + startOffset + "-->" + endOffset + "),类型是:" + typeAttribute.type());
}
tokenStream.close();
}
}

6. Compass简单介绍(不建议使用)

  a. 已经不建议使用,因为官方已停止更新,支持的Lucene的最高版本为2.4,而当前Lucene的版本已经到了5.5。

  b. 因为是学习,所以简单写了一个Compass的Demo,下载地址:https://github.com/kencery/Lucene_Compass/tree/master/Compass_2.2,项目内部有详细的代码备注。

  c.这里有一篇别人写的Compass博客,个人感觉非常好,地址:http://yufenfei.iteye.com/blog/1683546

  备注:接下来将使用ElasticSearch来做搜索。

Apache Lucene(全文检索引擎)—分词器的更多相关文章

  1. 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示4

    前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用 ...

  2. Apache Lucene(全文检索引擎)—创建索引

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...

  3. 【Lucene】Apache Lucene全文检索引擎架构之构建索引2

    上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...

  4. 【Lucene】Apache Lucene全文检索引擎架构之入门实战1

    Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的 ...

  5. Apache Lucene(全文检索引擎)—搜索

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...

  6. 【Lucene】Apache Lucene全文检索引擎架构之搜索功能3

    上一节主要总结了一下Lucene是如何构建索引的,这一节简单总结一下Lucene中的搜索功能.主要分为几个部分,对特定项的搜索:查询表达式QueryParser的使用:指定数字范围内搜索:指定字符串开 ...

  7. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词

    一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...

  8. Lucene全文检索_分词_复杂搜索_中文分词器

    1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search)  1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...

  9. 【原创】Lucene.Net+盘古分词器(详细介绍)

    本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4.结束语(Demo下载) Lucene.Net简介 Lucene.net是Lucene的.net移 ...

随机推荐

  1. iOS-屏幕适配-UI布局

    iOS 屏幕适配:autoResizing autoLayout和sizeClass 一.图片解说 -------------------------------------------------- ...

  2. python基础总结篇——使用Mysql

    python操作Mysql,很方便,使用的MySQLdb的库,基本的操作如下: 查询: try: conn = MySQLdb.connect(host=self.ip, user=self.user ...

  3. Data Profiling Task

    Data Profiling Task 是用于收集数据的Metadata的Task,在使用ETL处理数据之前,应该首先检查数据质量,对数据进行分析,这将对Table Schema的设计结构和生成ETL ...

  4. JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)

    主要原因:在页面给元素注册点击事件的时候[ $(function () {  XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...

  5. Atom支持Markdown和Latex

    本篇博客主要用于记录Atom编辑器同时支持markdown和latex: 1.安装 安装方法1: (Windows系统)File->Settings->Install中搜索markdown ...

  6. WinForm最小化到托盘以及托盘右键菜单

    首先,先拖一个NotifyIcon到主窗体,然后设置NotifyIcon的图标,不然等下最小化后,都找不到那个程序了,还有那个Text也是,不写名字,就默认是NotifyIcon了..如下图: 然后双 ...

  7. Azure Application Gateway (3) 设置URL路由

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者介绍了Azure Web App可以设置URL路由.如下图: 在这里笔者简单介绍一下,首先我们还是创建以 ...

  8. 软件工程 Android小游戏 猜拳大战

    一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Andr ...

  9. 项目积累html标签

    今天遇到一个不太常用都标签,网上以后慢慢记下项目中用到都东西. 1.<em> 标签 告诉浏览器把其中的文本表示为强调的内容.对于所有浏览器来说,这意味着要把这段文字用斜体来显示. 在文本中 ...

  10. 用jsonp实现搜索框功能

    用jsonp实现搜索框功能 前面的话: 在上周本来想发一篇模仿必应搜索的界面.但是在准备写文章之前突然想到前面学习了ajax技术,在这里我也让我的页面有一种不需要手动刷新就能获取到数据.但是发现用前面 ...