lucene(3)——版本5.X写中文同义词分词器
最基本的内容
如果你存储到硬盘的话,那么目录下就有这么几个文件
_0.fnm存储域的名字信息
_0.fdt域store.YES的数据信息
_0.fdx域store.YES的数据信息
_0.fdx保存字体在内容中出现的次数,评分和排序
_0.nrm存储评分信息
_0.prx偏移量
_0.tii和_0.tis 索引内容里所有内容信息
_0_1.del所有删除的文件信息,相当于回收站
CharTermAttribute:存储每一个与语汇单词的信息
PositionIncrementAttribute:位置增量属性,存储语汇单词之间的距离
OffsetAttribute:存储语汇单词之间的偏移量
TypeAttribute:使用的分词器的类型
1.我用的是lucene5.5版本的,建议读者用2.3版本的mmseg4j,其他2.3以下版本都不兼容
2.先是分词器类,记得将mmseg4j-core-1.10.0.jar解压,随意放在一个目录下,目录里有个data文件夹,里面有chars.dic,units.dic,words.dic这几个重要的文件,下面的那个目录就是date文件夹的绝对路径(下面是我的路径,你们随意,也可以放相对路径,我这只是测试)
package cn.com.demo.chnese;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;import com.chenlb.mmseg4j.Dictionary;
import com.chenlb.mmseg4j.MaxWordSeg;
import com.chenlb.mmseg4j.analysis.MMSegTokenizer;public class MsgAnalyzi extends Analyzer{@Overrideprotected TokenStreamComponents createComponents(String str) {Dictionary dic=Dictionary.getInstance("C:\\Users\\Administrator\\Desktop\\mmseg4j-core-1.10.0\\data");Tokenizer nize=new MMSegTokenizer(new MaxWordSeg(dic));TokenStream tokenStream=new MsgTokenFilter(nize);return new TokenStreamComponents(nize, tokenStream);}
}
3.继承TokenFilter
package cn.com.demo.chnese;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;public class MsgTokenFilter extends TokenFilter{private CharTermAttribute charTerm=null;private PositionIncrementAttribute positionIncrement=null;//用来存储同义词private Stack<String> stack=null;//定义的状态private State state=null;protected MsgTokenFilter(TokenStream input) {super(input);charTerm=this.addAttribute(CharTermAttribute.class);positionIncrement=this.addAttribute(PositionIncrementAttribute.class);stack=new Stack<String>();}@Overridepublic boolean incrementToken() throws IOException {if(stack.size()>0){//将元素出栈,并获取同义词String str=stack.pop();//还原状态restoreState(state);//先清空再添加charTerm.setEmpty();charTerm.append(str);//设置位置为0,表示同义词positionIncrement.setPositionIncrement(0);return true;}if(!input.incrementToken()){return false;}//如词汇中有同义词,捕获当前状态if(this.incream(charTerm.toString())){state=captureState();}return true;}//词汇中有同义词就将内容放入栈中public boolean incream(String name){Map<String,String[]> map=new HashMap<String,String[]>();map.put("中国", new String[]{"天朝","中原"});map.put("我", new String[]{"朕","俺"});map.put("主义", new String[]{"注意","猪亿"});String[] strs=map.get(name);if(strs == null){return false;}for(String s:strs){stack.push(s);}return true;}}
4.现再可以测试了
package cn.com.demo.chnese;import java.io.IOException;
import java.io.StringReader;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;public class Test {public static void main(String[] args) throws Exception {Analyzer ana = new MsgAnalyzi();String str = "我是中国主义接班人,想着生命勇敢前进";Anly(str, ana);uuil(str);}public static void Anly(String str, Analyzer analyzer) {try {TokenStream tokenStream = analyzer.tokenStream(str, new StringReader(str));tokenStream.reset();
// for(Token token=new Token();(token=(Token)TokenUtils.nextToken(tokenStream, token))!=null;){
// System.out.print("["+token+"]");
// }
// System.out.println();
// 上面的这个可以代替下面的方法显示CharTermAttribute ter = tokenStream.addAttribute(CharTermAttribute.class);while (tokenStream.incrementToken()) {System.out.print("[" + ter + "]");}System.out.println();} catch (IOException e) {e.printStackTrace();}}public static void uuil(String content) throws Exception {Directory dire=new RAMDirectory();IndexWriter write=new IndexWriter(dire, new IndexWriterConfig(new MsgAnalyzi()));Document doc=new Document();doc.add(new TextField("content", content, Store.YES));write.addDocument(doc);write.close();DirectoryReader reader=DirectoryReader.open(dire);IndexSearcher seacher=new IndexSearcher(reader);QueryParser parser=new QueryParser("content", new MsgAnalyzi());TopDocs top=seacher.search(parser.parse("注意"), 10);ScoreDoc[] score=top.scoreDocs;doc=seacher.doc(score[0].doc);System.out.println(doc.get("content"));}
}
lucene(3)——版本5.X写中文同义词分词器相关推荐
- Lucene实现自定义中文同义词分词器
---------------------------------------------------------- lucene的分词_中文分词介绍 ------------------------ ...
- lucene6中配置IK Analyzer同义词分词器
首先需要基础知识 intellij idea中为lucene6配置IK Analyzer分词器 说到同义词分词器,从原理角度来说要了解了Analyzer Analyzer分词的原理 Analyzer类 ...
- Lucene5学习之自定义同义词分词器简单示例
同义词功能在全文搜索时的意义,大家应该都懂的.今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码,只不过Lucenen i ...
- Solr配置中文的分词器-简单配置
Solr配置中文的分词器 文章目录 Solr配置中文的分词器 英文分词 中文的查询 Solr需要配置中文分词器(重要) 配置中文分词后,再分析一次 这篇文章,主要是讲解Solr如何配置中文分词器, ...
- lucene构建同义词分词器
lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流.里面包含了filter和tokenizer 在较复杂的lucene搜索业务场景下,直接网 ...
- ElasticSearch——手写一个ElasticSearch分词器(附源码)
1. 分词器插件 ElasticSearch提供了对文本内容进行分词的插件系统,对于不同的语言的文字分词器,规则一般是不一样的,而ElasticSearch提供的插件机制可以很好的集成各语种的分词器. ...
- ES学习(五)同义词分词器dynamic synonym for ElasticSearch
dynamic synonym for ElasticSearch elasticsearch动态同义词插件是添加一个同义词过滤器在给定间隔(默认60秒)来重新加载同义词文件(本地文件或远程文件). ...
- elasticsearch-7.15.2 同时支持中文ik分词器和pinyin分词器
文章目录 1. 自定义分词器 2. 映射模型 3. 效果图 1. 自定义分词器 ES如何支持拼音和中文分词 ? 自定义分词器 支持拼音和中文分词 PUT /jd_goods {"settin ...
- java以某个字符串断句_结合 ictclass4j 和 KTDictSeg 写自己的分词器----断句(1)
由于开源和对.net的喜爱,以及较好的分词效果,喜欢上了KTDicSeg.由于工作的原因,我不得不使用java,我们选择使用ictclass4j. 一开始就觉得中文分词很难,而自己的水平似乎有限,在这 ...
最新文章
- jQuery+css模拟下拉框模糊搜索的实现
- cobbler一键部署centos7.4(脚本)
- PCL Show Point Cloud 显示点云
- 基于Java聊天系统设计(含源文件)
- UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
- 机器学习--线性回归4(线性拟合、局部线性拟合实战)
- Luogu1894[USACO4.2] 完美的牛栏The Perfect Stall
- Android 操作权限大全 (android.permission)
- springcloud实战一:搭建springboot
- 变更DirectX SDK版本-DirectX8升级DirectX9
- spring事务REQUIRED REQUIRES_NEW区别
- Instagram移动网页版推图片分享功能:追求国际增长
- 商用字体网站,再也不用怕侵权
- 廖宇靖正式回应陈晓旭之子传闻啦~
- windows 程序员装机必备软件
- 一.图像处理系统MATLAB实现(GUI界面)
- 湖南大学基于SMTP和POP3的邮件系统——计算机网络课设
- 视频版权,JavaScript阻止360浏览器
- CXL 2.0 Device配置空间寄存器组成
- 一个jsonString参数的坑,com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGI