Elasticsearch: 高级搜索
这里写目录标题
- 一、match_all匹配所有文档
- 1、介绍:
- 二、精确匹配
- 1、term单字段精确匹配查询
- 2、terms多字段精确匹配
- 3、range范围查询
- 4、exists是否存在查询
- 5、ids根据一组id查询
- 6、prefix前缀匹配
- 7、wildcard通配符匹配
- 8、fuzzy支持编辑距离的模糊查询
- 9、regexp正则匹配查询
- 10、term set用于解决多字段中的文档匹配问题
- 三、全文检索
- 1、match分词查询
- 2、mutil_match多字段查询
- 3、match_phrase短语查询
- 4、query_string支持与或非表达式的查询
- 5、simple_query_string
- 四、bool query布尔查询
- 五、highlight高亮显示
- 六、地理空间位置查询
- 七、ElasticSearch8.x 向量检索
一、match_all匹配所有文档
1、介绍:
match_all查询是一个特殊的查询类型,它用于匹配索引中的所有文档,而不考虑任何特定的查询条件。
- 基本语法:
GET /<your-index-name>/_search
{"query": {"match_all": {}}
}
- 高级用法
可以再match_all查询中添加额外的参数来控制搜索结果的显示,例如设置返回的文档数量(size)、开始返回的文档位置(from)、排序规则(sort)以及选择返回哪些字段(source)。
例如,如果返回索引中的前10个文档,并且按照文档的评分进行排序,可以使用以下查询。
实现分页效果:
GET /<your-index-name>/_search
{"query": {"match_all": {}},"from": 0,"size": 3
}
实现排序:
GET /<your-index-name>/_search
{"query": {"match_all": {}},"size": 10,"sort":[{"_source": {"order":"desc"}}]
}
_source的用法:
不查看源数据,仅查看元字段:
GET /<your-index-name>/_search
{"query": {"match_all": {}},"_source": false
}
返回指定的字段:
GET /<your-index-name>/_search
{"query": {"match_all": {}},"_source": ["field1","field2"]
}
二、精确匹配
精确匹配指的是搜索内容不经过文本分析直接用于文本匹配,这个过程类似于数据库的SQL查询,搜索的对象大多是索引的非text类型字段。此类检索主要应用于结构化数据,如ID、状态和标签等。
1、term单字段精确匹配查询
对bool,日期,数字,结构化的文本可以利用term做精确匹配,查询姓名为张三的员工信息:
GET /<your-index-name>/_search
{"query": {"term": {"name": {"value": "张三"}}}
}
注意:最好不要再term查询的字段中使用text字段,因为text字段会被分词,这样做既没有意义,还很有可能什么也查不到。
在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。
可以通过Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提高性能:
- 将Query转成Filter,忽略TF-IDF计算,避免相关性算分的开销
GET /<your-index-name>/_search
{"query": {"constant_score": {"filter": {"term": {"address.keyword":"value"}}}}
}
2、terms多字段精确匹配
主要应用与多值精确匹配场景,它允许用户在单个查询中指定多个词条进行精确匹配。这种查询方式适合从文档中查找包含多个特定值的字段,例如筛选出具有多个特定标签或状态的项目。而terms检索是针对未分析的字段及逆行精确匹配的,因此他在处理关键词、数字、日期等结构化数据时表现良好。
GET /<your-index-name>/_search
{"query": {"terms": {"<filed_name>": ["value1","value2","value3"]}}
}
3、range范围查询
range检索时Elasticsearch中一种针对指定字段值在给定范围内的文档的检索类型。这种查询适合对数字、日期或者其他可排序数据类型的字段进行范围赛选。range检索支持多种比较操作符,如大于(gt)、大于等于(gte)、小于(lt)和小于等于(lte)等,可以实现灵活的区间查询。
GET /<your-index-name>/_search
{"query": {"range": {"<filed_name>": ["gte":"<lower_bound>","lte":"<upper_bound>","gt":"<greater_than_bound>","lt":"less_than_bound"]}}
}
4、exists是否存在查询
exists检索在Elasticsearch中用于筛选具有特定字段值的文档。这种查询类型适用于检查文档中是否存在某个字段,或者该字段是否包含非空值。通过使用exists检索,你可以有效地过滤掉缺少关键信息的文档,从而专注于包含所需数据的结果。应用场景包括但不限于数据完整性检查、查询特定属性的文档以及对可选字段进行筛选等。
GET /<your-index-name>/_search
{"query": {"exists": {"field": "<field_name>"}}
}
5、ids根据一组id查询
可以基于ID组快速召回相关数据,从而实现高效的文档检索。
GET /<your-index-name>/_search
{"query": {"inds": {"values": ["id1","id2","id3",...]}}
}
6、prefix前缀匹配
prefix会对分词后的term进行前缀搜索:
- 它不会对要搜索的字符串分词,传入的前缀就是想要查找的前缀。
- 默认状态下,前缀查询不做相关性分数计算,它只是将所有匹配的文档返回,然后赋予所有相关分数值为1。
prefix的原理:
需要遍历所有倒排索引,并比较每个词项是否以所搜索的前缀开头。
GET /<your-index-name>/_search
{"query": {"prefix": {"your_field_name":{"value":"your_prefix_string"} }}
}
需要注意的是,这种查询方式仅适用于关键字类型(keyword)的字段。
7、wildcard通配符匹配
wildcard检索是Elasticsearch中一种支持通配符匹配的查询类型,它允许在检索时使用通配符表达式来匹配文档的字段值。通配符包括两种:
- 星号(*):表示零或多个字符,可用于匹配任意长度的字符串。
- 问号(?):表示一个字符,用于匹配任意单个字符。
wildcard检索适用于对部分已知内容的文本字段进行模糊检索。例如,在文件名或产品型号等具有一定规律的字段中,使用通配符检索可以方便地找到满足特定模式的文档。
需要注意的是,通配符查询可能会导致较高的计算负担,因此在实际应用中应该谨慎使用,尤其是在涉及大量文档的情况下。
GET /<your-index-name>/_search
{"query": {"wildcard": {"your_field_name":{"value":"your_prefix_string"} }}
}
8、fuzzy支持编辑距离的模糊查询
是一种强大的搜索功能,它能够在用户输入内容存在拼写错误或上下文不一致时,仍然返回与搜索词相似的文档。通过使用编辑距离算法来度量输入词与文档中词条的相似度,模糊查询在保证搜索结果相关性的同时,有效地提高了搜索容错能力。
编辑距离是指从一个单词转换到另一个单词需要编辑单字符的次数。如中文集团到中威集团编辑距离就是1,只需要修改一个字符;如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也查出来。
GET /<your-index-name>/_search
{"query": {"fuzzy": {"your_field":{"value":"search_term","fuzziness":"AUTO","prefix_length":1} }}
}
- fuzziness参数用于编辑距离的设置,其默认值为AUTO,支持的数值为[0,1,2]。如果值设置越界会报错。
- prefix_length: 搜索词的前缀长度,在此长度内不会应用模糊匹配。默认是0,即整个词都会被模糊匹配。
9、regexp正则匹配查询
10、term set用于解决多字段中的文档匹配问题
terms set检索是Elasticsearch中一种功能强大的检索类型,主要用于解决多值字段中的文档匹配问题,在处理具有多个属性、分类或标签的复杂数据时非常有用。
从应用场景来说,terms set检索在处理多值字段和特定匹配条件时具有很大的优势。它适用于标签系统、搜索引擎、电子商务系统、文档管理系统和技能匹配等场景。
GET /<your-index-name>/_search
{"query": {"terms_set": {"<field_name>":{"terms":["<term1>","<term2>",...],"minimum_should_match_field":"<minimum_should_match_field_name>" or"minimum_should_match_script":{"source":"<script>"}} }}
}
- <field_name>: 指定要查询的字段名,这个字段通常是一个多值字段。
- terms:提供一组词项,用于在指定字段中进行匹配。
- minimum_should_match_field: 指定一个包含匹配数量的字段名,其值应用作要匹配的最少术语数,以便返回文档。
- minimum_should_match_script: 提供一个自定义脚本,用于动态计算匹配数量。如果需要动态设置匹配所需的术语数,这个参数将非常有用。
三、全文检索
全文检索查询旨在基于相关性搜索和匹配文本数据。这些查询会对输入的文本进行分析,将其拆分为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。此类检索主要应用于非结构化文本数据,如文章和评论等。
1、match分词查询
match是一种全文检索查询,它使用分析器将查询字符串分解成单独的词条,并在倒排索引中搜索这些词条。match查询适用于文本字段,并且可以通过多种参数来调整搜索行为。
对于match查询,其底层逻辑的概述:
- 分词:首先,输入的查询文本会被分词器进行分词。分词器会将文本拆分成一个个词项(terms),如单词、短语或特定字符。分词器通常根据特定的语言规则和配置进行操作。
- 匹配计算:一旦查询被分词,ES将根据查询类型和参数计算文档与查询的匹配度。对于match查询,ES将比较查询的词项与倒排索引中的词项,并计算文档的相关性得分。相关性得分衡量了文档与查询的匹配程度。
- 结果返回:根据相关性得分,ES将返回最匹配的文档作为搜索结果。搜索结果通常按照相关性得分进行排序,以便最相关的文档排在前面。
GET /<your-index-name>/_search
{"query": {"match": {"field_name":"value"}}
}
2、mutil_match多字段查询
multi_match查询在Elasticsearch中用于在多个字段上执行相同的搜索操作。它可以接受一个查询字符串,并在指定的字段集合中搜索这个字符串。multi_match查询提供了灵活的匹配类型和操作符选项,以便根据不同的搜索需求调整搜索行为。
GET /<your-index-name>/_search
{"query": {"multi_match": {"query":"<query_string>","fields":["<field1>","<field2>",...]}}
}
3、match_phrase短语查询
用于执行短语搜索,它不仅仅匹配整个短语,而且还考虑了短语中各个词的顺序和位置。这种查询类型对于搜索精确短语非常有用,尤其是在用户输入的查询与文档中的文本表达方式需要严格匹配时。
GET /<your-index-name>/_search
{"query": {"match_parse": {"<field_name>": {"query":"<phrase>"}}}
}
4、query_string支持与或非表达式的查询
是一种灵活的查询类型,它允许使用Lucene查询语法来构建复杂的搜索查询。这种查询类型支持多种逻辑运算符,包括与(AND)、或(OR)和非(NOT),以及通配符、模糊搜索和正则表达式等功能。query_string查询可以在单个或多个字段上进行搜索,并且可以处理复杂的查询逻辑。
应用场景包括高级搜索、数据分析和报表等,适合处理满足特定需求、要求支持与或非表达式的复杂查询任务,通常用于专业领域或需要高级查询功能的应用中。
GET /<your-index-name>/_search
{"query": {"query_string": {"query":"<query_string>","default_field":"<field_name>"}}
}
- <your_query_string>是查询逻辑,可以包含上述提到的逻辑运算符和通配符等。
- <field_name>是默认搜索字段,如果省略则会搜索所有可索引字段。
5、simple_query_string
类似Query String,但是会忽略错误的语法,同时支持部分查询语法,不支持AND OR NOT,会当作字符串处理。支持部分逻辑:
- +替代AND
- |替代OR
- -替代NOT
在生产环境中推荐使用simple_query_string而不是query_string,主要是因为simple_query_string提供了宽松的语法,能够容忍一定程度的输入错误,而不会导致整个查询失败。
GET /<your-index-name>/_search
{"query": {"simple_query_string": {"query":"<query_string>","fields":["<field1>","<field2>",...],"default_operator":"OR" 或 "AND"}}
}
其中<query_string>是要搜索的查询表达式,,,…是搜索可以在其中进行的字段列表,default_operator定义了查询字符串中未指定操作符时的默认逻辑运算符,可以使OR或AND。
四、bool query布尔查询
布尔查询可以按照布尔逻辑条件组织多条查询语句,只有符合整个布尔条件的文档才会被搜索出来。
在布尔条件中,可以包含两种不同的上下文:
- 搜索上下文(query context):使用搜索上下文时,Elasticsearch需要计算每个文档与搜索条件的相关度得分,这个得分的计算需要使用一套复杂的计算公式,有一定的性能开销,带文本分析的全文检索的查询语句很适合放在搜索上下文中。
- 过滤上下文(filter context):使用过滤上下文时,Elasticsearch只需要判断搜索条件跟文档数据是否匹配,例如使用term query判断一个值是否跟搜索内容一致,使用Range query判断某数据是否位于某个区间等。过滤上下文的查询不需要进行相关度得分计算,还可以使用缓存加快响应速度,很多术语级查询语句都适合放在过滤上下文中。
布尔查询一种支持4中组合类型:
五、highlight高亮显示
六、地理空间位置查询
七、ElasticSearch8.x 向量检索
相关文章:

Elasticsearch: 高级搜索
这里写目录标题 一、match_all匹配所有文档1、介绍: 二、精确匹配1、term单字段精确匹配查询2、terms多字段精确匹配3、range范围查询4、exists是否存在查询5、ids根据一组id查询6、prefix前缀匹配7、wildcard通配符匹配8、fuzzy支持编辑距离的模糊查询9、regexp正则…...

STM32 拓展 电源控制
目录 电源控制 电源框图 VDDA供电区域 VDD供电区域 1.8V低电压区域 后备供电区域 电压调节器 上电复位和掉电复位 可编程电压检测器(PVD) 低功耗 睡眠模式(只有CUP(老板)睡眠) 进入睡眠模式 退出睡眠模式 停机(停止)模式(只留核心区域(上班)) 进入停…...

SpringBootWeb案例-1
文章目录 SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理2.1 查询部门2.1.1 原型和需求2.1.2 接口文档2.1.3 思路分析2.1.4 功能开发2.1.5 功能测试 2.2 前后端联调2.3 删除部门2.3.1 需求2.3.2 接口文档2.3.3 思路…...

HTML——57. type和name属性
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>type和name属性</title></head><body><!--1.input元素是最常用的表单控件--><!--2.input元素不仅可以在form标签内使用也可以在form标签外使用-…...

应用架构模式-总体思路
采用引导式设计方法:以企业级架构为指导,形成较为齐全的规范指引。在实践中总结重要设计形成决策要点,一个决策要点对应一个设计模式。自底向上总结采用该设计模式的必备条件,将之转化通过简单需求分析就能得到的业务特点…...

vue 虚拟滚动 vue-virtual-scroller RecycleScroller
vue 3 https://github.com/Akryum/vue-virtual-scroller/blob/master/packages/vue-virtual-scroller/README.md vue 2 https://github.com/Akryum/vue-virtual-scroller/tree/v1/packages/vue-virtual-scroller npm install --save vue-virtual-scrollernextmain.js // 虚拟滚…...

DC-DC 降压转换器设计提示和技巧
基本 DC-DC 降压转换器电路 在开始之前,我们先回顾一下DC-DC降压转换器的电路: 为了帮助您,我开发了降压设计中“什么影响什么”的矩阵: 主要的权衡是电感(与 k 因子成反比,即峰峰值与平均电感电流之比&a…...

多模态论文笔记——Coca
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍多模态模型Coca,在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa论文模型结构CoCa…...

@Cacheable 注解爆红(不兼容的类型。实际为 java. lang. String‘,需要 ‘boolean‘)
文章目录 1、org.springframework.cache.annotation.Cacheable2、javax.persistence.Cacheable Cacheable(value "findPAUserById", key "#id")public Optional<PAUser> findById(Integer id) {return paUserRepository.findById(id);}我真的要笑死…...

java相互加密解密
java代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64;public class AesUtils {public static String encrypt(String plaintext, String key, String iv) throws Exception {C…...

PostgreSQL中FIRST_VALUE、LAST_VALUE、LAG 和 LEAD是窗口函数,允许返回在数据集的特定窗口(或分区)内访问行的相对位置
在PostgreSQL中,FIRST_VALUE、LAST_VALUE、LAG 和 LEAD 是窗口函数(window functions),它们允许你在数据集的特定窗口(或分区)内访问行的相对位置。以下是对这些函数的详细解释和用法: 1. FIRS…...

树莓派之旅-第一天 系统的烧录和设置
自言自语: 在此记录一下树莓派的玩法。以后有钱了买点来玩啊草 系统的安装烧录 系统下载 树莓派官网:https://www.raspberrypi.com/ 首页点击SoftWare进入OS下载页面 这里是安装工具:安装工具负责将系统镜像安装到sd卡中 点击下载符合自己…...

数据库工程师进阶秘籍:云计算基础知识题目精选与答案(附PDF)
【单选题】1、将基础设施作为服务的云计算服务类型是()。 A. IaaS B. PaaS C. SaaS D. 以上都不是 正确答案:A 答案解析:本题考查云计算的服务类型。基础设施即服务IaaS(Infrastructure as a Service)&…...

【HAProxy】如何在Ubuntu下配置HAProxy服务器
HAProxy 是一款免费、开源且强大的反向代理程序,它为 HTTP 和 TCP 基础的应用提供了高可用性、负载均衡以及代理功能,因此对于管理高流量服务器(或 Web 应用)来说,通过将负载分散到多个节点服务器上,它是一…...

C#编写的盘符图标修改器 - 开源研究系列文章
这天在网上遇到一个Windows的盘符图标修改软件,但是它那个是.net framework 2.0的,所以就将其改成4.8.1的了,用于Windows 11等默认不安装2.0库的操作系统里使用。 1、 项目目录; 2、 源码介绍; 它直接进行注册表的修改…...

(四)配置有线网口、SSH登陆、文件传输以及运行交叉编译程序测试
文章目录 配置有线网口原因自动分配不行第一步 设置前先停止网络接口第二步 手动分配ip第三步 使配置的网口ip永久生效第四步 测试一下网络是否通了 SSH登陆文件传输以及运行交叉编译程序测试第一种借助基于SSH的命令行工具SCP传输文件第二种借助基于MobaXterm 软件直接上传测试…...

离线的方式:往Maven的本地仓库里安装依赖
jar文件及源码的绝对路径,gav坐标,打包方式,Maven本地仓库的路径 mvn install:install-file ^-DfileD:\hello-spring-boot-starter-1.0-SNAPSHOT.jar ^-DsourcesD:\hello-spring-boot-starter-1.0-SNAPSHOT-sources.jar ^-DgroupIdcom.examp…...

《深入浅出HTTPS》读书笔记(22):密钥协商算法
《深入浅出HTTPS》读书笔记(22):密钥协商算法 密钥的管理和分配是个难题,尤其是生成一个动态密钥更难,而密钥协商算法就可以解决密钥分配、存储、传输等问题。 在网络通信中,为了加密…...

kubernetes学习-Service
kubernetes学习-Service 1. Service说明2. 功能3.Service类型3.1 NodePort3.1.1 创建web-service.yaml3.1.2 创建web-pod.yaml3.1.3 部署3.1.4 验证 3.2 ClusterIP3.2.1 创建web-clusterIp-service.yaml3.2.2 创建web-clusterIp-pod.yaml3.2.3 部署3.2.4 验证 3.3 LoadBalancer…...

Springcloud项目-前后端联调(一)
项目采用SpringCloud整体构建,nacos作为注册中心,Mysql和Redis进行数据存储,整体项目类似于平时使用的出行APP,idea2023编写后端,vscode编写前端 后端代码先前已经编写完毕 这部分功能主要是通过前端输入出发地和目的地之后调用…...

洛谷P1525 [NOIP2010 提高组] 关押罪犯(种子并查集基础)
题目链接:P1525 [NOIP2010 提高组] 关押罪犯 - 洛谷 | 计算机科学教育新生态 题目难度:普及+/提高 题目描述: S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1∼N,有m对罪犯,每对之间有仇恨值,问如何分配罪犯使得现 Z 市长要看到其中最大的矛盾值最小。 输入格…...

【算法刷题指南】模拟
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系…...

学习笔记078——Java Properties类使用详解
文章目录 概述常见方法写入读取遍历 概述 Properties 继承于 Hashtable。表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串。 Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getPropertie…...

若依使用 Undertow 替代 Tomcat 容器
文章目录 需求提出应用场景解决思路注意事项完整代码第一步:在 ruoyi-framework/pom.xml 文件中进行依赖配置第二步:修改 application.yml 配置文件第三步:修改文件上传工具类 FileUploadUtils.java 运行结果 需求提出 在开发若依框架的前后…...

多输入多输出 | Matlab实现WOA-CNN鲸鱼算法优化卷积神经网络多输入多输出预测
多输入多输出 | Matlab实现WOA-CNN鲸鱼算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现WOA-CNN鲸鱼算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 Matlab实现WOA-CNN鲸鱼算法优化卷积神经网络多输入…...

Elasticsearch:基础概念
一、什么是Elasticsearch Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是…...

Spring MVC的@ResponseBody与@RequestBody
ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。 RequestBody注解用于读取http请求的内容(字符串),通过springmv…...

智能商业分析 Quick BI
Quick BI 是阿里云提供的一款智能商业分析(BI)工具,旨在帮助企业快速获取业务洞察、优化决策过程、提升数据分析效率。通过强大的数据可视化和分析功能,Quick BI 能够帮助用户轻松连接多种数据源、创建多维度的报表和仪表盘&#…...

LUA基础语法
目录 变量篇 算数运算符 条件分支语句与循环语句 函数 表 Table 全局变量与本地变量 协程 元表 面向对象(封装,继承,多态) 常用自带库 垃圾回收 变量篇 print("hello") print("lua") --注释 --[[…...

SpringBoot的pom.xml文件中,scope标签有几种配置?
1.compile(默认) 含义:表示该依赖在项目的所有阶段(编译、测试、运行)都需要。 当你依赖一个库,并且这个库是你项目的核心部分,比如 Spring Boot 的spring - boot - starter - web,…...