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 向量检索

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

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

相关文章

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码&#xff0c;春节新年网…

LeetCode热题100-两数之和【JavaScript讲解】

题目: 根据题目想思路&#xff1a; 使用哈希表进行索引查找。利用nums[j] target - nums[i]获得我们需要的值&#xff0c;在数组中进行查询。查询成功后返回这两个下标&#xff1b;否则当前元素的值和索引存储到哈希表中&#xff0c;以便后续查找。 题解&#xff1a; /*** …

沙箱模拟支付宝支付3--支付的实现

1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…

250103-逻辑运算符

1. 逻辑与运算符 && 2. 逻辑非运算符 &#xff01; 实例 if(!(p1.agep2.age&&p1.name.equals(p2.name)))

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

探索 AIGC 的基础知识:人工智能生成内容的全景视图

在数字化时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以前所未有的速度改变着我们的创作方式。本文将深入探讨 AIGC 的定义、构成要素、应用场景以及其带来的优势&#xff0c;帮助读者全面理解这一前沿技术。 1. AIGC 的定义与范围 人工智能生成内容&…

【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)

背景需求&#xff1a; 2023区级大课题《运用Python优化3-6岁幼儿学习活动材料的实践研究》需要做阶段资料 本来应该2024年6月就提交电子稿和打印稿。可是python学具的教学实验实在太多了&#xff0c;不断生成&#xff0c;我忙着做教学&#xff0c;都没有精力去整理。 2025年…

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin

Android布局layout的draw简洁clipPath实现圆角矩形布局&#xff0c;Kotlin 通常&#xff0c;如果要把一个相对布局&#xff0c;FrameLayout&#xff0c;或者线性布局等这样的布局变成具有圆角或者圆形的布局&#xff0c;需要增加一个style&#xff0c;给它设置圆角&#xff0c;…

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…

深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程​编辑 UI线程的责任&#xff1a; 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程 UI线程的责任&#xff1a; 迅速处理UI事…

基于PHP的智能健康管理系统设计与实现

基于PHP的智能健康管理系统设计与实现 一、引言 随着人们生活水平的提高和健康意识的增强&#xff0c;健康管理逐渐成为人们关注的焦点。传统的健康管理方式已经无法满足人们对个性化、智能化健康管理的需求。因此&#xff0c;基于PHP的智能健康管理系统应运而生。本文将介绍基…

[微服务]分布式搜索Java客户端

快速入门 使用RestClient客户端进行数据搜索可以分为两步 构建并发起请求 代码解读&#xff1a; 第一步&#xff0c;创建SearchRequest对象&#xff0c;指定索引库名第二步&#xff0c;利用request.source()构建DSL&#xff0c;DSL中可以包含查询、分页、排序、高亮等 query…

LeetCode430周赛T3

题目描述 给定一个只包含正整数的数组 nums&#xff0c;我们需要找到其中的特殊子序列。特殊子序列是一个长度为4的子序列&#xff0c;用下标 (p, q, r, s) 表示&#xff0c;它们满足以下条件&#xff1a; 索引顺序&#xff1a;p < q < r < s&#xff0c;且相邻坐标…

网页的语义结构

1.含义 HTML 标签的一个重要作用&#xff0c;就是声明网页元素的性质&#xff0c;使得用户只看标签&#xff0c;就能了解这个元素的意义&#xff0c;阅读 HTML 源码就能了解网页的大致结构。这被称为 HTML 的语义原则。 下面就是一个典型的语义结构的网页。 <body><…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

学技术学英文:Tomcat的线程模型调优

导读&#xff1a; tomcat 线程调优关键需要理解下面这几个参数&#xff1a; 1. maxConnections 描述&#xff1a;指定服务器能够同时接受和处理的最大连接数。也就是说&#xff0c;服务器在任何时候都能处理的最大并发连接数。作用&#xff1a;限制服务器在任何给定时间点能…

【微信小程序获取用户手机号

微信小程序获取用户手机号有2种,一种是前端自己解密,一种是获取后发给后端,后端去解密 重点:要在微信公众平台设置里面绑定微信开放平台账号,不然反解不出来用户手机号上代码: <button style"font-size: 16px;" open-type"getPhoneNumber" getphonenumb…

单片机-静动态数码管实验

P0控制数码管 &#xff0c;P0低电平 P1,P2,P3高电平 1、静态数码管 需求&#xff1a;数码管显示0&#xff0c;即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …

创龙3588——debian根文件系统制作

文章目录 build.sh debian 执行流程build.sh源码流程 30-rootfs.sh源码流程 mk-rootfs-bullseys.sh源码流程 mk-sysroot.sh源码流程 mk-image.sh源码流程 post-build.sh 大致流程系统制作步骤 build.sh debian 执行流程 build.sh 源码 run_hooks() {DIR"$1"shiftf…

管理者管理上班摸鱼

管理者管理上班摸鱼的问题,实际上涉及到员工工作态度、时间管理、团队文化等方面。以下是一些有效的管理策略: 明确期望与目标 确保每个员工了解他们的工作职责、目标以及衡量工作表现的标准。明确的期望有助于避免模糊空间,让员工知道自己的任务和责任,不容易找到摸鱼的借…