首页 > 代码库 > Lucene系列:(6)分词器

Lucene系列:(6)分词器


1、什么是分词器

    采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索


2、为什么要分词器

     因为用户输入的搜索的内容是一段文本中的一个关健字,和原始表中的内容有差别,但作为搜索引擎来讲,又得将相关的内容搜索出来,此时就得采用分词器来最大限度匹配原始表中的内容。


3、分词器工作流程

     (1)按分词器拆分出词汇

     (2)去除停用词和禁用词

     (3)如果有英文,把英文字母转为小写,即搜索不分大小写


4、演示常用分词器测试

这里测试需要引入IKAnalyzer3.2.0Stable.jar


package com.rk.lucene.b_analyzer;

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.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.fr.FrenchAnalyzer;
import org.apache.lucene.analysis.ru.RussianAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.rk.lucene.utils.LuceneUtils;

/**
 * 测试Lucene内置和第三方分词器的分词效果
 */
public class TestAnalyzer {
	private static void testAnalyzer(Analyzer analyzer, String text) throws Exception{
		System.out.println("当前使用的分词器:" + analyzer.getClass());
		TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));
		tokenStream.addAttribute(TermAttribute.class);
		while(tokenStream.incrementToken()){
			TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);
			System.out.print(termAttribute.term() + " |");
		}
		System.out.println();
	}
	
	public static void main(String[] args) throws Exception {
		//Lucene内置的分词器
		System.out.println("------------------------Lucene内置的分词器");
		testAnalyzer(new StandardAnalyzer(LuceneUtils.getVersion()), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new FrenchAnalyzer(LuceneUtils.getVersion()), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new FrenchAnalyzer(LuceneUtils.getVersion()), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器how are you呀");
		testAnalyzer(new RussianAnalyzer(LuceneUtils.getVersion()), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new CJKAnalyzer(LuceneUtils.getVersion()), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new ChineseAnalyzer(), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		//IKAnalyzer分词器
		System.out.println("------------------------IKAnalyzer分词器");
		testAnalyzer(new IKAnalyzer(), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new IKAnalyzer(), "上海自来水来自海上");
	}
}


输出结果:

------------------------Lucene内置的分词器
当前使用的分词器:class org.apache.lucene.analysis.standard.StandardAnalyzer
mozilla |firefox |中 |文 |俗 |称 |火 |狐 |是 |一 |个 |自 |由 |及 |开 |放 |源 |代 |码 |的 |网 |页 |浏 |览 |器 |呀 |
当前使用的分词器:class org.apache.lucene.analysis.fr.FrenchAnalyzer
mozill |firefox |中 |文 |俗 |称 |火 |狐 |是 |一 |个 |自 |由 |及 |开 |放 |源 |代 |码 |的 |网 |页 |浏 |览 |器 |it |呀 |
当前使用的分词器:class org.apache.lucene.analysis.fr.FrenchAnalyzer
mozill |firefox |中 |文 |俗 |称 |火 |狐 |是 |一 |个 |自 |由 |及 |开 |放 |源 |代 |码 |的 |网 |页 |浏 |览 |器 |how |are |you |呀 |
当前使用的分词器:class org.apache.lucene.analysis.ru.RussianAnalyzer
mozilla |firefox |中文俗称 |火狐 |是一个自由及开放源代码的网页浏览器it呀 |
当前使用的分词器:class org.apache.lucene.analysis.cjk.CJKAnalyzer
mozilla |firefox |中文 |文俗 |俗称 |火狐 |是一 |一个 |个自 |自由 |由及 |及开 |开放 |放源 |源代 |代码 |码的 |的网 |网页 |页浏 |浏览 |览器 |呀 |
当前使用的分词器:class org.apache.lucene.analysis.cn.ChineseAnalyzer
mozilla |firefox |中 |文 |俗 |称 |火 |狐 |是 |一 |个 |自 |由 |及 |开 |放 |源 |代 |码 |的 |网 |页 |浏 |览 |器 |呀 |
------------------------IKAnalyzer分词器
当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
mozilla |firefox |中文 |俗称 |火狐 |一个 |一 |个 |自由 |开放源代码 |开放 |源代码 |代码 |网页 |浏览器 |浏览 |呀 |
当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
上海 |自来水 |自来 |来自 |海上 |



5、使用第三方IKAnalyzer分词器(中文首选)

需求:过滤掉上面例子中的“说”,“的”,“呀”,且将“传智播客”看成一个整体 关健字


(1)导入IKAnalyzer分词器核心jar包,IKAnalyzer3.2.0Stable.jar

(2)将IKAnalyzer.cfg.xml和stopword.dic和mydict.dic文件复制到MyEclipse的src目录下,

再进行配置,在配置时,首行需要一个空行


TestIK.java

package com.rk.lucene.c_ik;

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class TestIK {
	
	private static void testAnalyzer(Analyzer analyzer, String text) throws Exception{
		System.out.println("当前使用的分词器:" + analyzer.getClass());
		TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));
		tokenStream.addAttribute(TermAttribute.class);
		while(tokenStream.incrementToken()){
			TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);
			System.out.print(termAttribute.term() + " |");
		}
		System.out.println();
	}
	
	public static void main(String[] args) throws Exception {
		testAnalyzer(new IKAnalyzer(), "Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的网页浏览器it呀");
		testAnalyzer(new IKAnalyzer(), "上海自来水来自海上");
		testAnalyzer(new IKAnalyzer(), "传智播客教育科技有限公司是一家专门致力于高素质软件开发人才培养的IT公司");
		testAnalyzer(new IKAnalyzer(), "how are you");
	}
}

输出结果:

当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
mozilla |firefox |中文 |俗称 |火狐 |一个 |一 |个 |自由 |开放源代码 |开放 |源代码 |代码 |网页 |浏览器 |浏览 |呀 |
当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
上海 |自来水 |自来 |来自 |海上 |
当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
传智播客 |教育科 |教育 |科技 |有限公司 |有限 |公司 |一家 |一 |家专 |家 |专门 |致力于 |致力 |高素质 |素质 |软件开发 |软件 |开发 |发人 |人才培养 |人才 |培养 |公司 |
当前使用的分词器:class org.wltea.analyzer.lucene.IKAnalyzer
how |you |


IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 --> 
	<entry key="ext_dict">/mydict.dic;</entry> 
	
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">/ext_stopword.dic</entry> 
</properties>


mydict.dic

传智播客


ext_stopword.dic

也
了
仍
从
以
使
则
却
又
及
对
就
并
很
或
把
是
的
着
给
而
被
让
在
还
比
等
当
与
于
但








Lucene系列:(6)分词器