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)

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

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

相关文章

python读取excel数据 附实战代码

在Python中,可以使用pandas库来读取Excel文件中的数据。下面是一个简单的例子: import pandas as pd# 读取Excel文件 df pd.read_excel(example.xlsx)# 显示前5行数据 print(df.head())在上面的代码中,我们首先导入了pandas库,并…

Java 第12章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常: 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常,可以在检测到命…

C语言学习day09:运算符优先级

运算符优先级: //& 假如设一个int a; 给a一个变量; &a取a对应的地址 优先级运算符名称或含义使用形式结合方向说明1[1,2,3,4]数组下标数组名[常量表达形式]左到右()圆括号(表达式)/函数名(形参).成员选择(对象)对象.成员名->成员选择(指…

GO的sql注入盲注脚本

之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …

C语言数据结构-----二叉树(3)二叉树相关练习题

前言 前面详细讲述了二叉树的相关知识,为了巩固,做一些相关的练习题 文章目录 前言1.某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为?2.下列数据结构中,不适合采用顺序存…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《市场环境下考虑全周期经济效益的工业园区共享储能优化配置》

这个标题涉及到工业园区中共享储能系统的优化配置,考虑了市场环境和全周期经济效益。以下是对标题中各个要素的解读: 市场环境下: 指的是工业园区所处的商业和经济背景。这可能包括市场竞争状况、电力市场价格波动、政策法规等因素。在这一环…

WordCloud—— 词云

【说明】文章内容来自《机器学习入门——基于sklearn》,用于学习记录。若有争议联系删除。 wordcloud 是python的第三方库,称为词云,也成文字云,可以根据文本中的词频以直观和艺术化的形式展示文本中词语的重要性。 依赖于pillow …

kotlin 基础概览

继承类/实现接口 继承类和实现接口都是用的 : ,如果类中没有构造器 ( constructor ),需要在父类类名后面加上 () : class MainActivity : BaseActivity(), View.OnClickListener 空安全设计 Kotlin 中的类型分为「可空类型」和「不可空类型」…

浏览器js中添加日志断点

一、需求 本地调试时,可以直接代码里使用console.log直接调试; 代码已更新到服务器,不想要提交代码,如何通过添加console.log调试呢 二、实现 使用浏览器添加日志断点的方式,当然vue这种打包的不可行哦 设置完成后…

【算法】bfs与dfs算法解决FloodFill(洪流)问题(C++)

文章目录 1. 什么是FloodFill问题2. 用什么方法解决FloodFill问题3. 具体例题773.图像渲染200.岛屿数量695.岛屿的最大面积130.被围绕的区域 1. 什么是FloodFill问题 一般floodfill问题可以描述为:给定一个二维矩阵,其中每个元素代表一个像素点&#xf…

setXxx getXxx 封装

1.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 2.封装的理解和好处 (1)隐藏实现细节 方法(连接数据库)<-----调用(传入参数...) 只负责调…

寻找最大整数 C语言xdoj51

问题描述 从键盘输入四个整数&#xff0c;找出其中的最大值并将其输出。 输入说明 输入4个整数&#xff0c;用空格分隔 输出说明 输出值最大的一个整数 输入样例 25 99 -46 0 输出样例 99 #include <stdio.h>//寻找最大整数 int main() {int i, a[4]…

【Gradle】运行时一直要下载 gradle-8.5-bin.zip

如何解决 Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip 的问题 文章目录 1. 问题描述2. 解决方法1&#xff09;找到 gradle-wrapper.properties2&#xff09;修改 distributionUrl 对应的值 3. 验证 1. 问题描述 在执行 gradlew 命令的时候&…

【数据结构】(堆)Top-k|堆排序

目录 概念&#xff1a; 堆的实现 构建 初始化 销毁 插入元素 往上调整 删除堆顶元素 往下调整 返回堆顶元素 返回有效个数 是否为空 堆排序 Top-k问题 ​编辑 创建数据 堆top-k 概念&#xff1a; 堆是将数据按照完全二叉树存储方式存储到一维数组中&#xff…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

从文字下乡到人人学英语

从建国到改革开放&#xff0c;从恢复高考到新式教育改革&#xff0c;中国飞速发展&#xff0c;文字需求也在不断增大&#xff0c;在“地球村”的时代下&#xff0c;我们要“习文字之变&#xff0c;顺时代发展。” 古言道&#xff1a;“仓颉作书&#xff0c;后稷作稼”&#xff…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

设计模式——命令模式

引言 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能实现可撤销操作。 问题 假如你正在开发一款新的文字编辑器&#xff0c; …

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

Linux---远程登录、远程拷贝命令

1. 远程登录、远程拷贝命令的介绍 命令说明ssh远程登录scp远程拷贝 2. ssh命令的使用 ssh是专门为远程登录提供的一个安全性协议&#xff0c;常用于远程登录&#xff0c;想要使用ssh服务&#xff0c;需要安装相应的服务端和客户端软件&#xff0c;当软件安装成功以后就可以使…