Elasticsearch进阶篇(三):ik分词器的使用与项目应用

news2024/11/15 19:23:57

ik分词器的使用

  • 一、下载并安装
    • 1.1 已有作者编译后的包文件
    • 1.2 只有源代码的版本
    • 1.3 安装ik分词插件
  • 二、ik分词器的模式
    • 2.1 ik_smart演示
    • 2.2 ik_max_word演示
    • 2.3 standard演示
  • 三、ik分词器在项目中的使用
  • 四、ik配置文件
    • 4.1 配置文件的说明
    • 4.2 自定义词库
  • 五、参考链接

一、下载并安装

GitHub下载地址:Releases · infinilabs/analysis-ik · GitHub

1.1 已有作者编译后的包文件

选择与所需es版本相同的ik分词器,下载已经打包后的.zip文件

image-20240421170408043

1.2 只有源代码的版本

首先下载源码解压后使用idea打开,修改es版本与分词器版本相同

image-20240421172009705

使用 mvn clean install 打包时报错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project elasticsearch-analysis-ik: Compilation failure
[ERROR] /D:/PersonalProjects/analysis-ik-7.17.11/analysis-ik-7.17.11/src/main/java/org/elasticsearch/index/analysis/IkAnalyzerProvider.java:[13,9] 无法将类 org.elasticsearch.index.analysis.AbstractIndexAnalyzerProvider<T>中的构造器 
AbstractIndexAnalyzerProvider应用到给定类型;
[ERROR]   需要: org.elasticsearch.index.IndexSettings,java.lang.String,org.elasticsearch.common.settings.Settings
[ERROR]   找到: java.lang.String,org.elasticsearch.common.settings.Settings

修改代码报错部分:增加indexSetting参数到super入参的第一个位置

image-20240421172326529

使用mvn clean install进行打包,注意我们所需的是/target/release目录下的.zip压缩包

image-20240421172441311

1.3 安装ik分词插件

将下载或者编译后的.zip文件解压到es的安装目录下的plugins目录下,并重命名为ik

image-20240421173223669

然后启动es,查看日志可发现已经加载的ik分词器

image-20240421173516905

二、ik分词器的模式

IK分词器提供了两种主要的分词模式:

  1. 细粒度分词模式(ik_max_word):

    • 在这种模式下,IK分词器会尽可能地按照词典中的词语进行最大长度匹配,将文本切分成连续的词语序列。
    • 这种模式适用于对文本进行细致的切分,会尽可能地将句子切分为最小的词语单元,能够获得更加精确的分词结果。
  2. 智能分词模式(ik_smart):

    • 在智能切分模式下,IK分词器会结合词典匹配和机器学习算法,根据文本的上下文信息进行分词,保留词语的完整性。

    • 这种模式能够更好地处理一些特殊情况,如未登录词和新词等,提高了分词的准确性和适用性。

2.1 ik_smart演示

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "中国篮球队"
}
{
    "tokens": [
        {
            "token": "中国",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "篮球队",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

2.2 ik_max_word演示

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "中国篮球队"
}
{
    "tokens": [
        {
            "token": "中国篮球",
            "start_offset": 0,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "中国",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "篮球队",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "篮球",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "球队",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 4
        }
    ]
}

2.3 standard演示

POST _analyze
{
  "analyzer": "standard",
  "text": "中国篮球队"
}
{
    "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
        }
    ]
}

三、ik分词器在项目中的使用

常规的最常用的使用方式就是,数据插入存储时用 ik_max_word模式分词,而检索时,用ik_smart模式分词,即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。

建立映射示例如下:在数据被索引时我们设置"analyzer": “ik_max_word”,在检索时指定"search_analyzer": “ik_smart”

{
  "properties": {
    "id": {
      "type": "long"
    },
    "title": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart",
      "fields": {
        "keyword": {
          "type": "keyword"
        },
        "sort": {
          "type": "keyword",
          "normalizer": "sort_normalizer"
        }
      }
    },
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    }
  }
}

输入检索词艺术歌曲,由于在mapping中设置了 “search_analyzer”: “ik_smart”,因此默认使用最大分词,根据bm25算分后返回结果如下

image-20240421193013506

四、ik配置文件

4.1 配置文件的说明

配置文件地址:\plugins\ik\config

image-20240421193621606

  1. IKAnalyzer.cfg.xml
    这是IK分词器的主要配置文件,用于配置分词器的一些参数和规则。例如,可以在这个文件中指定自定义词典、停用词表、分词模式等。

  2. ext.dic
    这是一个外部用户词典文件,用于存放用户自定义的词语。IK分词器在进行分词时会优先使用这个词典中的词语,可以用来补充分词器的默认词典,提高分词准确性。

  3. stopword.dic
    这是一个停用词表文件,用于存放需要在分词过程中忽略的常用词语。停用词通常是一些没有实际语义或者在特定场景中无关紧要的词语,如“的”、“是”、“在”等。

  4. quantifier.dic
    这是一个量词词典文件,用于存放中文中常见的量词,如“个”、“只”、“张”等。这些量词在分词过程中通常会被特别处理,以确保其正确分词。

  5. main.dic:ik原生内置的中文词库,总共有27万多条,只要是这些单词,都会被分在一起,都会按照这个里面的词语去分词

  6. preposition.dic: 介词

  7. surname.dic:中国的姓氏

4.2 自定义词库

每年都会出现新的流行语或者新的词语,但是自带的词库并未收录导致被分词。我们可以使用自定义词库来解决此问题。

示例:

image-20240421194554920

新增自定义词库 diy_word.dic,同时修改配置文件,指定自定义词库的名称。保存后重启es

image-20240421195024620

检索效果如下:

image-20240421195109755

五、参考链接

[1] ElasticSearch7.3学习(十五)----中文分词器(IK Analyzer)及自定义词库_eleasticsearch ikanalyzer已经内置了词库是干什么用-CSDN博客

[2] ElasticSearch(ES)、ik分词器、倒排索引相关介绍 - 一剑一叶一花 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态内存的管理

1.为什么要有动态数组呢 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 上述开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的数组在申明的时候&#xff0c;必须指定数组的长度&#xff0c;数组空间一旦确定了大小…

【AI自媒体制作】【AI工具】天工AI

链接&#xff1a;天工AI 目前chatgpt3.5已经免费&#xff0c;很多AI平台都可以进行一定层度的白嫖&#xff0c;对于个人开发者是一件好事&#xff0c;有些会员就没必要充值了。 天工AI是比较常见的AI工具了&#xff0c;可以识别图片、智能问答、生成图片等。当然对于一个程序员…

关于电商独立站搭建中电商API数据采集接口的应用

搭建供应链系统时&#xff0c;您可能需要与电商平台进行集成&#xff0c;以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口&#xff0c;可以帮助您构建供应链系统&#xff1a; 1. **淘宝开放平台接口**&#xff1a;淘宝开放平台提供了丰富的接口&#xff…

上位机图像处理和嵌入式模块部署(树莓派4b和驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…

Selenium web自动化测试环境搭建

Selenium web自动化环境搭建主要要经历以下几个步骤&#xff1a; 1、安装python 在python官网&#xff1a;Welcome to Python.org&#xff0c;根据各自对应平台如&#xff1a;windows&#xff0c;下载相应的python版本。 ​ 下载成功后&#xff0c;点击安装包&#xff0c;一直…

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢&#xff1f;相必各位或多或少都玩过一点&#xff0c;再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…

shell编写

运算符 echo 打印 unset 删除 [ boolean表达式 ] 注意中括号中有两个空格&#xff0c;两个空格中添加表达式 0为true 1为false $?查看结果 -ge 大于等于 lt小于 le小于等于 eq等于 ne不等于 格式& | [ 表达式 ] -o是或者or的意思 -a是and的意思 &#xff01…

访问学者申请的成功经验

在申请成为访问学者时&#xff0c;经验是至关重要的。下面知识人网小编将介绍一些可以帮助您成功申请的经验和技巧。 首先&#xff0c;了解目标机构或大学的研究方向和需求是非常重要的。在申请之前&#xff0c;仔细研究该机构的学术项目、研究成果以及教授的专业领域&#xff…

kaggle 泰坦尼克号2 得分0.7799

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

Redis 逻辑过期策略设计思路

引言&#xff1a; 当我们平常使用Redis缓存的时候&#xff0c;会出现一种场景&#xff0c; redis的key到过期时间了&#xff0c;总是需要到数据库里面去查一遍数据再set回redis&#xff0c;这个时候如果数据库响应比较慢&#xff0c;那么就会造成用户等待&#xff0c;如果刚好…

python爬虫小案例——汽车之家

本篇文章是使用bs4中的BeautifulSoup和requests解析网页和获取数据&#x1f451;&#x1f31f; 文章目录 &#x1f31f;前言一、&#x1f349;bs4中的BeautifulSoup二、&#x1f349;bs4的语法三、&#x1f349;内容实践1. 确定想要爬取的内容2. 分析网页3. 获取数据分析 &…

【ThinkPHP框架教程·Part-02】开发规范和目录结构

文章目录 一、开发规范1、目录和文件的规范2、函数和类、属性命名规范3、常量与配置的规范4、数据表和字段的规范 二、目录结构1、单应用模式目录结构图&#xff08;默认&#xff09;2、多应用模式目录结构图&#xff08;自定义&#xff09;3、仅允许public目录对外访问4、其他…

软考141-上午题-【软件工程】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 真题7&#xff1a; 真题8&#xff1a; 真题9&#xff1a; 真题10&#xff1a; 真题11&#xff1a; 真题12&#xff1a; 真题13&#xff1a; 真题14&a…

4.20 IO流

IO流结构 InputStream&#xff08;字节输入流&#xff09; public static void main(String[] args) {// byteInputStream();// byteInputStream1();// byteInputStream2();byteInputStream3();}// 使用字节流时对于中文汉字基本都会出现乱码问题&#xff0c;因此对中文乱码问…

ccfcsp201312-2 ISBN号码

注意&#xff1a;50分 -- u10&#xff0c;最后一位为X 代码&#xff1a; #include <bits/stdc.h> using namespace std; string s; int a[12]; int main() {cin >> s;a[1] s[0] - 0;a[2] s[2] - 0;a[3] s[3] - 0;a[4] s[4] - 0;a[5] s[6] - 0;a[6] s[7] - …

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

一.排序的概念 1.排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 2.稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排…

【WinForm】背景图片绘制无效果的解决方法

例如&#xff0c;在WinForm桌面的窗体设置了背景图片&#xff0c;尝试从上方绘制时却未能产生预期效果, 就是从背景图片上面绘制却没有效果。 文章目录 示例改进 下面是一个在窗体背景上绘制圆形边框的示例。 示例 修改前&#xff0c;代码如下 var gCtx Graphics.FromImage…

vulfocus靶场redis 未授权访问漏洞之CNVD-2015-07557

目标系统的权限不够redis用户无法写计划任务和公钥&#xff0c;而且也没有开放ssh端口。 主从复制getshell&#xff0c;写入恶意的so文件达到执行系统命令的目的。 github上有一键可以利用的脚本 https://github.com/n0b0dyCN/redis-rogue-server.git 利用条件&#xff1a;需…

polkit服务启动失败

使用systemctl 命令报错 Authorization not available. Check if polkit service is running or see debug message for more information. 查看polkit状态是失败的状态&#xff0c;报缺少libstdc.so.6 systemctl status polkit 需要安装libstdc.so.6库 先加载所有安装包 …

深入剖析Spring框架:循环依赖的解决机制

你好&#xff0c;我是柳岸花开。 什么是循环依赖&#xff1f; 很简单&#xff0c;就是A对象依赖了B对象&#xff0c;B对象依赖了A对象。 在Spring中&#xff0c;一个对象并不是简单new出来了&#xff0c;而是会经过一系列的Bean的生命周期&#xff0c;就是因为Bean的生命周期所…