Elasticsearch外部词库文件更新及使用

  目录

  引言

  本文所使用的ES集群环境可在历史文章中获取,采用docker部署的方式。

  Elasticsearch 是一个功能强大的搜索引擎,广泛用于构建复杂的全文搜索应用程序。在许多情况下,为了提高搜索引擎的性能和精度,我们可以使用外部词库来定制和扩展 Elasticsearch 的文本处理和搜索功能。本文将介绍外部词库的用途、优势以及如何在 Elasticsearch 中使用它们。

  为什么需要外部词库?

  Elasticsearch 默认提供了一套强大的文本处理工具,包括分词、标记过滤、同义词处理等。然而,在某些情况下,我们需要更多的控制权来适应特定的用例和需求。外部词库允许我们:

  使用外部词库的优势

  使用外部词库有以下优势:

  如何在 Elasticsearch 中使用外部词库

  在 Elasticsearch 中使用外部词库通常涉及以下步骤:

  示例:使用自定义词库分词

  本文在 分词器的基础上增加自定义分词,并配置本地词库文件,远程热更新词库文件。

  本地词库

  首先在启动的中对两个字进行分词,默认分为两个汉字

  GET _analyze

  {

  "analyzer": "ik_max_word",

  "text": ["醉鱼"]

  }

  结果如下

  {

  "tokens" : [

  {

  "token" : "醉",

  "start_offset" : 0,

  "end_offset" : 1,

  "type" : "CN_CHAR",

  "position" : 0

  },

  {

  "token" : "鱼",

  "start_offset" : 1,

  "end_offset" : 2,

  "type" : "CN_CHAR",

  "position" : 1

  }

  ]

  }

  而我们的需求是让其能分为一次词语,而不是两个汉字,那么下面引入我们的自定义分词文件

  在 的 目录下创建自定义词库文件 ,文件内容如下,格式为一个词语为一行。

  醉鱼

  修改 的配置,支持自定义分词文件 ,修改 目录下的,修改其中的值,为本地文件路径,配置为相对路径,直接填写上一步创建的,结果如下

  <?xml version="1.0" encoding="UTF-8"?>

  

  

  IK Analyzer 扩展配置

  

  zuiyu.dic

  

  

  

  

  

  

  

  如果是启动的集群,需要复制当前两个文件到所有的集群中

  重启

  测试分词效果,使用同样的分词语句

  GET _analyze

  {

  "analyzer": "ik_max_word",

  "text": ["醉鱼"]

  }

  结果如下

  {

  "tokens" : [

  {

  "token" : "醉鱼",

  "start_offset" : 0,

  "end_offset" : 2,

  "type" : "CN_WORD",

  "position" : 0

  }

  ]

  }

  一般来说,词语肯定不是固定的,随着工作的长期积累,不断地发现新的专业术语,那么热更新,动态更新词库,不在每次更新词库之后重启就是非常有必要的了,下面来看一下热更新词库。

  远程词库(热更新)

  热更新词库的区别就是文件中的一个配置的问题。不过核心还是需要一个词库文件,刚才是通过路径访问的,但是无法热更新,所以现在需要改为访问,也就是 请求可以读取到的形式。一个词语一行返回即可。

  此处使用 来做演示。 中的配置如下

  location /dic/zuiyu.dic {

  alias html/dic/zuiyu.dic;

  }

  文件内容如下

  醉鱼

  配置修改如下,为部署的 的 ,端口也是根据自己 监听的端口修改

  http://192.168.30.240:8088/dic/zuiyu.dic

  完整的配置如下

  <?xml version="1.0" encoding="UTF-8"?>

  

  

  IK Analyzer 扩展配置

  

  zuiyu.dic

  

  

  

  http://192.168.30.240:8088/dic/zuiyu.dic

  

  

  

  测试对 分词,可以看到与上面本地词库时是同样的效果

  {

  "tokens" : [

  {

  "token" : "醉鱼",

  "start_offset" : 0,

  "end_offset" : 2,

  "type" : "CN_WORD",

  "position" : 0

  }

  ]

  }

  测试对进行分词

  GET _analyze

  {

  "analyzer": "ik_max_word",

  "text": ["我爱你醉鱼"]

  }

  结果如下

  {

  "tokens" : [

  {

  "token" : "我爱你",

  "start_offset" : 0,

  "end_offset" : 3,

  "type" : "CN_WORD",

  "position" : 0

  },

  {

  "token" : "爱你",

  "start_offset" : 1,

  "end_offset" : 3,

  "type" : "CN_WORD",

  "position" : 1

  },

  {

  "token" : "醉鱼",

  "start_offset" : 3,

  "end_offset" : 5,

  "type" : "CN_WORD",

  "position" : 2

  }

  ]

  }

  在中增加,最终的文件内容如下

  醉鱼

  我爱你醉鱼

  增加完成之后,这5个字已经成为一个词语,分词结果如下

  {

  "tokens" : [

  {

  "token" : "我爱你醉鱼",

  "start_offset" : 0,

  "end_offset" : 5,

  "type" : "CN_WORD",

  "position" : 0

  },

  {

  "token" : "我爱你",

  "start_offset" : 0,

  "end_offset" : 3,

  "type" : "CN_WORD",

  "position" : 1

  },

  {

  "token" : "爱你",

  "start_offset" : 1,

  "end_offset" : 3,

  "type" : "CN_WORD",

  "position" : 2

  },

  {

  "token" : "醉鱼",

  "start_offset" : 3,

  "end_offset" : 5,

  "type" : "CN_WORD",

  "position" : 3

  }

  ]

  }

  仅在一个节点 中配置了远程词库, 与 都没有配置任何的词库,此时当前环境无法达到我们的预期分词效果

  总结

  通过上面我们的试验,可以发现结合 分词器,使用自定义词库,可以满足我们专业内的词语分词,实现更好的分词效果,再加上动态词库的更新,对我们的工作还是很有必要的,配置过程是不是很简单,下面就赶紧用起来吧。

  以上就是Elasticsearch外部词库文件更新及使用的详细内容,更多关于Elasticsearch外部词库文件更新的资料请关注脚本之家其它相关文章!

  您可能感兴趣的文章: