Lucene4.7+IK-Analyzer中文分词入门教程2_第1页
Lucene4.7+IK-Analyzer中文分词入门教程2_第2页
Lucene4.7+IK-Analyzer中文分词入门教程2_第3页
Lucene4.7+IK-Analyzer中文分词入门教程2_第4页
Lucene4.7+IK-Analyzer中文分词入门教程2_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lucene4.7+IKAnalyzer中文分词入门教程作者:大明日期:2014-4-1环境:lucene版本:4.7下载地址:/apache/lucene/java/4.7.0/下载页面中的lucene-4.7.0.tgzIKAnalyzer版本:IKAnalyer2012-FFHotfix1下载地址:/p/ik-analyzer/downloads/list选择最上面的源码包。目前只有这个源码包才能支持lucene的4.7版本。参考文章:/dennisit/archive/2013/04/07/3005847.html此篇文章作者用的是lucene3.5版本,我做了一定幅度的修改,使其在4.7中可用。下面进入正式部署阶段:在eclipse中新建一个java项目:lucenetest解压lucene-4.7.0.tgz进入到解压后的lucene-4.7.0目录,搜索*.jar搜索出来的结果是lucene4.7提供的所有的jar包,根据需要拷贝不同的jar包到自己的工程。本例子需要如下几个jar包:将以上几个jar包拷贝到lucenetest下的lib文件夹下,如果没有lib,则新建。在eclipse中,打开lib,选中这几个jar包,点右键——buildparh——addtobuildpath解压下载的IKAnalyzer2012FF_hf1_source.rar进入到IKAnalyzer2012FF_hf1_source\src将如下所有的文件拷贝到lucenetest\src下刷新eclipse工程。如果源码报错,可能是编码格式的问题。解决办法:在lucenetest上点右键,选择最后一项Properties。如下图所示选择utf-8,点确定至此,环境已经搭建完毕。如果嫌ik的源码烦,可以自行打成jar包。目前eclipse项目的结构图如下:加入测试的例子。在src新建ik包,新建下面3个java文件(1)DataFactorypackageik;importjava.util.ArrayList;importjava.util.List;publicclassDataFactory{privatestaticDataFactorydataFactory=newDataFactory();privateDataFactory(){}publicList<Medicine>getData(){List<Medicine>list=newArrayList<Medicine>();list.add(newMedicine(1,"银花感冒颗粒","功能主治:银花感冒颗粒,头痛,清热,解表,利咽。"));list.add(newMedicine(2,"感冒止咳糖浆","功能主治:感冒止咳糖浆,解表清热,止咳化痰。"));list.add(newMedicine(3,"感冒灵颗粒","功能主治:解热镇痛。头痛,清热。"));list.add(newMedicine(4,"感冒灵胶囊","功能主治:银花感冒颗粒,头痛,清热,解表,利咽。"));list.add(newMedicine(5,"仁和感冒颗粒","功能主治:疏风清热,宣肺止咳,解表清热,止咳化痰。"));returnlist;}publicstaticDataFactorygetInstance(){returndataFactory;}}(2)LuceneIKUtilpackageik;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lucene.document.Document;importorg.apache.lucene.document.Field;importorg.apache.lucene.document.FieldType;importorg.apache.lucene.document.TextField;importorg.apache.lucene.index.DirectoryReader;importorg.apache.lucene.index.IndexReader;importorg.apache.lucene.index.IndexWriter;importorg.apache.lucene.index.IndexWriterConfig;importorg.apache.lucene.index.Term;importorg.apache.lucene.queryparser.classic.MultiFieldQueryParser;importorg.apache.lucene.search.IndexSearcher;importorg.apache.lucene.search.Query;importorg.apache.lucene.search.ScoreDoc;importorg.apache.lucene.search.TopDocs;importorg.apache.lucene.search.highlight.Formatter;importorg.apache.lucene.search.highlight.Fragmenter;importorg.apache.lucene.search.highlight.Highlighter;importorg.apache.lucene.search.highlight.QueryScorer;importorg.apache.lucene.search.highlight.Scorer;importorg.apache.lucene.search.highlight.SimpleFragmenter;importorg.apache.lucene.search.highlight.SimpleHTMLFormatter;importorg.apache.lucene.store.Directory;importorg.apache.lucene.store.FSDirectory;importorg.apache.lucene.util.Version;importorg.wltea.analyzer.lucene.IKAnalyzer;publicclassLuceneIKUtil{privateDirectorydirectory;privateAnalyzeranalyzer;/***带参数构造,参数用来指定索引文件目录*@paramindexFilePath*/publicLuceneIKUtil(StringindexFilePath){try{directory=FSDirectory.open(newFile(indexFilePath));analyzer=newIKAnalyzer();}catch(IOExceptione){e.printStackTrace();}}/***创建索引*Description:*@authordennisit@163.comApr3,2013*@throwsException*/publicvoidcreateIndex()throwsException{IndexWriterConfigindexWriterConfig=newIndexWriterConfig(Version.LUCENE_47,analyzer);IndexWriterindexWriter=newIndexWriter(directory,indexWriterConfig);indexWriter.deleteAll();List<Medicine>list=DataFactory.getInstance().getData();for(inti=0;i<list.size();i++){Medicinemedicine=list.get(i);Documentdocument=addDocument(medicine.getId(),medicine.getName(),medicine.getFunction());//indexWriter.addDocument(document);//如果用添加,每次都是新的。所以需要用updateindexWriter.updateDocument(newTerm("id",medicine.getId().toString()),document);}indexWriter.close();}/****Description:*@authordennisit@163.comApr3,2013*@paramid*@paramtitle*@paramcontent*@return*/publicDocumentaddDocument(Integerid,Stringname,Stringfunction){Documentdoc=newDocument();//Field.Index.NO表示不索引//Field.Index.ANALYZED表示分词且索引//Field.Index.NOT_ANALYZED表示不分词但索引//doc.add(newField("id",String.valueOf(id),Field.Store.YES,Field.Index.NOT_ANALYZED));//doc.add(newField("name",name,Field.Store.YES,Field.Index.ANALYZED));//doc.add(newField("function",function,Field.Store.YES,Field.Index.ANALYZED));FieldTypeft=newFieldType();ft.setStored(true);ft.setIndexed(true);ft.setTokenized(false);doc.add(newField("id",String.valueOf(id),ft));doc.add(newField("name",name,TextField.TYPE_STORED));doc.add(newField("function",function,TextField.TYPE_STORED));returndoc;}/****Description:更新索引*@authordennisit@163.comApr3,2013*@paramid*@paramtitle*@paramcontent*/publicvoidupdate(Integerid,Stringtitle,Stringcontent){try{IndexWriterConfigindexWriterConfig=newIndexWriterConfig(Version.LUCENE_47,analyzer);IndexWriterindexWriter=newIndexWriter(directory,indexWriterConfig);Documentdocument=addDocument(id,title,content);Termterm=newTerm("id",String.valueOf(id));indexWriter.updateDocument(term,document);indexWriter.close();}catch(Exceptione){e.printStackTrace();}}/****Description:按照ID进行索引*@authordennisit@163.comApr3,2013*@paramid*/publicvoiddelete(Integerid){try{IndexWriterConfigindexWriterConfig=newIndexWriterConfig(Version.LUCENE_47,analyzer);IndexWriterindexWriter=newIndexWriter(directory,indexWriterConfig);Termterm=newTerm("id",String.valueOf(id));indexWriter.deleteDocuments(term);indexWriter.close();}catch(Exceptione){e.printStackTrace();}}/****Description:查询*@authordennisit@163.comApr3,2013*@paramwhere查询条件*@paramscoreDoc分页时用*/publicList<Medicine>search(String[]fields,Stringkeyword){IndexSearcherindexSearcher=null;List<Medicine>result=newArrayList<Medicine>();try{//创建索引搜索器,且只读// DirectoryReaderireader=DirectoryReader.open(directory);// IndexSearcherisearcher=newIndexSearcher(ireader); IndexReaderindexReader=DirectoryReader.open(directory);indexSearcher=newIndexSearcher(indexReader);MultiFieldQueryParserqueryParser=newMultiFieldQueryParser(Version.LUCENE_47,fields,analyzer);Queryquery=queryParser.parse(keyword);//返回前number条记录TopDocstopDocs=indexSearcher.search(query,10);//信息展示inttotalCount=topDocs.totalHits;System.out.println("共检索出"+totalCount+"条记录"); //高亮显示 /* *创建高亮器,使搜索的结果高亮显示SimpleHTMLFormatter:用来控制你要加亮的关键字的高亮方式此类有2个构造方法 *1:SimpleHTMLFormatter()默认的构造方法.加亮方式:<B>关键字</B> *2:SimpleHTMLFormatter(StringpreTag,String *postTag).加亮方式:preTag关键字postTag */Formatterformatter=newSimpleHTMLFormatter("<fontcolor='red'>","</font>"); /* *QueryScorerQueryScorer *是内置的计分器。计分器的工作首先是将片段排序。QueryScorer使用的项是从用户输入的查询中得到的; *它会从原始输入的单词、词组和布尔查询中提取项,并且基于相应的加权因子(boostfactor)给它们加权。 *为了便于QueryScoere使用,还必须对查询的原始形式进行重写。比如,带通配符查询、模糊查询、前缀查询以及范围查询 *等,都被重写为BoolenaQuery中所使用的项。 *在将Query实例传递到QueryScorer之前,可以调用Query.rewrite *(IndexReader)方法来重写Query对象 */ScorerfragmentScorer=newQueryScorer(query);Highlighterhighlighter=newHighlighter(formatter,fragmentScorer);Fragmenterfragmenter=newSimpleFragmenter(100); /* *Highlighter利用Fragmenter将原始文本分割成多个片段。 *内置的SimpleFragmenter将原始文本分割成相同大小的片段,片段默认的大小为100个字符。这个大小是可控制的。 */highlighter.setTextFragmenter(fragmenter);ScoreDoc[]scoreDocs=topDocs.scoreDocs;for(ScoreDocscDoc:scoreDocs){Documentdocument=indexSearcher.doc(scDoc.doc);Integerid=Integer.parseInt(document.get("id"));Stringname=document.get("name");Stringfunction=document.get("function");//floatscore=scDoc.score;//相似度StringlighterName=highlighter.getBestFragment(analyzer,"name",name);if(null==lighterName){lighterName=name;}StringlighterFunciton=highlighter.getBestFragment(analyzer,"function",function);if(null==lighterFunciton){lighterFunciton=function;}Medicinemedicine=newMedicine();medicine.setId(id);medicine.setName(lighterName);medicine.setFunction(lighterFunciton);result.add(medicine);}}catch(Exceptione){e.printStackTrace();}returnresult;}/***判断是否已经存在索引文件*@paramindexPath*@return*/privatebooleanisExistIndexFile(StringindexPath)throwsException{Filefile=newFile(indexPath);if(!file.exists()){file.mkdirs();}StringindexSufix="/segments.gen";//根据索引文件segments.gen是否存在判断是否是第一次创建索引FileindexFile=newFile(indexPath+indexSufix);returnindexFile.exists();}publicstaticvoidmain(String[]args){LuceneIKUtilluceneProcess=newLuceneIKUtil("D:/索引存放的位置");try{luceneProcess.createIndex();}catch(Exceptione){e.printStackTrace();}//修改测试luceneProcess.update(2,"测试内容","修改测试。。。");//查询测试String[]fields={"na

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论