ES分词查询

全文检索介绍

全文检索的发展过程:

  1. 数据库使用SQL语句:select * from table where data like “%检索内容%”
  2. 出现lucene全文检索工具(缺点:暴露的接口相对复杂,且没有效率)
  3. 出现分布式检索服务框架solr(缺点:建立索引期间。solr搜索能力极度下降,造成实时索引效率不高)
  4. 出现 Elasticsearch ,是以lucene为基础,基于Restful接口进行发布

非结构化数据查找方法

  1. 顺序扫描法:遍历所有文件,找到所包含的字符
  2. 全文检索:将非结构化数据中的一部分信息提取,重新组织,使其变得具有一定结构,然后对此有一定结构的数据进行检索。这部分从非结构数据中提取重新组织的信息称之为索引,这种先建立索引,再对索引进行搜索的过程叫做全文检索(full-text search)

Lucene全文检索流程

image.png

ES

ES简介

ES与Solr对比

  • Solr使用zookeeper进行分布式管理,而ES自身带有分布式协调管理
  • Solr支持更多格式数据,而ES仅支持json
  • Solr官方提供功能更多,而ES本身更注重核心功能,高级功能由第三方插件提供
  • ES在处理实时搜索应用时效高于Solr

ES架构模块

image.png

  • Gateway:存储索引的文件系统,支持多种类型(Local本地、Shared分片、Hadoop、Amazon)
  • Distributed Lucene Directory:分布式的Lucene框架
  • Lucene之上是ES 的模块,包括:索引模块、搜索模块、映射解析模块
  • ES之上是Discovery、Scripting和第三方插件
    • Discovery:ES 的节点发现模块,不同机器上的ES节点要组成集群需要进行消息通信,集群内部master选举等,支持多种发现机制,如Zen、EC2
    • Scripting:用来支持查询语句插入JavaScript、python等脚本语言,Scripting模块负责解析这些脚本,但使用这些脚本性能较低,同时ES也支持多种第三方插件
  • 再往上Transport模块:主要是ES的传输模块和JMX(Java的管理框架)传输模块,支持多种传输协议,如Thrift、Memacached、http等,默认是http
  • 再往上就是ES提供的用户接口

核心概念

  1. 索引ndex:就是一堆有相似结构的文档数据,用于区分文档成组,即分到一组的文档集合
  2. 类型Type:用于区分索引中的文档,即在索引中对数据逻辑分区。比如将博客平台所有数据存储到一个索引中,在该索引中,可为用户数据、博客数据、评论数据等分别定义一个type
  3. 文档Document:指定了唯一 ID 的最底层或者根对象,ES的最小数据单元
  4. 字段Field:定义Document应有的字段

ES与MySQL类比:
image.png

  1. 集群cluster:由多个节点组织在一起,共同持有整个集群数据(注意:一个集群有唯一的名字标识,默认是“elasticsearch”。一个节点只能通过指定某个集群的名字加入该集群)

  2. 节点node:集群中的一个服务器
    一个节点由一个名字标识,默认情况是随机的“漫威漫画角色名字”
    一个节点可通过配置集群名称方式加入指定集群,默认下,每个节点都被安排到“elasticsearch”集群中
    若启动第一个节点,会默认创建并加入到叫“elasticsearch”的集群

  3. 分片shard

一个索引可存储超出某节点硬件限制的大量数据,比如一个10亿文档的索引占据1T磁盘空间,而任一节点都没有这么大的磁盘空间;或单个节点处理请求响应太慢。为解决此类问题,ES将索引划分为多份shard的能力,称为分片。
创建一个索引的时候,可指定分片数量,每个分片本身就是一个功能完整且独立的“索引”,该“索引”可被放置到集群的任何节点
分片的作用:

  • 允许水平分割/扩展容量
  • 允许在分片上进行分布式、并行的操作,进而提高性能/吞吐量

对于一个分片如何分布,文档是如何聚合响应搜索请求,完全由ES管理,对于用户是透明的

  1. 副本replica

在分布式环境下,任何分片/节点都可能失效,导致index无法搜索,所以为了保证数据安全,会将每个index分片进行复制备份,这种拷贝称为副本replica
副本的作用:

  • 在分片/节点失效情况下,提供高可用性(注意到ES的副本分片从不与 原/master 分片置于同一节点上)
  • 扩展搜索量/吞吐量,因为搜索可在所有复制上并行运行

总之,每个索引可被分为多个分片,每个索引可被复制0-n次。一旦创建副本,每个索引就有了主分片和副本分片。分片和副本的数量可在索引创建时指定,创建完成后,可改变副本数量,但无法改变分片的数量
默认情况下,ES分片配置是5、副本数配置是1(如果集群至少2个节点,该索引将会有5个主分片、5个副本分片(完全拷贝),该索引总共有10个分片)

分词查询

举例说明:
文本:“我正在学习数据结构和算法”
对文本查询一般分为三种:

  1. 模糊查询:类似sql中的like查询
    “学习”、“数据结构”、“算法”能搜索到结果
  2. 精确搜索:文本内容与搜索关键词一致
    关键词一定要是“我正在学习数据结构和算法”才匹配
  3. 分词搜索:对搜索关键字和搜索内容都进行分词,只要匹配到一个分词内容,就命中相关内容
    “算法之美”也能搜索到结果,因为分词搜索,只需关键字的分词匹配到即可(用模糊查询是无法搜索出结果)

在ES中,使用term、match、match_phrase、keyword进行相关搜索
涉及多个关键字
text和keyword是数据类型,对磁盘待查询数据是否进行分词

  • text:分词,在写入磁盘时,分割成多个独立单词,然后存入倒排索引。查询时也是以单词维度进行匹配
  • keyword:不分词,存放整个短语

math和term是搜索方式,是数据查询时,要查询的短语是否进行分词

  • match:对搜索的内容进行分词,拿分词数据去倒排索引中查询
  • term:不对搜索内容进行分词,是完全匹配

数据准备,在索引base-product-spu-info中有一条数据

{
"spuName" : "【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付"
}

查看其分词结果:

GET base-product-spu-info/_analyze
{
"analyzer": "standard",
  "text":  "【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付"
}
// 分词结果:市|场|价|2532|huawei|watch|2|pro|4g|智|能|手|表|移|动|支|付

term搜索

term搜索对搜索词不分词,但还是会对要搜索的字段进行分词。一旦加上keyword属性,就不对数据进行分词,变成精确搜索

注意:默认情况下,不加keyword属性,使用的是text

  1. 搜索关键字“智”(term+text)
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName": {
        "value": "智"
      }
    }
  }
}
// 结果:搜索出数据

QueryBuilders.termQuery("spuName", "智");
  1. 搜索关键字“智能”
    结果:无匹配数据(分词结果中无此分词)
  2. 搜索关键字“Pro”
    结果:无匹配数据
  3. 搜索关键字“pro”
    结果:搜索出数据
  4. 搜素关键字“【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付”
    结果:无匹配数据(因为搜索词未分词)
  5. 搜索关键字“【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付”【加上keyword关键字】(term+keyword)
GET base-product-spu-info/_search
{
  "query": {
    "term": {
      "spuName.keyword": {
        "value": "【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付"
      }
    }
  }
}
// 结果:搜索出数据

match搜索

match会对搜索词进行分词,再进行分词搜索(同时不加keyword的情况下,数据也会分词)

GET base-product-spu-info/_search
{
  "query": {
    "match": {
      "spuName": "手机"
    }
  }
}
// 结果:搜索出数据(分词为“手|机”,命中数据分词)

QueryBuilders.matchQuery("spuName", "手机");

match_phrase搜索

match_phrase搜索为短语搜索,要求短语中所有分词必须同时出现在文档中,同时位置必须一致

GET base-product-spu-info/_search
{
  "query": {
    "match_phrase": {
      "spuName": "智能手表"
    }
  }
}
// 结果:搜索出数据

QueryBuilders.matchPhraseQuery(“spuName”,"智能手表");

假若搜索关键字“智能手表1”,则无法匹配数据,因为分词“1”并不在数据分词中,所以无法命中。同样的,“手表智能”也无法命中

match_phrase_prefix

与match_phrase用法类似,区别在于,它允许对最后一个词条进行前缀匹配

GET base-product-spu-info/_search
{
  "query": {
    "match_phrase_prefix": {
      "spuName": "智能手表"
    }
  }
}
// 结果:搜索出数据
QueryBuilders.matchPhrasePrefixQuery("spuName","智能手表")

说明:此处“智能手表”进行分词,其中“智|能|手”与分词进行匹配,“表”可进行前缀匹配,类似“表%”,意味着若分词表中存在“表现、表示、表哥我出来了哦”等分词时,也能命中。

总结

  • token:分词后的单词,小写
  • start_offset:在短语中的开始位置
  • end_offset:短语中的结束位置
  • position:单词在短语中的位置,即第几个单词

总结:比如有一个文档字段“717 Hendrickson Place”,分词结果如上图:

  1. 对关键字“717 Hendrickson Place”使用【term+keyword】搜索
    结果:有结果(关键词不分词,精确匹配)
  2. 对关键字“717 Hendrickson Place01”使用【term+keyword】搜索
    结果:无匹配结果(改动了Place)
  3. 对关键字“717 Hendrickson Place”使用【match+keyword】搜索
    结果:有结果(数据字段不分词,精确匹配)
  4. 对关键字“717 Hendrickson Place01”使用【match+keyword】搜索
    结果:无匹配结果(数据字段不分词,精确匹配)
  5. 对关键字“717 Hendrickson Place”使用【term+text】搜索
    结果:无匹配结果(关键词未分词,字段数据分词,“717 Hendrickson Place”未名中分词)
  6. 对关键字“717 Hendrickson Place”使用【match+text】搜索
    结果:有结果(关键词和字段数据都分词,“717”分词命中)
  7. 对关键字“717 Hendrickson Place01”使用【match+text】搜索
    结果:有结果(这里改动了Place,“717”分词命中)
  8. 对关键字“Hendrickson”使用【term+text】搜索
    结果:无匹配结果(关键词未分词,字段数据分词,分词未命中)
  9. 对关键字“hendrickson”使用【term+text】搜索
    结果:有结果(Hendrickson改为小写 hendrickson)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白也能懂的同城外卖跑腿小程序开发入门指南

当下,开发一款同城外卖跑腿小程序成为许多初学者关注的焦点。本文将为你提供一份小白也能理解的同城外卖跑腿小程序开发入门指南,带你一步步进入这个令人兴奋的领域。 一、了解市场需求与用户痛点 在开始开发同城外卖跑腿小程序之前,首先要深…

JavaScript中的this指向哪?

一、引言 this可以说是前端开发中比较常见的一个关键字,由于其指向是在运行时才确定,所以大家在开发中判断其方向时也会很模糊,今天就把this的指向问题拆开了,揉碎了,好好讲一讲。 先来看一个场景,看看该处…

客户互动智能升级:Amazon Connect 引入生成式AI

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 前言: 在数字化时代,客户服务不仅仅是企…

【ET8框架入门】2.ET框架解析

菜单栏相关:ENABLE_DLL选项 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在开发阶段使用Editor时需要关闭ENABLE_DLL选项。该选项关闭时,修改脚本之后,会直接重新编译所有的代码,Editor在运行时会直接使用最…

如何在nacos中的配置在不同的环境服务下可实现配置共享

其实在微服务启动时,会去nacos读取多个配置文件,例如: [spring.application.name].yaml,例如:nacos-order-service.yaml[spring.application.name]-[spring.profiles.active].yaml,例如:nacos-o…

c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

快速排序介绍: 快速排序是一种非常常用的排序方法,它在1962由C. A. R. Hoare(霍尔)提的一种二叉树结构的交换排序方法,故因此它又被称为霍尔划分,它基于分治的思想,所以整体思路是递归进行的。 …

基于Java+Swing+mysql学生选课成绩信息管理系统

基于JavaSwingmysql学生选课成绩信息管理系统 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统? 四、其它1.其他系统实现 五、源码下载 一、系统介绍 学生教师信息管理、年级班级信息管理、课程信息管理、选课、成绩…

vue3+vite4中使用svg,使用iconfont-svg图标

记录一下vue3中如何使用svg图标&#xff0c;vue2中大家常用iconfont字体图标&#xff0c;现在vue3大家都又推荐svg的方式使用图表&#xff0c;包括elementplus组件库也变成使用svg方式引用图标。 1、创建svg组件 components/IconSvg.vue <template><svg class"…

Imagen 2 发布、Gemini Pro 免费体验、代码平台 Duet AI 上线,谷歌大爆发

在上周发布 Gemini 后&#xff0c;本周谷歌又有了新动作。 12 月 13 日&#xff0c;谷歌在其云平台上推出了一系列 AI 模型以供用户体验并实际应用&#xff1a;向开发者和企业开放 Gemini Pro、面向开发者和安全运营的 Duet AI、图像生成 Imagen 2 以及用于医疗保健场景的 Med…

python安装教程(2020最新),python安装详细教程

这篇文章主要介绍了python安装教程(2020最新)&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1.从python官网下载python的安装包&#xff0c;我用的之前3.7.9的安装包 2.双击打…

成绩分级 C语言xdoj53

问题描述 给出一个百分制的成绩&#xff0c;要求输出成绩等级A,B,C,D,E。90分以上为A&#xff0c;80~89分为B,70~79分为C,60~69分为D&#xff0c;60分以下为E。 输入说明 输入一个正整数m&#xff08;0<m<100&#xff09; 输出说明 输出一个字符 输入样例 …

中兴 H108NS 路由器 tools_admin.asp权限绕过漏洞复现

0x01 产品简介 中兴H108NS路由器是一款集WiFi管理、路由分配、动态获取上网连接等功能于一体的路由器产品。 0x02 漏洞概述 中兴H108NS路由器tools_admin.asp接口处存在身份认证绕过漏洞,攻击者可利用该漏洞绕过身份认证允许访问路由器的管理面板修改管理员密码,获取用户的…

解决msvcr90.dll丢失的方法,3分钟搞定dll丢失问题

众所周知&#xff0c;在电脑操作时&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr90.dll丢失”。这个问题可能会导致某些程序无法正常运行。本文就将提供五种有效方案来化解这一难题&#xff0c;帮助各位网友迅速恢复程序的运行功能。 一、msvcr90.d…

5.鸿蒙hap可以直接点击包安装吗?

5.鸿蒙hap可以直接点击包安装吗&#xff1f; hap与apk不同&#xff0c;获取的hap不能直接安装 安装方法1&#xff1a; DevEco studio打开项目源文件&#xff0c;打开手机USB调试&#xff0c;DevEco识别到手机后&#xff0c;点击播放按钮安装到手机 https://txwtech.blog.cs…

IIS + Axios 跨域设置

1、服务器端设置IIS &#xff08;web.config) 即可&#xff0c;不需要对django settings.py做配置&#xff08;python manage.py runserver 才需要settings.py配置跨域&#xff0c;IIS在iis上配&#xff09; 网站根目录的web.config中加上这段&#xff1a; <httpProtocol&…

kafka学习笔记--Topic 数据的存储机制

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

计算机操作系统-第十六天

目录 线程的实现方式 用户级线程 内核级线程 多线程模型 一对一模型 多对多模型 多对多模型 本节思维导图 线程的实现方式 用户级线程 历史背景&#xff1a;早期操作系统只支持进程&#xff0c;不支持线程&#xff0c;当时的线程是由线程库实现的 本质&#xff1a;从…

【TI毫米波雷达入门-11】毫米波速度相关计算

知识回顾 傅里叶变换 信号用复数表示&#xff0c;A :振幅&#xff0c; Q &#xff1a;相位 中频 信号 中频信号的相位 中频信号的表达公式 频率和相位的表达方式 使用两个Chirp 实现单个目标的测量 两个连续的chirp &#xff0c;检测目标的相位差&#xff0c;通过速度和时间的关…

性能监控体系:InfluxDB Grafana Prometheus

InfluxDB 简介 什么是 InfluxDB &#xff1f; InfluxDB 是一个由 InfluxData 开发的&#xff0c;开源的时序型数据库。它由 Go 语言写成&#xff0c;着力于高性能地查询与存储时序型数据。 InfluxDB 被广泛应用于存储系统的监控数据、IoT 行业的实时数据等场景。 可配合 Te…

Redisson分布式锁原理分析

1.Redisson实现分布式锁 在分布式系统中&#xff0c;涉及到多个实例对同一资源加锁的情况&#xff0c;传统的synchronized、ReentrantLock等单进程加锁的API就不再适用&#xff0c;此时就需要使用分布式锁来保证多服务之间加锁的安全性。 常见的分布式锁的实现方式有&#xff…