温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么实现ES IK分词器添加远程词组

发布时间:2021-10-20 09:30:14 来源:亿速云 阅读:113 作者:iii 栏目:编程语言

本篇内容介绍了“怎么实现ES IK分词器添加远程词组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在IKAnalyzer.cfg.xml配置文件中修改配置项

<entry key="remote_ext_dict">URLS</entry>
<entry key="remote_ext_stopwords">URLS</entry>
  • 将URLS替换成远程字典地址,多个地址使用分号 (;) 分隔.

  • 每条url,比如http://127.0.0.1/dict/my.txt ,该请求只需满足以下两点即可完成分词热更新:

    1)响应需要返回两个头部(header),一个是Last-Modified,一个是ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。

    2)返回的内容格式是一行一个分词,换行符用\n即可。

    满足上面两点要求可实现热更新分词,不需要重启 ES 实例。

可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag,或者可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。

http server的方式比较简单 下面举一个通过SpringMVC响应的方式的实现

// 字典文件所在文件路径
private static final String EXT_DICT_PATH = "/data/soft/mydic";
@RequestMapping(value="/getCustomDict.htm")
public void getCustomDict(HttpServletRequest request, HttpServletResponse response){

      try {

          // 读取字典文件
          String path = EXT_DICT_PATH;
          File file = new File(path);

          String content = "";
          if(file.exists()){

              // 读取文件内容
              FileInputStream fi = new FileInputStream(file);
              byte[] buffer = new byte[(int) file.length()];
              int offset = 0, numRead = 0;

              while (offset < buffer.length && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
                  offset += numRead;
              }

              fi.close();
              content = new String(buffer, "UTF-8");
          }

          // 返回数据
          OutputStream out= response.getOutputStream();
          // Head需要带上 Last-Modified ETag 属性
          // 此处是输出的文件内容大小,不一定是这个样子,只要保证当文件发生变化时,Last-Modified和ETag也是变化的就OK ,比如也可以是文件的MD5
          response.setHeader("Last-Modified", String.valueOf(content.length()));
          response.setHeader("ETag",String.valueOf(content.length()));

          response.setContentType("text/plain; charset=utf-8");
          out.write(content.getBytes("utf-8"));

          out.flush();
          logger.info(content+"这是读取数据值");

      } catch (Exception e) {
          e.printStackTrace();
      }

  }

“怎么实现ES IK分词器添加远程词组”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI