IKAnalyzer1.3.4要自定义我们自己的词库,而且我们可以随时新增分词,网上查了一圈没有相关资料,看来只有自己搞定了。这里大家需要熟悉HTTP协议中的Last-Modified、ETags这些概念,这样能更容易理解IKAnalyzer作者的设计思路。

观察了下IKAnalyzer分词器的配置文件IKAnalyzer.cfg.xml发现其中有这样一个选项:

<!--用户可以在这里配置远程扩展字典 --><entry key="remote_ext_dict"><entry>,而且作者做了注释说这个就是扩展远程词典的。于是打开IKAnalyzer的源码查看,最后在Dictronary这类下找到这个方法:getRemoteWords。经过查看发现其实用的是HttpClient去获取分词。于是我就用SpringMVC写了个Controller来解决。这里要注意:每个分词之间要使用换行符即“\r\n”来分割,貌似问题圆满解决,

可是,我发现IKAnalyzer的这个获取分词的动作只是在启动的时候去访问我写的Controller。很显然这是不行的,这就违背了我随时新增分词的愿望了,看来我要扩展这个分词器了。于是我开始从头翻这个开源分词器的源码,我在Dictronary最后找到以下的代码,顿时让我眼前一亮:

public void reLoadMainDict(){
    logger.info("重新加载词典...");
        loadMainDict();
        loadStopWordDict();
    }

顾名思义,这个是重载分词的。于是我问自己,什么时候重载?如何重载?于是我搜了下,最后再Monitor这个类下找到run这个方法,这是Monitor实现Runnable接口的,在这个方法里这个分词器先去构造httphead,并且带上If-None-Match、If-Modified-Since这俩参数去访问Controller(关于这俩参数的概念,大家可以上网查),然后根据返回来的response的head里的Last-Modified和ETags来和Monitor缓存的变量进行比较,如果任何一个不相同就需要重新访问Controller中去获取数据,说到这里可以总下:可以在服务端(Controller)中设置这俩变量,来控制IKAnalyzer是否重新加载分词。OK,分析到这里问题解决了。最后我写的Controller中代码大概如下:

/**
* 获取分词
* @return
*/
@RequestMapping("getDict")  
@ResponseBody  
public String getDict(HttpServletRequest request, HttpServletResponse response) {
         String result = "";

StringBuilder sb = new StringBuilder();
         List<Word> wordList = wordService.selectAllWord();//获取所有分词,这里可以改进使用缓存等。

String eTag = request.getHeader("If-None-Match");
         Long modified= request.getDateHeader("If-Modified-Since");

//设置头
         if(null == modified || -1 == modified) {
              //如果没有,则使用当前时间 
              modified = System.currentTimeMillis();
         }

/ /设置头信息。
         String oldEtag = wordList.size() + "";
         response.setDateHeader("Last-Modified", Long.valueOf(modified));
         response.setHeader("ETags", wordList.size() + "");

if(!oldEtag.equals(eTag)) {
              //拼装结果
              for(Word tempWord : wordList) {
                   //分词之间以换行符连接
                   if(StringUtils.isNotEmpty(sb.toString())) {
                            sb.append("\r\n");
                   }
                  sb.append(tempWord.getValue());
              }
               result = sb.toString();
               //更新时间
               response.setDateHeader("Last-Modified", System.currentTimeMillis());
        }

return result;
}

这里还可以再优化,这是后话了,有了这个思路其余的都是锦上添花。

IKAnalyzer如何自定义远端词库相关推荐

  1. es自建搜索词库_【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库...

    接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze { "analyz ...

  2. 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索

    文章目录 1.为什么要自定义扩展ES词库呢? 2.如何自定义扩展词库呢? 3.Docker安装Nginx 4.在nginx中保存一个简易词库 5.修改IK分词器的配置文件,让其指向nginx保存的词库 ...

  3. 【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库

    接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze {"analyze ...

  4. 架构师成长记_第八周_11_ES- ik中文分词器与自定义中文词库

    文章目录 ik中文分词器 1. 安装ik中文分词器(7.4.2版本) 2. 使用ik中文分词器 2.1 分词器: ik_max_word 2.1 分词器: ik_smart 自定义中文词库 自定义词库 ...

  5. ES进阶(6)-自定义扩展词库

    在实际分词中有些分词并不能出现我们预期的分词结果,因此我们可以使用自定义词库 1.安装nginx 在mydata下创建目录 mkdir nginx 启动实例 docker run -p 80:80 - ...

  6. ibus自定义颜文字词库

    安装ibus-pinyin: 问题1:Ubuntu系统选择自带的拼音输入法是错误的,它默认无法输入中文及中文词组,请独立安装其他基于IBus的输入法 用PPA的第三方源将IBus升级的方法: 在终端输 ...

  7. Elasticsearch--分词-自定义扩展词库---全文检索引擎ElasticSearch工作笔记022

    然后我们再看,之前我们给"尚硅谷电商项目" 进行分词的时候 可以看到,我们知道尚硅谷是一个词,但是他没有给我们识别出来,而是,把尚分离了出来. 那怎么让他按照我们想的进行分词呢?, ...

  8. 谷粒商城ES自定义词库(十八)

    具体的IK分词可以查看博客:https://www.cnblogs.com/dalianpai/p/12694298.html 122.全文检索-ElasticSearch-分词-分词&安装i ...

  9. ElasticSearch自定义词库

    由于网络词语层出不穷,ik分词器有时并不能完全识别网络词汇,如下: 按照网络词语,王者荣耀应该被识别为一个词语,而不是被拆分成2个. 所以这时需要自定义词库来解决以上问题. 自定义词库 自定义扩展词库 ...

最新文章

  1. 译 | 缓存穿透问题导致Facebook史上最严重事故之一
  2. python3下载慢-PIP 下载慢,给你Python3的pip换个源 一键换源
  3. UC伯克利博士尤洋回国创业,曾破ImageNet纪录!已获超千万融资
  4. node.js第一步
  5. TechEd2007现场侧记:TechEd的变与不变
  6. ImportError: cannot import name FileStorage
  7. 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
  8. 新一代数据库技术在双11中的黑科技
  9. 扫一扫闪退的可能性之一[wex5开发]
  10. 使用CocoaPods给微信集成SDK打印收发消息
  11. 解决jQuery聚焦时光标在input最前面的问题
  12. PHP双码率视频云转码服务系统源码 m3u8切片秒切html5播放器 全开源
  13. Liver Writer打开以前的日志/页面
  14. mysql regexp边界_MySQL中REGEXP正则表达式使用大全
  15. java.lang.UnsupportedOperationException: This parser does not support specification “null“ version “
  16. java中ejb项目_创建EJB项目
  17. J2EE快速入门之集合框架【01】
  18. 如何开发一款棋牌游戏?棋牌游戏平台搭建
  19. springboot入门-idea
  20. Uniapp消息推送配置各个厂商UniPush

热门文章

  1. 如何在Release状态下进行调试
  2. 极速办公(PPT)如何设置幻灯片大小
  3. HSSFCellStyle相关属性报错
  4. 【JDBC】JDBC
  5. mt6582 pwm
  6. INET_ATON() 和 INET_NTOA()
  7. matlab时间坐标,[Matlab]以时间为横坐标作图
  8. 前端复习之DOM、BOM
  9. 利用C语言求一个数的所有质因数
  10. kernel panic