ElasticSearch IK分词器配置远程词典

2023-11-17

1.在线安装IK分词器

ElasticSearch中默认的分词器是standard,该分词器对中文按字分词,对英文按单词分词

GET /_analyze
{
  "text": "我是一个杠精,hello world!"
}

结果

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "一",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "个",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "杠",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "精",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    },
    {
      "token" : "hello",
      "start_offset" : 7,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 6
    },
    {
      "token" : "world",
      "start_offset" : 13,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 7
    }
  ]
}

但是默认的分词器对中文网站不友好,因为对中文时按照单字分词,所以如果我们想按词语来搜索就搜不到内容;所以,我们使用IK分词器

在线安装IK分词器

在线安装IK (v5.5.1版本后开始支持在线安装 )

1、删除ES原始数据
因为之前可能使用的标准分词器,如果存在数据,现在又使用IK分词器会出现冲突

进入es安装目录中将data目录数据删除

rm -rf data

2、安装IK
在es安装的bin目录中执行如下命令

./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip

3、查看IK
安装完成后会在plugins目录下,生成IK

[root@linux elasticsearch-6.8.0]$ ls plugins/
analysis-ik

4、重启es生效

IK分词器有两种模式
ik_max_word:最大限度分词


GET /_analyze
{
  "text": "中华人民共和国国歌,hello world!",
  "analyzer": "ik_max_word"
}
---------------
{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "中华人民",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "中华",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "华人",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "人民共和国",
      "start_offset" : 2,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "人民",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "共和国",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "共和",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "国",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "CN_CHAR",
      "position" : 8
    },
    {
      "token" : "国歌",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 9
    },
    {
      "token" : "hello",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "ENGLISH",
      "position" : 10
    },
    {
      "token" : "world",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "ENGLISH",
      "position" : 11
    }
  ]
}

ik_smart:尽量以词语的形式分词

GET /_analyze
{
  "text": "中华人民共和国国歌,hello world!",
  "analyzer": "ik_smart"
}

--------
{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "国歌",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "hello",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "ENGLISH",
      "position" : 2
    },
    {
      "token" : "world",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "ENGLISH",
      "position" : 3
    }
  ]

2.IK分词器的弊端

IK分词器虽然优于ES提供的默认分词器,但是还是存在一个弊端
那就是,不能识别网络中的热词,即不会把网络中流行的热词进行分词,
比如杠精,蓝瘦香菇…,这些词语,我们搜索时是希望搜索到内容的,但是IK会对这些词进行单字分词;
在这里插入图片描述
所以,我们搜索"碰瓷",""“杠精"等字眼时就搜索不到”

3.解决措施,配置远程词典实时更新

这些都是IK的本地词典,本地词典写入的词一旦写入,后面再想去填入或者停用,比较麻烦,所有这里我们配置远程词典
在这里插入图片描述
编辑 elasticsearch/config/analysis-ik/cat IKAnalyzer.cfg.xml文件
在这里插入图片描述
在此配置远程字典和停用词典

<!-- <entry key="remote_ext_dict">words_location</entry> -->

新建一个springboot应用,新建ext.txt文件,启动项目
在这里插入图片描述
把项目ip配置到xml文件中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <entry key="remote_ext_dict">http://192.168.101.100:8082/ext.txt</entry>
        <!--用户可以在这里配置远程扩展停止词字典-->
        <entry key="remote_ext_stopwords">http://192.168.101.100:8082/stop.txt</entry>
</properties>

重启ES服务
发现已经重新加载词典
在这里插入图片描述
测试,发现已经成功!!
在这里插入图片描述
而且以后如果我们在项目中更改了词典,ES这边会自动更新
在这里插入图片描述

补充

以后,我们项目中的的ext.txt和stop.txt词典可以结合Redis来实现动态更新
Redis中可以统计某个词的搜索次数,每隔一段时间,统计TOPn的词,更新到txt中,然后ES监听到该url对应的资源发生了变化就会进行自动拉取
在这里插入图片描述
至此,IK分词器配置远程词典并实现自动更新完成~!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch IK分词器配置远程词典 的相关文章

  • Elasticsearch 中的组合非嵌套和嵌套查询

    我想使用 ES 进行书籍搜索 所以我决定将作者姓名和标题 作为嵌套文档 放入索引中 如下所示 curl XPUT localhost 9200 library search books 1 d author one books title
  • 如何使用 Fluent 为 Elasticsearch 添加时间戳和密钥

    我已经配置了 fluidd 和 elasticsearch 它们都工作正常 我正在跟踪一个文件 然后读取其数据并将其发布到elasticsearch 下面是json数据 time 2018 05 14T11 37 30 339593 Dat
  • Elasticsearch 如何使用通配符进行 OR 查询

    我很难尝试使用 elasticsearch 构建查询 我想查询类似的内容 WHERE field 1 is match string OR field 2 is wildcard match string OR field 3 is fuz
  • 添加任何自定义实体后 jHipster Elasticsearch 问题

    org springframework beans factory UnsatisfiedDependencyException Error creating bean with name countryServiceImpl define
  • 为什么我们需要 Redis 来运行 CKAN?

    我想知道为什么我们需要 Redis 服务器来运行 CKAN 如果需要 为什么 我如何使用 CKAN 配置它 附注 我正在 RHEL7 中运行我的 ckan 实例 Update Redis 已成为一项要求从CKAN 2 7开始 https d
  • nginx/uwsgi 服务器的持久内存中 Python 对象

    我怀疑这是否可能 但这是问题和提出的解决方案 提出的解决方案的可行性是这个问题的对象 我有一些需要可用于所有请求的 全局数据 我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度 目前 数据被分为约 30 个逻辑块 每
  • 在 Rails 应用程序上将 HASH 保存到 Redis

    我刚刚开始使用 Redis 和 Rails 所以这可能是一个愚蠢的问题 我试图将哈希值保存到 Redis 服务器 但是当我检索它时 它只是一个字符串 IE hash field gt value field2 gt value2 redis
  • 术语聚合仅考虑聚合的前缀

    在我的弹性搜索文档中 我有用户和他在组织中的位置的某种表示 例如 CEO的位置是1 CEO直属的为1 1 1 2 1 3等 1 1 以下的将是 1 1 1 1 1 2 1 2 3 等 我有一个聚合 我想按 VP 聚合 所以我希望每个人都低于
  • Logback 与 Elasticsearch 直接集成

    我有带有 slf4j logback 的 Spring Boot 应用程序 并寻找集中式日志记录解决方案 现在我发现我不需要使用日志收集器 比如logstash filebeat rsyslog 有直接收集器Ingest Node在 Ela
  • Elasticsearch 将字符串与模糊字段相匹配

    我正在尝试将字符串与字段匹配 并且只想应用模糊性 例如 对于这些文档 title replace oilfilter title replace motoroil 以下查询应仅匹配第一个文档 Replace oilfilter Replac
  • 具有匹配模式的 ioredis 密钥

    我想用键匹配模式 LOGIN 搜索 Redis 数据库 我在我的应用程序中使用 ioredis 昨天我搜索了整个网络 我得到了一些执行这项工作的选项 如下所示 KEYS 扫描流 Issue import Redis from ioredis
  • Elasticsearch 聚合过滤器

    因为我在谷歌上找不到任何东西 是否可以在elasticsearch中过滤聚合 我正在考虑这样的事情 获取 SOME object X gt 100 的所有对象 提前致谢 编辑 样本数据 我有以下文档结构 docKey 1 value 2 d
  • 语法错误:elasticdump 中的exports.runInThisContext (vm.js:53:16) 处出现意外标记 {

    我试图使用elasticdump 将elasticsearch 数据从一台服务器移动到另一台服务器 当我给予 elasticdump input http 192 168 0 122 9200 my index output http lo
  • Redis - 错误:值不是有效的浮点数

    我在 Redis 中有一个排序集 我试图通过在Python代码中使用zincrby来更新特定元素的计数器值 例如 conn zincrby usersSet float 1 user1 但它显示错误为 错误 值不是有效的浮点数 我在 cli
  • Rails Searchkick / Elasticsearch has_many 和belongs_to 关联

    我尝试使用 Searchkick 运行搜索并基于多个模型返回 我的书本模型包含这个 class Book lt ActiveRecord Base searchkick has many book subjects has many sub
  • 如果没有过期的内容,Redis maxmemory-policy volatile-lru 是否会被驱逐?

    我有一个 redis 服务器 设置了maxmemory policy set to volatile lru 文档表明 当达到内存限制时 这将从设置过期的条目集中逐出 在这种情况下 redis 是否只驱逐过期的项目 如果内存中的所有内容都设
  • 在elasticSearch中查询时定义分析器

    我对 Elasticsearch 还很陌生 只需要一些说明 我们可以在查询搜索服务器时定义一个分析器吗 我尝试使用 文本 和 字段 查询 效果很好 Query curl XPOST http localhost 9200 test user
  • 如何在Redis中存储聚合目录树搜索结果

    我有一个很大的产品目录树 目前包含约 36000 个类别和约 100 万个产品 即叶子 它的结构如下 最大深度为 5 Cat1 Cat11 Cat111 Cat1111 Product1 Cat1112 Product1 Cat1113 P
  • 在 Elasticsearch python 客户端中使用 SQL Access

    我正在尝试使用 python 客户端进行弹性搜索 以使用 SQL 访问进行弹性搜索来查询索引 我想使用sql语法查询索引 我如何指定elasticsearch必须读取SQL语法 def searchText text t1 time tim
  • node_redis CONFIG SET 命令

    我目前正在使用 redis 编写一个应用程序 但我遇到了 node redis 库的问题 特别是我无法弄清楚如何从 node redis 中使用 redis 命令 我已经尝试了以下所有 client send command CONFIG

随机推荐