最基本的内容

如果你存储到硬盘的话,那么目录下就有这么几个文件

_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写中文同义词分词器相关推荐

  1. Lucene实现自定义中文同义词分词器

    ---------------------------------------------------------- lucene的分词_中文分词介绍 ------------------------ ...

  2. lucene6中配置IK Analyzer同义词分词器

    首先需要基础知识 intellij idea中为lucene6配置IK Analyzer分词器 说到同义词分词器,从原理角度来说要了解了Analyzer Analyzer分词的原理 Analyzer类 ...

  3. Lucene5学习之自定义同义词分词器简单示例

    同义词功能在全文搜索时的意义,大家应该都懂的.今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码,只不过Lucenen i ...

  4. Solr配置中文的分词器-简单配置

    Solr配置中文的分词器 文章目录 Solr配置中文的分词器 英文分词 中文的查询 Solr需要配置中文分词器(重要) 配置中文分词后,再分析一次   这篇文章,主要是讲解Solr如何配置中文分词器, ...

  5. lucene构建同义词分词器

    lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流.里面包含了filter和tokenizer 在较复杂的lucene搜索业务场景下,直接网 ...

  6. ElasticSearch——手写一个ElasticSearch分词器(附源码)

    1. 分词器插件 ElasticSearch提供了对文本内容进行分词的插件系统,对于不同的语言的文字分词器,规则一般是不一样的,而ElasticSearch提供的插件机制可以很好的集成各语种的分词器. ...

  7. ES学习(五)同义词分词器dynamic synonym for ElasticSearch

    dynamic synonym for ElasticSearch elasticsearch动态同义词插件是添加一个同义词过滤器在给定间隔(默认60秒)来重新加载同义词文件(本地文件或远程文件). ...

  8. elasticsearch-7.15.2 同时支持中文ik分词器和pinyin分词器

    文章目录 1. 自定义分词器 2. 映射模型 3. 效果图 1. 自定义分词器 ES如何支持拼音和中文分词 ? 自定义分词器 支持拼音和中文分词 PUT /jd_goods {"settin ...

  9. java以某个字符串断句_结合 ictclass4j 和 KTDictSeg 写自己的分词器----断句(1)

    由于开源和对.net的喜爱,以及较好的分词效果,喜欢上了KTDicSeg.由于工作的原因,我不得不使用java,我们选择使用ictclass4j. 一开始就觉得中文分词很难,而自己的水平似乎有限,在这 ...

最新文章

  1. jQuery+css模拟下拉框模糊搜索的实现
  2. cobbler一键部署centos7.4(脚本)
  3. PCL Show Point Cloud 显示点云
  4. 基于Java聊天系统设计(含源文件)
  5. UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
  6. 机器学习--线性回归4(线性拟合、局部线性拟合实战)
  7. Luogu1894[USACO4.2] 完美的牛栏The Perfect Stall
  8. Android 操作权限大全 (android.permission)
  9. springcloud实战一:搭建springboot
  10. 变更DirectX SDK版本-DirectX8升级DirectX9
  11. spring事务REQUIRED REQUIRES_NEW区别
  12. Instagram移动网页版推图片分享功能:追求国际增长
  13. 商用字体网站,再也不用怕侵权
  14. 廖宇靖正式回应陈晓旭之子传闻啦~
  15. windows 程序员装机必备软件
  16. 一.图像处理系统MATLAB实现(GUI界面)
  17. 湖南大学基于SMTP和POP3的邮件系统——计算机网络课设
  18. 视频版权,JavaScript阻止360浏览器
  19. CXL 2.0 Device配置空间寄存器组成
  20. 一个jsonString参数的坑,com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGI

热门文章

  1. 23本科毕业一年,从事C语言单片机工作一年半了,我都不知道以后干嘛了
  2. python计数器变量_Python编程第4课,从结绳计数到计数器,强化变量、赋值语句使用...
  3. 模板web html
  4. 爱普生EPSON ME 1+打印机清零程序及其使用说明
  5. 【渝粤题库】广东开放大学 企业会计准则 应用实务 形成性考核
  6. 【Proteus仿真】【51单片机】声光控节能灯设计
  7. Minecraft的世界生成过程(一)生成地形之前
  8. 理解透C语言一维数组,二维数组这一篇就够啦!
  9. Mybatis入门(一)-- 柚子真好吃
  10. 计算机网络-学习总结篇