06.Elasticsearch应用(六)

news2024/11/16 3:32:56

Elasticsearch应用(六)

1.什么是分词器

ES文档的数据拆分成一个个有完整含义的关键词,并将关键词与文档对应,这样就可以通过关键词查询文档。要想正确的分词,需要选择合适的分词器

2.ES中的默认分词器

  • fingerprint:删除所有符号,大写转小写,重复数据删除,排序,如果配置了停用词列表停用词也将被删除
  • keyword:不分词
  • language:用来分析特定语言文本的分析器
  • pattern:使用java正则表达式,默认非字符分割
  • english:英文分析器
  • simple:非字母切分,符号被过滤,所有均小写
  • standard:默认的,按词切分,所有均小写
  • stop:停用词过滤,其他与simple一样
  • whitespace:空格切分,不转小写

3.分词器的组成

介绍

  1. Character Filters: 在tokenizer之前对文本进行处理。例如删除字符、替换字符。主要是对原始文本的处理
  2. Tokenizer: 将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart,可以用java开发插,实现自己的Tokenizer
  3. Tokenizer Filter: 将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等。可能具有零个或多个按顺序应用的令牌过滤器

默认的Tokenizer

  • standard:按照符号,空格拆分
  • letter:非字母拆分为单词
  • whitespace:空格拆分
  • lowercase:等同于letter+lowercase token filter
  • uax_url_email:等同于standard+识别URL Email为单个单词
  • keyword:不做任何处理
  • pattern:默认模式是\W+,它在遇到非单词字符时会拆分文本
  • path_hierarchy:路径
  • char_group
  • simple_pattern
  • simple_pattern_split
  • classic(经典但是一般只适用于英文)
  • Thai Tokenizer(泰文分词器)
  • ngram
  • edge_ngram

默认的Character Filters

  • 可以配置多个,但会影响tokenizer的position和offset信息
  • html_strip:去除HTML标签
  • mapping:字符串替换
  • pattern_replace:正则匹配替换

默认的Token Filters

  • 将Tokenizer输出的单词,进行增加,修改,删除
  • Lowercase
  • stop
  • synonym

4.分词器API

请求全局分词器

GET /_analyze
{
    "analyzer":"分词器",
    "text":"被分词的文本"
}

请求某个索引下的分词器

POST /<index>/_analyze
{
    "field":"字段名",
    "text":"被分词的文本"
}

自定义分词器

POST /_analyze
{
    "tokenizer":"分词器",
    "filter":"Token Filter",
    "char_filter":"",
    "text":"被分词的文本"
}

5.指定分析器

# 指定索引的默认分析器
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}

# 指定字段的分析器
PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }
}

# 查询时指定分析器
GET my_index/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}

# 指定字段的搜索(search time)分析器
# 如果指定搜索分析器则必须指定索引分析器
PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace",
        "search_analyzer": "simple"
      }
    }
  }
}

# 指定索引的默认分析器与搜索的默认分析器
# 如果提供了搜索分析器则必须指定默认的索引分析器
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}

6.自定义分词器

说明

可以在创建索引库的时候,通过/settings来配置自定义的analyzer(分词器)

settings设置

PUT /<index>
{
    "settings":{
        "analysis":{
            "analyzer":{ // 自定义分词器
                "my_analyzer":{ // 自定义分词器名称
                    "tokenizer":"ik_max_word",
                    "filter":"pinyin"
                }
            }
        }
    }
}

自定义分词器

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer":{
          "type":"custom",
          "char_filter":["emoticons"],
          "tokenizer":"punctuation",
          "filter":["lowercase","english_stop"]
        }
      },
      "tokenizer": {
        "punctuation":{
          "type":"pattern",
          "pattern":[".",",","!","?"]
        }
      },
      "char_filter": {
        "emoticons":{
          "type":"mapping",
          "mappings":[":) => _happy_",":( => _sad_"]
        }
      },
      "filter": {
        "english_stop":{
          "type":"stop",
          "stopwords":"_english_"
        }
      }
    }
  }
}

POST /my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":"    I'm a :) person, and you?  "
}

7.ES如何确定搜索分析器

  1. analyzer搜索查询中的参数
  2. search_analyzer字段的映射参数
  3. 默认分词器
  4. 字段分词器
  5. 如果这些都没指定就使用默认分词器

8.ES如何确定索引分析器

  1. analyzer字段的映射参数
  2. analysis.analyzer.default指数设置
  3. 如果未指定这些参数,则使用standard分析器

9.注意

  • ES仅text字段支持analyzer映射参数
  • analyzer参数指定索引或搜索字段时用于文本分析的分析器,除非使用search_analyzer映射参数覆盖,否则此分析器将同时用于索引和搜索分析

10.IK分词器

为什么需要

因为内置分词器不支持中文,可以看以下默认分词器对中文的效果展示
在这里插入图片描述

参考链接

ik分词器github地址:https://github.com/medcl/elasticsearch-analysis-ik/

介绍

  • 是一个ES的插件
  • 中文分词器
  • 支持自定义词典
  • ik有两种分词器分别是,ik_smart , ik_max_word

版本对应

IK版本ES版本
master7.x -> master
6.x6.x
5.x5.x
1.10.62.4.6
1.9.52.3.5
1.8.12.2.1
1.7.02.1.1
1.5.02.0.0
1.2.61.0.0
1.2.50.90.x
1.1.30.20.x
1.0.00.16.2 -> 0.19.0

下载地址

进入该网址https://github.com/medcl/elasticsearch-analysis-ik/releases

安装到ES中

第一种方式(需要下载zip文件)
  • 解压zip文件到ES目录下的plugins目录即可
  • 重启ES
第二种方式(版本需要大于5.5.1)
  • 进入到ES目录下的bin目录
  • 执行命令(自己更换版本)
#注意,请将版本替换为自己所需要的版本
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.1/elasticsearch-analysis-ik-7.7.1.zip

# 其他命令扩展
# 查看已安装插件
elasticsearch‐plugin list
# 安装插件
elasticsearch‐plugin install analysis‐icu
# 删除插件
elasticsearch‐plugin remove analysis‐icu
  • 重启ES

两种分词器介绍

  • ik_smart:会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询
  • ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query

什么是词典

IK分词器根据词典进行分词,词典文件在lK分词器的config目录中

  1. main.dic: IK中内置的词典。记录了IK统计的所有中文单词
  2. IKAnalyzer.cfg.xml: 扩展词典

扩展字典

为什么需要扩展字典

因为ik分词器只识别默认的一些词语,有一些自造词无法识别例如‘骚年,极客时间,朋友圈’

配置扩展字典
  • 进入ik分词器目录下的config目录
  • 创建xxx.dic文件
  • 修改IKAnalyzer.cfg.xml文件
  • 修改内容
  • 重启ES
修改内容展示
#注意xxx.dic要与自己建立dic文件名一致
<?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">xxx.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">stopword.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
xx.dic格式如下
十多年
李白
传智慧

11.拼音分词器

为什么需要拼音分词器

要实现根据字母做补全,就必须对文档按照拼音分词

安装拼音分词器参考IK的安装方式

拼音分词器官网:https://github.com/medcl/elasticsearch-analysis-pinyin

拼音分词器测试

POST /_analyze
{
    "text":"如家酒店还不错",
    "analyzer":"pinyin"
}

拼音分词器的问题

  1. 默认情况下,不会进行分词类似于keyword
  2. 默认情况下,把文本的每一个字都分为了一个拼音
  3. 默认情况下,汉字去掉了
  4. 同音字问题

同音字问题

拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用,因为如果用户输入的是中文也会分词为拼音去匹配就会造成一些没用的文档,只希望输入中文就用中文查,用了拼音才用拼音分词器

在这里插入图片描述

自定义拼音分词器改造

  1. 使用自定义的分词器测试的时候需要指定索引库,里面不能直接去访问_analyzer那个API去测试,需要改为//_analyzer进行测试
  2. 在创建索引库的时候需要指定mapping中的某个字段的分词器为自定义分词器
    在这里插入图片描述

创建和搜索使用不同的分词器解决同音字问题

在这里插入图片描述

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

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

相关文章

软件游戏提示msvcp140.dll丢失的解决方法,全面分析msvcp140.dll文件

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;它包含了许多用于运行程序的函数和类库。当这个文件丢失或损坏时&#xff0c;依赖于该组件的应用程序可能无法正常启动&#xff0c;系统会弹出错误提示&#xff0c;告知用户找不到msvcp140.dll文件。…

【寒假打卡】Day02

文章目录 选择编程NC31 第一个只出现一次的字符面试题 01.01. 判定字符是否唯一 选择 以下程序运行后的输出结果是&#xff08; &#xff09; #include <stdio.h> void fun(char **p) { int i; for(i 0; i < 4; i) printf("%s", p[i]); } in t main() { …

河南嘉家购商贸有限公司获绿色积分信用认证

“实现绿色产业、打造完善的绿色产业链、走可持续发展共创共赢”。近日&#xff0c;河南嘉家购商贸有限公司获得绿色积分认证&#xff0c;确认了该企业在绿色消费积分领域的领先地位。 据了解&#xff0c;河南嘉家购商贸有限公司始终将绿色积分视为企业发展的核心要素。全面优化…

使用collection.Counter实现统计简化

背景介绍 在python的应用场景中&#xff0c;我们常常需要通过建立统计表来对某一个数据集中某些数据出现次数的统计&#xff0c;这时候经常会使用到python的字典数据类型建立映射表&#xff0c;一般的方法可能会比较繁琐&#xff0c;本篇博客介绍collection.Counter方法帮助简…

[Python] KDE图[作密度图(Kernel Density Estimate,核密度估计)]介绍和使用场景(案例)

KDE图是什么&#xff1f; 核密度估计&#xff08;Kernel Density Estimate&#xff0c;KDE&#xff09;是一种非参数统计方法&#xff0c;用于估计未知随机变量的概率分布。它通过在每个数据点附近放置一个核函数&#xff0c;并将这些核函数加总起来&#xff0c;得到对概率分布…

用可视化案例讲Rust编程4. 用泛型和特性实现自适配shapefile的读取

本节已经涉及Rust学习曲线上的一个大坑&#xff1a;泛型和特性了&#xff0c;属于语言的深水区&#xff0c;如果初学者&#xff0c;建议看一眼知道有这个功能即可。 如果我们立足于功能实现&#xff0c;那么做到像上一节那样就可以了&#xff0c;从原理上来说&#xff0c;每个…

javascript跳转微信: 扫码,分享链接,下载二维码

文章目录 微信后台配置扫码前端配置扫描二维码分享链接下载二维码 总结 微信后台配置扫码 参考&#xff1a; 微信二维码内容获取 在开发设置中配置扫码路由以及跳转路径 完成该配置后&#xff0c;可以通过扫描对应地址的二维码进入小程序的指定页面 前端配置 扫描二维码 …

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像&#xff0c;如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外&#xff0c;不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

测试人年终总结:入行三年,下一步怎么走,思想碰撞

原贴地址&#xff1a;入行三年&#xff0c;下一步怎么走&#xff0c;思想碰撞 TesterHome 熟悉环境&#xff0c;进步缓慢&#xff1b;停止思考&#xff0c;举步不前&#xff08;为什么会有这篇文章why 初心变质&#xff1a;计算机系毕业&#xff0c;毕业时的打算是从测试进&a…

如何实现人口、GDP等的空间化效果?

现在假设你遇到了某个情况&#xff0c;手头有某市十几个区县的人口总数但是你想要更加精细化的空间化数据产品&#xff0c;以方便后续进行核密低分析或者进行其它的空间、数据分析。 那我们应该如何通过十几个点的人口数据进行空间化呢&#xff0c;详细步骤如下&#xff1a; 第…

PHP“引用”漏洞

今日例题&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); include("flag.php"); class just4fun { var $enter; var $secret; } if (isset($_GET[pass])) { $pass $_GET[pass]; $passstr_replace(*,\*,$pass); } $o unser…

Flume介绍

一、介绍 Apache Flume 是一种分布式、可靠且可用的系统&#xff0c;用于有效地收集、汇总大量日志数据&#xff0c;并将其从多个不同来源转移到集中式数据存储区。 Apache Flume 的使用不仅限于日志数据聚合。由于数据源是可定制的&#xff0c;Flume 可用于传输大量事件数据&a…

OpenCV书签 #互信息的原理与相似图片搜索实验

1. 介绍 互信息&#xff08;Mutual Information&#xff09; 是信息论中的一个概念&#xff0c;用于衡量两个随机变量之间的关联程度。在图像处理和计算机视觉中&#xff0c;互信息常被用来度量两幅图像之间的相似性。 互信息可以看成是一个随机变量中包含的关于另一个随机变…

腾讯云tsf平台-部署微服务项目

腾讯云tsf平台-部署微服务项目 一、腾讯云tsf平台简介二、部署准备0&#xff08;数据库、中间件等部署&#xff09;三、部署准备1&#xff08;创建集群和命名空间&#xff09;1、准备部署资源--集群2、使用容器部署微服务步骤 1&#xff1a;创建容器集群步骤 2&#xff1a;创建…

数据结构:非完全二叉树(递归实现)

非完全二叉树是指在二叉树中&#xff0c;除了叶子节点&#xff08;无子节点&#xff09;外&#xff0c;其他节点的子节点个数可以不同&#xff0c;即不一定是每个节点都有两个子节点&#xff0c;有右孩子时也不一定有左孩子。 tree.h /* * 文件名称&#xff1a;tree.h * …

SpringBootAdmin邮件通知

在上一篇中我们学习到了 Admin Service Clustering 分布式缓存配置 &#xff0c;这一篇我们来学习&#xff0c;客户端离线&#xff0c;出现故障的时候&#xff0c;我们这么能及时知道呢&#xff0c;发现邮件通知也许是最简单的方式了&#xff01; 邮件通知 邮件通知将作为使用…

代码随想录 Leetcode111. 二叉树的最小深度

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; class Solution { public:int minDepth(TreeNode* root) {if(root nullptr) return 0;queue<TreeNode*> que;TreeNode* cur root;que.push(cur);int size 0;int depth 0;while (!que.empty()…

【方法】如何打开7Z格式压缩文件?

7Z是一种常见的压缩文件格式&#xff0c;那遇到7Z压缩文件&#xff0c;要如何打开呢&#xff1f; 想要打开7Z压缩包&#xff0c;需要用到解压缩软件&#xff0c;比如WinRAR、7-Zip等软件。安装软件后&#xff0c;只需要用鼠标双击7Z压缩包&#xff0c;就可以打开压缩包&#x…

高数总结(3

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

ECharts实现简单饼图和柱状图

1.JAVA 1.饼图 前端使用vue&#xff0c;后端使用SpringBoot <template><div><div class"card" style"padding: 15px">数据可视化分析&#xff1a;图书类型销量</div><div style"display: flex; margin: 10px 0"&g…