为什么80%的码农都做不了架构师?>>>   

当前IKAnalyzer从发布最后一个版本后就一直没有再更新,使用过程中,经常遇到需要扩展词库以及动态更新字典表的问题,此处给出一种解决办法(注意:本方法中的IKAnalyzer代码我已经将源码移植到了自己的工程中,目录结构也进行了修改):

1、将扩展字典表做成可动态生成:

1)、在IKAnalyzer.cfg.xml中添加扩展字典路径

2)、在分词的时候,先采取动态生成上面两个字典表的方式进行更新,例如事先将字典词库放在数据表中,需要分词之前先更新字典。当然此方法只支持第一次调用的时候动态加载词库,如果服务没有重启之前,数据库中添加的词是不会进行重新加载的。下面是动态生成字典表的实现类:

package com.chz.apps.sm.IKAnalyzer;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;import com.chz.apps.sm.model.IkanalyzerExtendModel;
import com.chz.base.util.FileUtil;
import com.chz.plugin.IKAnalyzer.core.IKSegmenter;
import com.chz.plugin.IKAnalyzer.core.Lexeme;/*** @Description 分词工具类* @author gongstring<1@gongstring.com>* @createTime 2016年11月28日 下午2:46:06*/
public class IKAnalyzerTool {/*** 是否已经初始化过词库,如果没有,则会自动先调用词库*/private static boolean init_words = false;/*** 扩展关键字*/private static List<String> extendWords = new ArrayList<String>();/*** 停用关键字*/private static List<String> stopWords = new ArrayList<String>();/*** @Description 初始化词库以及停用词* @author gongstring<1@gongstring.com>* @createTime 2016年11月28日 下午2:29:59*/public static void initWords(){//从关键字表中查询扩展关键字,并生成到指定文件中IKAnalyzerTool.extendWords = new ArrayList<String>();List<IkanalyzerExtendModel> extendWords = IkanalyzerExtendModel.dao.findByProperty("status", 1);String fileDirPath = IKAnalyzerTool.class.getResource("/com/chz/apps/sm/IKAnalyzer/").getPath();String filePath = fileDirPath+"extend.dic";FileUtil.removeFile(filePath);//先删除文件,此处重新生成for (int i = 0; i < extendWords.size(); i++) {String txt = extendWords.get(i).getStr("extend_word");FileUtil.appendToFile(filePath, txt,true);IKAnalyzerTool.extendWords.add(txt);}//从关键字表中查询停用关键字,并生成到指定文件中IKAnalyzerTool.stopWords = new ArrayList<String>();List<IkanalyzerExtendModel> stopWords = IkanalyzerExtendModel.dao.findByProperty("status", 0);String stopFilePath = fileDirPath+"stopword.dic";FileUtil.removeFile(stopFilePath);//先删除文件,此处重新生成for (int i = 0; i < stopWords.size(); i++) {String txt = stopWords.get(i).getStr("extend_word");FileUtil.appendToFile(stopFilePath, txt,true);IKAnalyzerTool.stopWords.add(txt);}init_words = true;}/*** @Description 分词操作* @author gongstring<1@gongstring.com>* @createTime 2016年11月28日 下午3:30:10* @param str* @param justExist 是否只显示已经在词库中维护了的关键词* @return*/public static List<String> IKAnalysis(String str,boolean justExist) {List<String> tmp = IKAnalysis(str);List<String> result = new ArrayList<String>();if(justExist){for (int i = 0; i < tmp.size(); i++) {if(IKAnalyzerTool.extendWords.contains(tmp.get(i))){result.add(tmp.get(i));}}}else{result = tmp;}return result;}/*** @Description 根据字符串自动拆分成关键字集合* @author gongstring<1@gongstring.com>* @createTime 2016年11月28日 下午2:55:24* @param str* @return*/public static List<String> IKAnalysis(String str) {if(!init_words){initWords();}List<String> result = new ArrayList<String>();try {// InputStream in = new FileInputStream(str);//byte[] bt = str.getBytes();// strInputStream ip = new ByteArrayInputStream(bt);Reader read = new InputStreamReader(ip);IKSegmenter iks = new IKSegmenter(read, true);Lexeme t;while ((t = iks.next()) != null) {result.add(t.getLexemeText());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}}

2、修改源码,实现动态更新字典表。通过查看源码IKAnalyzer.dic.Dictionary.java文件得出,字典对象是采取单例模式,也就是第一次加载后,后续不在重新加载,这样即使字典表内容变化,缓存中的字典库是不会变更的,所以需要修改源码,可以手动更新静态对象的内容,此处我采取添加clear方法,在需要更新时候调用,将instance对象设置为null,下次调用字典的时候,程序就会自动加载了

/*** @Description 清空字典缓存,用于动态更新字典表* @author gongstring<1@gongstring.com>* @createTime 2016年11月29日 上午9:56:15*/public static void clear(){singleton = null;}

源码修改完后,可以选择编译重新打包,或者将jar包中的class文件删除,java类在工程中按照源目录存放。

3、手动调用,我这里是做的一个页面,点击更新字典库时,调用更新代码:

/*** @Description 刷新关键词缓存* @author gongstring<1@gongstring.com>* @createTime 2016年11月29日 上午9:33:49*/public void refreshCache(){IKAnalyzerTool.initWords();//重新加载词汇Dictionary.clear();//将字典表缓存清空this.renderSuccessJson(EnvConfig.APP_PATH+"/sm/ikanalyzerExtend");}

4、可能存在的性能问题:由于词库一般会比较大,所以每次大批量更新可能会出现性能损耗。。。

注:本文转载自gongstring.com,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。

转载于:https://my.oschina.net/yyqz/blog/1548922

IKAnalyzer实现扩展词库+动态更新词库的方法相关推荐

  1. 充电复习之ES 扩展词库及热更新词库,扩展同义词词库,及热扩展词库

    1.es扩展词库在/usr/local/es/elasticsearch-node01/plugins/elasticsearch-analysis-ik-7.2.1/config中新建文件 new_ ...

  2. ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库

    文章目录 # 实验环境 # ik分词器的下载.安装.测试 ## 安装方法一:使用elasticsearch-plugin 安装 ## 安装方法二:下载编译好的包进行安装 1.下载 2.安装 3.重启` ...

  3. Elasticsearch之中文分词器插件es-ik的自定义热更新词库

    1: 部署 http 服务 在这使用 tomcat7 作为 web 容器, 先下载一个 tomcat7, 然后上传到某一台服务器上(192.168.80.10). 再执行以下命令 tar -zxvf ...

  4. 六Elasticsearch之中文分词器插件es-ik的热更新词库

    参考:http://www.mamicode.com/info-detail-1705113.html 先声明,热更新词库,需要用到,web项目和Tomcat.不会的,请移步 Eclipse下Mave ...

  5. 31_ElasticSearch 修改IK分词器源码来基于mysql热更新词库

    31_ElasticSearch 修改IK分词器源码来基于mysql热更新词库 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boo ...

  6. IKAnalyzer 添加扩展词库和自定义词

    原文链接http://blog.csdn.net/whzhaochao/article/details/50130605 IKanalyzer分词器 IK分词器源码位置 http://git.osch ...

  7. IKAnalyzer配置扩展词库经验总结

    IKAnalyzer对于中文分词效果较好,但是在实际应用过程中经常会遇到分词效果不理想的情况,比如中文中夹杂的英文缩写,英文与数字混合(如软件版本号)等,这时就需要配置扩展词库.配置的主要方法为编辑I ...

  8. es ik分词热更新MySQL,ElasticSearch(25)- 改IK分词器源码来基于mysql热更新词库

    代码地址 已经修改过的支持定期从数据库中提取新词库,来实现热更新.代码: https://github.com/csy512889371/learndemo/tree/master/elasticse ...

  9. ik mysql热加载分词_Elasticsearch 之(25)重写IK分词器源码来基于mysql热更新词库...

    热更新在上一节< IK分词器配置文件讲解以及自定义词库>自定义词库,每次都是在es的扩展词典中,手动添加新词语,很坑 (1)每次添加完,都要重启es才能生效,非常麻烦 (2)es是分布式的 ...

最新文章

  1. 实践学习:首次项目合作
  2. TCP/IP反码求和校验
  3. 云计算里AWS和Azure的探究(2)
  4. Steve Lin:如何撰写一篇优秀的SIGGRAPH论文
  5. 香港四大天王影帝情况(截止2016)
  6. menuetos oracle,使用DistroTest服务免费在线测试Linux和Unix操作系统
  7. Silverlight BUG
  8. 浅谈python MRO与Mixin模式
  9. 高质免费图片素材网站
  10. HTTP1.1 基础: 用C语言实现200行内的极简http server
  11. lintcode刷题——罗马数字转整数
  12. [推广]AboutCG Python商业教程发布
  13. mysql 备份 access_备份access数据库
  14. 全国计算机等级考试-三级信息安全考试知识点(无顺序)
  15. Kylin RT OLAP reassign流程即重新分配replica_set 流程
  16. Dos用户学Unix指南(1)
  17. sortBy和sortByKey区别
  18. 推荐系统论文源码笔记——依次学习之DKN源码笔记
  19. 2020-07-24
  20. 网页使用百度地图后,只显示灰色框框(已解决)

热门文章

  1. 关于数据库更新插入语句
  2. 我的专属QQ 功能篇 (一)
  3. socket编程(一)最简单的c/s模式
  4. Nacos命名空间配置_每个人用各自自己的命名空间---SpringCloud Alibaba_若依微服务框架改造---工作笔记001
  5. k8s集群部署项目_JAVA项目(部署镜像暴露应用)---K8S_Google工作笔记0062
  6. 软件工作相关考试001---PMP等各种考试
  7. System学习笔记005---如何查看远程的一台电脑的某个端口有没有打开_centos查看某个端口是否打开
  8. 云计算学习笔记---异常处理---hadoop问题处理ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.lang.NullPoin
  9. 杭电2108判断凹凸边形
  10. kafka消费者脚本无法启动问题