前言

前面几篇文章我们对Lucene中索引的创建等相关知识进行了初步的学习,不了解的读者请移步

Lucene应用实战(一)——索引创建与搜索Lucene应用实战(二)——Field域的使用及索引库的维护

接下来思考一个问题,我们创建的索引,是不是符合我们搜索要求的索引呢?

平日里我们搜索东西的时候,输入某个关键词,有时候能搜出来,有时候搜别的关键词就搜不出来。

用户输入的关键词和我们存储的索引之间会有一个匹配的过程,如果能匹配的上,那么就返回相应结果。

索引创建是很关键的一环,而分词又是索引创建的核心,直接影响到索引的质量。

接下来我们来从分词入手,详细拆解索引创建过程中分词的流程。

分词的相关概念

分词器:采集到的数据会存储到Document对象的Field域中,分词器就是将Document中Field的value 值切分成一个一个的词。 停用词:停用词是为节省存储空间和提高搜索效率,搜索程序在索引页面或处理搜索请求时会自动忽略某 些字或词,这些字或词即被称为Stop Words(停用词)。比如语气助词、副词、介词、连接词等,通常自 身并无明确的意义,只有将其放入一个完整的句子中才有一定作用,如常见的“的”、“在”、“是”、“啊” 、 a、an、the 等。 扩展词:扩展词就是分词器默认不会切出的词 但我们希望分词器切出这样的词 。

过滤:包括去除标点符号过滤、去除停用词过滤(的、是、a、an、the等)、大写转小写、词的形还原 (复数形式转成单数形参、过去式转成现在式。。。)等。

分词器案例

标准分词器StandardAnalyzer

对于分词来说,不同的语言,分词规则不同。Lucene作为一个工具包提供不同国家的分词器。在前面的学习中,我们都使用的StandardAnalyzer,它可以对用英文进行分词。StandardAnalyzer的demo案例可见 Lucene应用实战(二)——Field域的使用及索引库的维护

StandardAnalyzer的部分源码如下:

源码当中,Tokenizer就是分词器,负责将reader转换为语汇单元即进行分词处理,Lucene提供了很多的分词器, 也可以使用第三方的分词,比如IKAnalyzer一个中文分词器。 TokenFilter是分词过滤器,负责对语汇单元进行过滤,TokenFilter可以是一个过滤器链儿,Lucene提 供了很多的分词器过滤器,比如大小写转换、去除停用词等。

如下图是语汇单元的生成过程: 创建一个Tokenizer分词器,经过三个TokenFilter生成语汇单元Token。

Tokenizer --->TokenFilter(标准过滤)--->TokenFilter(大小写过滤)--->TokenFilter(停用词过滤)---->Tokens

比如下边的文档经过分析器分析如下: 原文档内容: Lucene is java full text search lib 分析后得到的多个语汇单元: lucene java full text search lib注意:搜索使用的分词器要和索引使用的分词器一致。

中文分词器

简介

英文是以单词为单位的,单词与单词之间以空格或者逗号句号隔开。所以对于英文,我们可以简单以 空格判断某个字符串是否为一个单词,比如I love China,love 和 China很容易被程序区分开来。

而中文则以字为单位,字又组成词,字和词再组成句子。中文“我爱中国”就不一样了,电脑不知道“中国”是一个词语还是“爱中”是一个词语。 把中文的句子切分成有意义的词,就是中文分词,也称切词。我爱中国,分词的结果是:我、爱、我 爱、中国。

Lucene自带中文分词器

Lucene自带的分词器有StandardAnalyzer和CJKAnalyzer,他们分别可以进行分词:

StandardAnalyzer

StandardAnalyzer是按单字分词,即按照中文一个字一个字地进行分词。如:“我是中国人啊”, 效果:“我”、“是”、“中”、“国” 、“人”、“啊”。

CJKAnalyzer

CJKAnalyzer是按二分法分词,即按两个字进行切分。如:“我是中国人啊”,效果:“我是”、“是中”、“中国、 “国人”、 “人 啊”。 总结:上边两个分词器无法满足需求。

中文分词器IKAnalyzer

我们现在主要使用的中文分词器就是IKAnalyzer。下面我们重点来介绍下IKAnalyzer。

IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将 Analyzer测试代码改为IKAnalyzer测试中文分词效果。

将“我是拉勾人啊”这句话使用IKAnalyzer分词器进行分词的话,效果如下:

可以看到“我是拉勾人啊”这句话一共分了6个词,分别是“是”、“拉勾”、“我是”、“我”、“勾人”、“人啊”。

其中还是有些不尽如人意的地方,这时候就需要我们进行手动扩展词库了。我们来看下如何扩展中文词库。

扩展中文词库

我们如果想配置扩展词和停用词,就创建扩展词的文件和停用词的文件 。

需要注意的一点:不要用window自带的记事本保存扩展词文件和停用词文件,那样的话,格式中是含有bom的。

文件目录结构如下:

IKAnalyzer.cfg.xml里面配置停用词和扩展词的路径:

stopword.dic里加上两个停用词:

1
2
勾人
人啊

ext.dic里配置上一个扩展词:

1
是拉

重新运行,加载索引,查看:

控制台输出已加载停用词及扩展词字典。

通过luke工具查看分词的结果:

索引的结果与预期相符。

总结

我们主要学习了分词器的相关概念,如停用词、扩展词等等,然后对Lucene自带的标准分词器及常用的中文分词器IkAnalyzer进行了简单的使用,最后对如何使用停用词和扩展词功能进行了实战。