当前位置: 首页 > news >正文

ES 全字段模糊检索时分词方式对检索结果的影响

文章目录

    • 背景
    • 创建索引指定 _all 分词为空格
      • 创建索引
      • 插入索引数据
      • 全字段的模糊检索
    • 创建索引指定 _all 分词为 keyword
      • 索引创建
      • 插入数据
      • 模糊检索
    • 创建索引不配置 _all
    • 不同分词的结果
    • 启示录

背景

2018年参与使用 ES 和 Kafka 项目的开发,当时主要是做前端开发,虽然主要工作领域是后端,但是一直很排斥 ES 和 Kafka 这两个组件,后来前后台开发任务交替,断断续续补了一下这两个组件的基础原理,总是记不住,碰到的一些小问题解决后就忘记了,这俩组件的技术债一直欠着。

这周避不开 ES 的一个模糊检索问题,索引创建的时候没有指定 _all 的分词方式,对模糊检索中包含中文的请求的影响是什么?

  1. query_string 全字段检索时,使用的分词方式是什么?_all 指定的,默认是standard
  2. query_string 指定字段检索时,使用的分词方式是什么?whitespace
  3. 索引 mapping 设置了_all 的分词对全字段检索的影响?使用指定的分词方式。
  4. 创建字段的 mapping 里面没有设置 analyzer 的话,默认的分词方式是什么?whitespace

本文以三个不同索引的全字段模糊检索,ES版本5.4.0 环境,验证结果如下:

  1. mytest 索引,设置 _all 分词为 whitespace:有空格走分词,中文词组正常分词,能查到结果。
  2. article-01 索引,设置 _all 分词为 keyword:期待输入检索参数即使包含空格,也能直接检出符合条件的数据,实际什么都查不出来。
  3. article-02 索引,没有设置 _all 分词:有空格正常分词检索,中文单个词能查到,词语查不到。

创建索引指定 _all 分词为空格

创建索引

执行 PUT http://IP:9200/mytest 请求,指定 _all 分词为空格:

{"index_patterns": ["log*","product*"],"settings": {"number_of_shards": 2,"number_of_replicas": 1},"mappings": {"article": {"_all": {"analyzer": "whitespace"},"properties": {"ip": {"type": "keyword"},"method": {"type": "keyword"}}}}
}

执行结果:创建一个索引名称是 mytest 类型 doc 的索引。
在这里插入图片描述

插入索引数据

发送 PUT mytest/doc/1 ...5 次请求,插入5条数据:
在这里插入图片描述

全字段的模糊检索

验证全字段上模糊检索包含空格和不包含空格的检索结果:
在这里插入图片描述
索引指定了 _all 的分词为空格分词,所以检索字符串进行空格分词后查询结果同时查出来分词之前的 239 和 001 的内容。其实我希望得到的是精确的模糊匹配的结果的,空格分词方式不行,那么改成 keyword 分词呢?

创建索引指定 _all 分词为 keyword

索引创建

按相同方法新建一个索引 _all 的分词类型为 keyword

"mappings": {"article": {"_all": {"analyzer": "keyword"},"properties": {"method": {"type": "keyword"},"ip": {"type": "keyword"}}}
}

插入数据

相同操作插入数据:
在这里插入图片描述

模糊检索

1、输入包含空格的关键字:输入一个带空格的检索,出的结果也不符合预期,无数据。
在这里插入图片描述
2、输入不含空格包含在数据中、任意一部分的关键字,能查到数据:
在这里插入图片描述

创建索引不配置 _all

相同操作创建索引 article-02,不配置 _all 属性的时候,插入几条数据:
在这里插入图片描述

模糊检索使用的中文词组:在这里插入图片描述
单个中文汉字输入时能检索到:
在这里插入图片描述

不同分词的结果

1、standard 分词,中文字符串拆成一个个的,英文字符串以空格为单位进行拆分:
在这里插入图片描述

2、whitespace 分词,按空格切分:
在这里插入图片描述
3、keyword 分词: 直接作为一个整体,不拆分。
在这里插入图片描述

启示录

首先,有一个知识点是确定的,在使用 _all 进行全字段检索的时候,分词方式与 _all 设定的分词方式有关,如果索引没有设置,则就是默认的 standard 分词方式。

其次,使用空格的分词方式,那对模糊检索包含空格的内容作分词,结果跟我们常规理解的 SQL 形式的 Like 语法还是不一样的,我们希望的是空格被作为一个整体内容进行检索的。

第三点,网络上说的 query_string 的关键字使用 (*目标字符串*) 包裹后就不会分词,这点无效。

第四点,未指定 _all 的分词方式时,对 ES6.8 以上的高版本的中文词组检索没有影响。

最后一个问题,为什么设置全文检索的分词为 keyword 后,什么输入包含空格的关键字后,检索不到了呢?

ES _all、_source的使用:_all字段连接所有字段的值构成一个用空格(space)分隔的大 string 而被 analyzed 和 index,document 主体保存在_source中。

按这个解释,当 _all 分词方式是 keyword 的时候,目标检索关键字没有被分词,而作为一个整体了。由于 _all 字段存储的值是按空格进行分词,索引后的内容是不含空格,所以目标检索关键字中有空格,就查不到数据。

相关文章:

ES 全字段模糊检索时分词方式对检索结果的影响

文章目录 背景创建索引指定 _all 分词为空格创建索引插入索引数据全字段的模糊检索 创建索引指定 _all 分词为 keyword索引创建插入数据模糊检索 创建索引不配置 _all不同分词的结果启示录 背景 2018年参与使用 ES 和 Kafka 项目的开发,当时主要是做前端开发&#…...

基于Python Django 的微博舆论、微博情感分析可视化系统(V2.0)

文章目录 1 简介2 意义3 技术栈Django 4 效果图微博首页情感分析关键词分析热门评论舆情预测 5 推荐阅读 1 简介 基于Python的微博舆论分析,微博情感分析可视化系统,项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 Python基于微博…...

python读取Excel到mysql

常见问题: 1.数据库密码有特殊字符 使用urllib.parse.quote_plus 编译密码 mysql_engine create_engine((f"mysqlpymysql://root:%s10.0.0.2:3306/mydb")%urllib.parse.quote_plus("passaaaa")) 2.设置字段类型 设置特定类型,和指…...

C++八股文面经

1.介绍一下你对面向对象的理解, 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组合成一个对象,以此来描述现实世界中的事物和概念。在面向对象编程中&#…...

【Linux】静态库和共享库一分钟快速上手

Linux 前言对比创建静态库动态库 前言 程序库,对于程序原来说是非常重要的。但不少人对其不太了解,接下来一起学习其中的奥秘吧! 简单来说,程序库可以分为静态库和共享库。它们包含了数据和执行代码的文件。其不能单独执行&#…...

C++继承总结(下)——菱形继承

一.什么是菱形继承 菱形继承是多继承的一种特殊情况&#xff0c;一个类有多个父类&#xff0c;这些父类又有相同的父类或者祖先类&#xff0c;那么该类就会有多份重复的成员&#xff0c;从而造成调用二义性和数据冗余。 class Person {public:Person(){cout << "P…...

CCF CCSP2023参赛记 + 算法题题解

大家好啊&#xff0c;时隔多年&#xff0c;作为大四老年人&#xff0c;再次来到这个地方记录算法竞赛相关&#xff0c;可能也是最后一次参加这种算法赛事了&#xff0c;我觉得还是很有纪念意义的。虽然我高中搞OI被强基背刺&#xff0c;以至于到了大学有点躲着竞赛&#xff0c;…...

buuctf_练[GYCTF2020]FlaskApp

[GYCTF2020]FlaskApp 文章目录 [GYCTF2020]FlaskApp常用绕过方法掌握知识解题思路解题一 -- 计算pin码解题二 -- 拼接绕过 执行命令 关键paylaod 常用绕过方法 ssti详解与例题以及绕过payload大全_ssti绕过空格_HoAd’s blog的博客-CSDN博客 CTF 对SSTI的一些总结 - FreeBuf网…...

针对element-plus,跳转jump(快速翻页)

待补充 const goToPage () > {const inputElement document.querySelector(.el-pagination .el-input__inner);console.log(inputElement, inputElement); } 打印之后可以看到分页跳转的数字输入框&#xff0c;是有进行处理的&#xff0c;max"102",是我自己的…...

【软件安装】Windows系统中使用miniserve搭建一个文件服务器

这篇文章&#xff0c;主要介绍如何在Windows系统中使用miniserve搭建一个文件服务器。 目录 一、搭建文件服务器 1.1、下载miniserve 1.2、启动miniserve服务 1.3、指定根目录 1.4、开启访问日志 1.5、指定启动端口 1.6、设置用户认证 1.7、设置界面主题 &#xff08;…...

iOS .a类型静态库使用终端进行拆解和合并生成

项目中会用到许多第三方的.a类型的静态库&#xff0c;有时候会有一些静态库回包含相同文件而产生冲突&#xff0c;我们就需要对这个库进行去重的一个操作。一般有哪些文件冲突了&#xff0c;xcode报错都会有详细的提示。我们可以将这两个库合并&#xff0c;也可以其中一方中的文…...

react-组件间的通讯

一、父传子 父组件在使用子组件时&#xff0c;提供要传递的数据子组件通过props接收数据 class Parent extends React.Component {render() {return (<div><div>我是父组件</div><Child name"张" age{16} /></div>)} }const Child …...

【广州华锐互动】VR公司工厂消防逃生演练带来沉浸式的互动体验

在工业生产过程中&#xff0c;安全问题始终是我们不能忽视的重要环节。特别是火灾事故&#xff0c;不仅会造成重大的经济损失&#xff0c;更会威胁到员工的生命安全。传统的消防安全训练方法&#xff0c;如讲座、实地演练等&#xff0c;虽然具有一定的效果&#xff0c;但是无法…...

可观察性支柱:探索日志、指标和跟踪

通过检查系统输出来测量系统内部状态的能力称为可观察性。当可以仅使用输出信息&#xff08;即传感器数据&#xff09;来估计当前状态时&#xff0c;系统就变得“可观察”。您可以使用来自 Observability 的数据来识别和解决问题、优化性能并提高安全性。 在接下来的几节中&am…...

nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS

1.nginx控制浏览器缓存是针对于静态资源[js,css,图片等] 1.1 expires指令 location /static {alias/home/imooc;#设置浏览器缓存10s过期expires 10s;#设置浏览器缓存时间晚上22:30分过期expires @22h30m;#设置浏览器缓存1小时候过期expires -1h;#设置浏览器不缓存expires …...

硬件安全与机器学习的结合

文章目录 1. A HT Detection and Diagnosis Method for Gate-level Netlists based on Machine Learning摘要Introduction 2. 基于多维结构特征的硬件木马检测技术摘要Instruction 3. A Hardware Trojan Detection and Diagnosis Method for Gate-Level Netlists Based on Diff…...

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据&#xff0c;统一管理&#xff0c;再分发给下游的离线/在线处理平台&#xff0c;构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务&#xff0c;并对任务进行修改配置&#xf…...

内存马概念

内存马概念 文章目录 内存马概念木马演变内存使用条件内存缺点JAVA Web三大组件Listener:监听器servelet请求流程内存马分类内存演示内存马植入方式案例shiro反序列化漏洞植入内存马 木马演变 内存使用条件 1. 禁止外联 2. 文件监控、查杀 3. spring Boot&#xff0c;不支持js…...

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图&#xff0c;目前企业中有20个VLAN, 编号为VLAN1&#xff5e;VLAN20, 为了确保内部网络的可靠性&#xff0c;使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽&#xff0c;现管理员希望通过配置MSTP 的负载均衡实现网络带宽…...

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…...

计算机网络之数据链路层(全)

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…...

前端TypeScript学习-交叉类型与泛型

交叉类型和泛型是TypeScript中的两个重要概念。 交叉类型&#xff08;&&#xff09;可以用来组合多个接口&#xff0c;形成一个新接口。它类似于接口继承&#xff08;extends&#xff09;&#xff0c;但有一些区别。交叉类型不会产生类型继承层次结构&#xff0c;而是将多…...

科聪协作(复合)移动机器人整体解决方案

协作&#xff08;复合&#xff09;移动机器人&#xff08;AGV/AMR&#xff09;相较传统工业机器人具有更加安全和简单的工作优势&#xff0c;具备较强的发展潜力。协作&#xff08;复合&#xff09;移动机器人安全性和操作的简洁性、灵活性不断提高,优势得到了充分发挥,在越来越…...

RTE(Runtime Environment)

RTE&#xff08;Runtime Environment&#xff09;是一个运行时环境&#xff0c;在这个环境里&#xff0c;你可以实现的功能是&#xff1a; 作为一个缓冲buffer给应用层和BSW层的接口&#xff08;例如COM&#xff09;用来存储数据&#xff0c;也就是说定义一个全局变量供上层和下…...

搭建自己的搜索引擎——oh-my-search使用

搭建自己的搜索引擎——oh-my-search使用 使用elasticsearch和search-ui搭建自己的搜索引擎&#xff0c;快速查找资源和文件。如果对代码感兴趣&#xff0c;相关代码已在github上开源&#xff0c;欢迎fork代码。 搭建elasticsearch 先搭建eleasticsearch再搭建kibana 搭建e…...

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…...

行情分析——加密货币市场大盘走势(10.27)

目前大饼开始了震荡盘整&#xff0c;目前远离EMA21均线&#xff0c;预计会有大的回调动作。而MACD日线来看&#xff0c;昨日和今日开始呈现绿色空心柱&#xff0c;也在说明大饼在做震荡盘整。不排除大跌的可能性&#xff0c;大饼可以开始布局中长线空单&#xff0c;可以再35000…...

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介&#xff1a; 桥接模式&#xff0c;它是一种结构型设计模式&#xff0c;它的主要目的是将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化。…...

error: the following arguments are required: --model, --data 解决方法

错误原因&#xff1a;Windows下需要缺乏配置参数&#xff0c;需要进行相关参数配置。 解决办法&#xff1a;在Pycharm的编辑设置&#xff0c;加上–model--model ****,其中****为指定的模型名称&#xff0c;按照自己实际报错进行添加&#xff0c;比如我这里要跑的模型为bert&am…...

Kafka - 消息队列的两种模式

文章目录 消息队列的两种模式点对点模式&#xff08;Point-to-Point&#xff0c;P2P&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff0c;Pub/Sub&#xff09; 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…...