初识IKAnalysis与Lucene


1.大致理解

目前了解的分词器IKAnalysis是开源的,基于java开发的轻量级中文分词器,是搜索技术的基石。

最初以Lucene为主体,但最新版发展为面向java的分词组件,独立于Lucene,同时提供默认优化。

2.初步使用

a.pom.xml

  <!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer -->
<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>4.10.4</version>
</dependency>

b.java练习代码

import java.io.StringReader;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;


public class Ikdemo {
	static final Logger logger = Logger.getLogger(Ikdemo.class);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String text ="ik分词来看一下效果如何呢";
		ByLucene(text,false);
		
	}
	public static void ByIkAnalysis(String text, boolean useSmart){
		try{
			StringReader sr = new StringReader(text);
			IKSegmenter ik = new IKSegmenter(sr, useSmart);
			Lexeme lex = null;
			while((lex = ik.next()) != null){
				System.out.print(lex.getLexemeText()+"|");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static void ByLucene(String text, boolean useSmart){
		try {
			
			//创建分词对象
			//true则按照最大长度划分,false则划分出所有可以划分的词
			Analyzer anal = new IKAnalyzer(useSmart);
			StringReader reader = new StringReader(text);
			//分词
			TokenStream ts = anal.tokenStream("", reader);
			CharTermAttribute term = ts.getAttribute(CharTermAttribute.class);
			//遍历分词数据
			ts.reset();
				while(ts.incrementToken()){
					System.out.print(term.toString()+"|");
				}
				ts.close();
				reader.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}
}
分词结果如下:
ik|分词|来看|看一下|一下|一|下|效果|果如|如何|呢|


3.配置自定义扩展字典和自定义扩展停止字典

a.创建ext.dic 和 chinese_stopword.dic分别作为扩展字典和扩展停止字典,注意文件为无bom头格式,否则无法识别

ext.dic文件内容

效果如何
ik分词
chinese_stopword.dic文件内容

吧 
呢 
来 
的
b.配置ik加载配置文件,放在src目录下

<?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">ikdic/ext.dic;</entry>   
      
    <!--用户可以在这里配置自己的扩展停止词字典-->  
    <entry key="ext_stopwords">ikdic/stopword.dic;ikdic/chinese_stopword.dic;</entry>   
      
</properties> 

c.重新运行程序查看效果如下

加载扩展词典:ikdic/ext.dic
加载扩展停止词典:ikdic/stopword.dic
加载扩展停止词典:ikdic/chinese_stopword.dic
ik分词|ik|分词|来看|看一下|一下|一|下|效果如何|效果|果如|如何|
可以看出"ik分词","效果如何"是自定义扩展字典中的词,而"呢"是自定义扩展停止中的词没有在分词结果中显示。


4.版本对应问题

Lucene版本对应的jdk支持

Lucene版本需要与IKAnalysis版本相对应,否则获取token报错TokenStream ts = anal.tokenStream("", reader);

参考:http://blog.csdn.net/eguid_1/article/details/51908862


参考http://3dobe.com/archives/44/

http://blog.csdn.net/shiyaru1314/article/details/51645110

IK中文分词器在Elasticsearch上的使用。原生IK中文分词是从文件系统中读取词典,es-ik本身可扩展成从不同的源读取词典。目前提供从sqlite3数据库中读取。es-ik-plugin-sqlite3使用方法: 1. 在elasticsearch.yml中设置你的sqlite3词典的位置:ik_analysis_db_path: /opt/ik/dictionary.db 我提供了默认的词典:https://github.com/zacker330/es-ik-sqlite3-dictionary 2. 安装(目前是1.0.1版本)./bin/plugin -i ik-analysis -u https://github.com/zacker330/es-ik-plugin-sqlite3-release/raw/master/es-ik-sqlite3-1.0.1.zip 3. 现在可以测试了:     1. 创建index curl -X PUT -H "Cache-Control: no-cache" -d '{     "settings":{         "index":{             "number_of_shards":1,             "number_of_replicas": 1         }     } }' 'http://localhost:9200/songs/'      2. 创建map: curl -X PUT -H "Cache-Control: no-cache" -d '{         "song": {             "_source": {"enabled": true},             "_all": {                 "indexAnalyzer": "ik_analysis",                 "searchAnalyzer": "ik_analysis",                 "term_vector": "no",                 "store": "true"             },             "properties":{                 "title":{                     "type": "string",                     "store": "yes",                     "indexAnalyzer": "ik_analysis",                     "searchAnalyzer": "ik_analysis",                     "include_in_all": "true"                 }             }         } }     ' 'http://localhost:9200/songs/_mapping/song'       3.curl -X POST  -d '林夕为我们作词' 'http://localhost:9200/songs/_analyze?analyzer=ik_analysis' response: {"tokens":[{"token":"林夕","start_offset":0,"end_offset":2,"type":"CN_WORD","position":1},{"token":"作词","start_offset":5,"end_offset":7,"type":"CN_WORD","position":2}]} 标签:中文分词  分词插件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值