06.Elasticsearch应用(六)

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.rhkb.cn/news/245020.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《机器学习》客户流失判断-python实现

客户流失判断 题目赛题描述数据说明赛题来源-DataCastle 问题描述解题思路Python实现读取数据并初步了解导入宏包读取数据查看数据类型检查缺失值描述性统计分析 可视化分析用户流失分析特征分析任期年数与客户流失的关系&#xff1a;服务类属性分析特征相关性分析 数据预处理类…

重生之我是学神,小小c语言题目可笑可笑

#include<stdio.h> int main(void) { float score[10]{0}; int i 0; for(i0;i<10;i) { printf("请输入%d学生成绩",i1); scanf("%f",&score[i]); } float sum0; int m…

【轮式平衡机器人】——TMS320F28069片内外设之GPIO

引入 接下来的几期博客会介绍轮式平衡机器人TMS320F28069片内外设&#xff0c;了解片内外设的基本原理&#xff0c;内容较为基础&#xff0c;都是些简单的simulink模型&#xff0c;旨在将复杂的原理过渡到simulink软件应用。足够了解的博友可跳过。 后续还将会结合MATLAB/Sim…

分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 …

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GC 可视化的GC日志分析工具 JVM 待更新中ing GC 垃圾回收:…

【并发编程】ReentrantLock

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 相对于synchronized 它具备如下特点&#xff1a; 可中断可以设置超时时间可以设置公平锁支持多个条件变量 与synchronized一样&#xff0c;都支…

unity学习笔记----游戏练习06

一、豌豆射手的子弹控制 创建脚本单独控制子弹的运动 用transform来控制移动 void Update() { transform.Translate(Vector3.right * speed * Time.deltaTime); } 创建一个控制子弹速度的方法&#xff0c;方便速度的控制 private void SetSpeed(float spee…

安全防御第二次作业

将内网中各个接口能够ping通自己的网关 1.划分vlan [sw6]vlan batch 2 3 [sw6]int g0/0/2 [sw6-GigabitEthernet0/0/2]port link-type access [sw6-GigabitEthernet0/0/2]port default vlan 2 [sw6-GigabitEthernet0/0/2]int g0/0/3 [sw6-GigabitEthernet0/0/3]port link-t…

系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

/** description: 将普通的publicKey转化得到一个RSAPublicKey* author: zkw* date: 2024/1/24 16:17* param: publicKey 普通的publicKey* return: RSAPublicKey 得到一个新的RSAPublicKey**/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorit…

Pandas ------ 向 Excel 文件中写入含有合并表头的数据

Pandas ------ 向 Excel 文件中写入含有合并表头的数据 推荐阅读引言正文 推荐阅读 Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言 这里给大家介绍一下如何向 Excel 中写入带有合并表头的数据。 正文 import pandas as pddf1 pd.D…

自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)

最近考虑myBatis中sql语句使用规范的问题&#xff0c;如果漏下条件或者写一些不规范语句会对程序性能造成很大影响。最好的方法就是利用代码进行限制&#xff0c;通过拦截器进行sql格式的判断在自测环节就能找到问题。写了个简单情景下的demo&#xff0c;并通过idea插件来将myB…

leaflet学习笔记-带过滤的图例(九)

前言 图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素&#xff0c;本文要介绍的图例组件还可以按需求过滤掉不用显示的要素&#xff0c;使地图的更能清晰的显示我们需要显示的内容 技术核心 说到过滤要素&#xff0c;第一时间想到的就是滑块组件…

内网穿透、远程桌面、VPN的理解

最近在研究内网穿透的相关技术&#xff0c;然后回想起一些相关的技术&#xff0c;比如说要远程桌面公司的电脑&#xff0c;VPN连入内网等。然后想着在此处记录一下&#xff0c;各个的区别&#xff0c;这个纯粹是从技术层面的理解&#xff0c;此处不详细解释怎么去实现或者用什么…

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器&#xff0c;它的特点是后进先出&#xff0c;只能在容器的一端进行插入和删除操作。 stack的使用很简单&#xff0c;主要有…

在IDEA中创建SpringBoot项目

概述 SpringBoot是由Pivotal团队提供的全新的框架&#xff0c;其设计的目的是用来简化Spring应用的初始搭建以及开发过程。 传统方式构建Spring应用程序 导入依赖繁琐 依赖冲突 项目配置繁琐 SpringBoot特性 1、起步依赖 本质上就行一个Maven坐标&#xff0c;整合了完成一…

Java 集合List相关面试题

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

dataGrip连接数据库mysql和intersystems的iris

文章目录 前言创建新项目选择对应的数据库产品类型新建数据库资源连接sql命令窗体手动配置本地驱动 前言 intersystems公司的产品iris是cache的升级版本&#xff0c;目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/da…

eBay在人工智能道路上的成败得失:衡量标准是关键

我是2006年加入eBay的。2009年&#xff0c;这家公司的运营状况非常糟糕&#xff0c;其股价创历史新低&#xff08;远低于近24美元的历史高位&#xff09;&#xff0c;还出现削减各项成本、负增长、市场占有率降低、技术团队缺乏创新能力等情况。 简而言之&#xff0c;eBay公司…

CentOS7自动备份数据库到git

虽然数据库没什么数据&#xff0c;但是有就是珍贵的啦&#xff0c;为了服务器什么的无了&#xff0c;所以还是要自动备份一下比较好。 Open备忘第一页 步骤 在Gitee&#xff08;github&#xff09;上创建一个私有仓库Gitee&#xff08;github&#xff09;配置好服务器的ssh在服…

Oracle BIEE 示例(一)数据透视表2

1 背景 版本:BIEE 12C 视图:数据透视表 实现内容(顺序与具体内容不一致): 2 空列显示(方法一) 2.1 问题 列为空时,标题栏不显示信息。 2.2 期望 即使数据为空,也要显示列名。 2.3 官方资料 2.3.1 操作步骤 2.3.1.1 要在分析级别关闭空值隐藏,请执行以下操作…