Lucene使用IKAnalyzer中文分词笔记

发布时间:2016-06-07 21:27:13 作者:JIALY 203次浏览

      本文主要讲解IKAnalyzer(以下简称‘IK’)在Lucene中的具体使用,关于LuceneIK分词器的背景及其作用在这里就不再熬述。不得不感叹下Lucene版本变更的快速,如今最新已经到了4.9.0,相信任何技术的发展壮大都不可避免有这一过程。本文使用的是Lucene4.0IKAnalyzer使用的是2012FF版。

      Lucene下载请移步官网IK下载地址如下

      http://code.google.com/p/ik-analyzer/downloads/list

      IK下载完成够拷贝至项目中,目录结构如下图所示

    1465305860671031178.jpg


      可以看到src目录下有三个配置文件,分别为扩展字典文件ext.dic,停止词字典文件stopwprd.dic和配置文件IKAnalyzer.cfg.xml。配置文件IKAnalyzer.cfg.xml为配置扩展字典文件和停止词字典文件路径。IKAnalyzer.cfg.xml文件默认放置在classpath的根目录下,可以修改源码来改变该文件位置。

      在程序中使用IK很简单,只需要创建IKAnalyzer对象即可,因为IKAnalyzer继承于LuceneAnalyzer

      IK无参构造函数默认采用细粒度切分算法,

      Analyzer analyzer = new IKAnalyzer();//细粒度切分算法

      当然也可以传入参数设置采用智能切分算法。

      Analyzer analyzer = new IKAnalyzer(true);//智能切分

     

      Demo例子如下

    import java.io.IOException;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.CorruptIndexException;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.IndexWriterConfig.OpenMode;
    import org.apache.lucene.queryparser.classic.ParseException;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.LockObtainFailedException;
    import org.apache.lucene.store.RAMDirectory;
    import org.apache.lucene.util.Version;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    
    
    
    /**
     * 使用IKAnalyzer进行Lucene索引和查询的演示
     * 2012-3-2
     * 
     * 以下是结合Lucene4.0 API的写法
     *
     */
    public class LuceneIndexAndSearchDemo {
    	
    	
    	/**
    	 * 模拟:
    	 * 创建一个单条记录的索引,并对其进行搜索
    	 * @param args
    	 */
    	public static void main(String[] args){
    		//Lucene Document的域名
    		String fieldName = "text";
    		 //检索内容
    		String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";
    		
    		//实例化IKAnalyzer分词器
    		Analyzer analyzer = new IKAnalyzer(true);
    		
    		Directory directory = null;
    		IndexWriter iwriter = null;
    		IndexReader ireader = null;
    		IndexSearcher isearcher = null;
    		try {
    			//建立内存索引对象
    			directory = new RAMDirectory();	 
    			
    			//配置IndexWriterConfig
    			IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_40 , analyzer);
    			iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
    			iwriter = new IndexWriter(directory , iwConfig);
    			//写入索引
    			Document doc = new Document();
    			doc.add(new StringField("ID", "10000", Field.Store.YES));
    			doc.add(new TextField(fieldName, text, Field.Store.YES));
    			iwriter.addDocument(doc);
    			iwriter.close();
    			
    			
    			//搜索过程**********************************
    		    //实例化搜索器   
    			ireader = DirectoryReader.open(directory);
    			isearcher = new IndexSearcher(ireader);			
    			
    			String keyword = "中文分词工具包";			
    			//使用QueryParser查询分析器构造Query对象
    			QueryParser qp = new QueryParser(Version.LUCENE_40, fieldName,  analyzer);
    			qp.setDefaultOperator(QueryParser.AND_OPERATOR);
    			Query query = qp.parse(keyword);
    			System.out.println("Query = " + query);
    			
    			//搜索相似度最高的5条记录
    			TopDocs topDocs = isearcher.search(query , 5);
    			System.out.println("命中:" + topDocs.totalHits);
    			//输出结果
    			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    			for (int i = 0; i < topDocs.totalHits; i++){
    				Document targetDoc = isearcher.doc(scoreDocs[i].doc);
    				System.out.println("内容:" + targetDoc.toString());
    			}			
    			
    		} catch (CorruptIndexException e) {
    			e.printStackTrace();
    		} catch (LockObtainFailedException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (ParseException e) {
    			e.printStackTrace();
    		} finally{
    			if(ireader != null){
    				try {
    					ireader.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			if(directory != null){
    				try {
    					directory.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }

      看看代码,IK的使用真的很简单。其实该例子的代码就在IK包org/wltea/analyzer/sample/下。关于Lucene的使用可参看另一篇文章,文章地址:

       http://www.zero502.com/blog/article?id=8af4d41555048be0015505bbcecd0008



关键字词: Lucene IKAnalyzer 中文分词