【Elasticsearch】match查询
Elasticsearch 的`match`查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是`match`查询的详细解析,包括其工作原理、参数配置和使用场景。
1.`match`查询的基本概念
`match`查询是 Elasticsearch 中用于执行全文搜索的标准查询方式。它通过分析器(Analyzer)对查询文本进行处理,然后在指定字段中搜索匹配的文档。`match`查询的主要特点是它能够处理复杂的文本数据,并提供灵活的搜索选项。
2.`match`查询的工作原理
`match`查询的工作过程可以分为以下几个步骤:
2.1 文本分析
查询文本首先会被分析器处理,分析器会将查询文本分解为一系列的词元(Tokens)。分析器通常包括以下几个部分:
• 分词器(Tokenizer):将文本分解为词元。
• 过滤器(Token Filters):对词元进行进一步处理,如小写化、停用词过滤、词干提取等。
• 字符过滤器(Character Filters):对原始文本进行预处理,如删除HTML标签、替换特殊字符等。
2.2 构建布尔查询
分析器处理后的词元会被用来构建一个布尔查询(`boolean query`)。布尔查询是`match`查询的核心,它通过布尔逻辑(`AND`或`OR`)来组合多个词元的匹配条件。
• `operator`参数:
• `OR`(默认值):文档中包含查询词中的任意一个词元即可匹配。
• `AND`:文档中必须包含查询词中的所有词元才能匹配。
2.3 模糊匹配(可选)
如果启用了模糊匹配(通过`fuzziness`参数),Elasticsearch 会为每个词元生成模糊变体,并尝试匹配这些变体。模糊匹配允许一定程度的拼写错误或相似性匹配。
2.4 同义词扩展(可选)
如果字段定义中使用了同义词过滤器(如`synonym_graph`),`match`查询会将查询词扩展为同义词,并尝试匹配这些同义词。
2.5 查询执行
构建好的布尔查询会被执行,Elasticsearch 会搜索索引中的文档,找出匹配的文档。每个文档的相关性分数(`_score`)会根据匹配的词元数量、词频、倒排索引等因素计算得出。
2.6 结果返回
最终,Elasticsearch 会返回匹配的文档列表,以及每个文档的相关性分数。用户可以通过其他参数(如`from`和`size`)来分页显示结果。
3.`match`查询的参数
`match`查询支持多种参数,这些参数可以用来控制查询的行为和结果。以下是一些常用的参数:
3.1`query`(必需)
查询文本,可以是文本、数字、日期或布尔值。
3.2`analyzer`(可选)
用于分析查询文本的分析器。默认情况下,Elasticsearch 使用字段在索引时定义的分析器。如果没有定义分析器,则使用索引的默认分析器。
3.3`operator`(可选)
布尔逻辑,用于组合查询词元:
• `OR`(默认值):文档中包含查询词中的任意一个词元即可匹配。
• `AND`:文档中必须包含查询词中的所有词元才能匹配。
3.4`fuzziness`(可选)
允许的模糊匹配程度,可以是以下值之一:
• `0`:不启用模糊匹配。
• `1`或`2`:允许的编辑距离。
• `AUTO`:自动根据词元长度选择合适的编辑距离。
3.5`prefix_length`(可选)
模糊匹配中不变的前缀字符数量。默认值为`0`。
3.6`max_expansions`(可选)
模糊匹配中生成的最大词元数量。默认值为`50`。
3.7`fuzzy_transpositions`(可选)
是否允许字符置换(如`ab`→`ba`)。默认值为`true`。
3.8`boost`(可选)
用于调整文档相关性分数的提升值。默认值为`1.0`。值越小,相关性分数越低;值越大,相关性分数越高。
3.9`minimum_should_match`(可选)
必须匹配的子句的最小数量。可以是整数(如`3`)或百分比(如`75%`)。
3.10`zero_terms_query`(可选)
如果分析器移除了所有查询词元(如停用词过滤器),是否返回所有文档:
• `none`(默认值):不返回任何文档。
• `all`:返回所有文档,类似于`match_all`查询。
3.11`auto_generate_synonyms_phrase_query`(可选)
是否为多词同义词生成短语查询:
• `true`(默认值):生成短语查询。
• `false`:将多词同义词拆分为独立的词元进行匹配。
4.`match`查询的示例
4.1 基本用法
```json
GET /_search
{
"query": {
"match": {
"message": "this is a test"
}
}
}
```
• 查询字段`message`中包含`"this is a test"`的文档。
4.2 使用`operator`参数
```json
GET /_search
{
"query": {
"match": {
"message": {
"query": "capital of Hungary",
"operator": "AND"
}
}
}
}
```
• 查询字段`message`中同时包含`"capital"`和`"Hungary"`的文档。
4.3 使用`fuzziness`参数
```json
GET /_search
{
"query": {
"match": {
"message": {
"query": "tezt",
"fuzziness": "AUTO"
}
}
}
}
```
• 查询字段`message`中包含与`"tezt"`模糊匹配的文档。
4.4 使用`zero_terms_query`参数
```json
GET /_search
{
"query": {
"match": {
"message": {
"query": "to be or not to be",
"zero_terms_query": "all"
}
}
}
}
```
• 如果分析器移除了所有查询词元,则返回所有文档。
4.5 使用`minimum_should_match`参数
```json
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a test",
"minimum_should_match": "75%"
}
}
}
}
```
• 查询字段`message`中至少匹配查询词元的 75%的文档。
5.`match`查询的高级用法
5.1 多字段搜索
可以通过`multi_match`查询在多个字段中搜索相同的文本:
```json
GET /_search
{
"query": {
"multi_match": {
"query": "this is a test",
"fields": ["message", "description"]
}
}
}
```
• 查询字段`message`和`description`中包含`"this is a test"`的文档。
5.2 同义词扩展
使用`synonym_graph`过滤器时,`match`查询会自动扩展同义词:
```json
GET /_search
{
"query": {
"match": {
"message": {
"query": "NY",
"auto_generate_synonyms_phrase_query": true
}
}
}
}
```
• 查询字段`message`中包含`"NY"`或`"New York"`的文档。
6.`match`查询的优化建议
6.1 合理选择分析器
• 根据字段的内容和搜索需求选择合适的分析器。
• 例如,对于英文文本,可以使用`standard`分析器;对于中文文本,可以使用`ik_max_word`分析器。
6.2 控制模糊匹配
• 模糊匹配会增加查询的复杂度和性能开销,建议谨慎使用。
• 可以通过`fuzziness`、`prefix_length`和`max_expansions`参数来控制模糊匹配的范围。
6.3 使用`minimum_should_match`
• 通过`minimum_should_match`参数可以提高查询的精确度,减少无关结果的返回。
6.4 分页和性能优化
• 使用`from`和`size`参数进行分页,避免一次性返回大量结果。
• 对于大数据量的查询,可以使用`filter`
6.5 使用`filter`来提高性能
在查询中使用`filter`来缩小搜索范围,可以显著提高查询性能。`filter`通常用于过滤出满足特定条件的文档,而这些条件不需要计算相关性分数(`_score`)。例如:
```json
GET /_search
{
"query": {
"bool": {
"must": {
"match": {
"message": "this is a test"
}
},
"filter": {
"range": {
"timestamp": {
"gte": "2025-01-01",
"lte": "2025-01-31"
}
}
}
}
}
}
```
• 这个查询会先过滤出`timestamp`在 2025 年 1 月的文档,然后再在这些文档中搜索包含`"this is a test"`的文档。
6.6 使用`boosting`来调整结果
`boosting`查询可以用来降低某些文档的相关性分数,而不是完全排除它们。例如:
```json
GET /_search
{
"query": {
"boosting": {
"positive": {
"match": {
"message": "this is a test"
}
},
"negative": {
"match": {
"message": "error"
}
},
"boost": 0.2
}
}
}
```
• 这个查询会搜索包含`"this is a test"`的文档,但如果文档中包含`"error"`,则其相关性分数会被降低到原来的 20%。
6.7 使用`profile`来调试查询
Elasticsearch 提供了`profile`参数,可以帮助调试查询的执行过程。例如:
```json
GET /_search
{
"profile": true,
"query": {
"match": {
"message": "this is a test"
}
}
}
```
• 查询结果中会包含详细的执行计划和性能分析信息,帮助优化查询。
8.`match`查询的高级用法(续)
8.1 使用`query_string`查询
`query_string`查询允许使用更复杂的查询语法,支持布尔运算符、通配符等。例如:
```json
GET /_search
{
"query": {
"query_string": {
"query": "(this AND test) OR (error AND warning)",
"fields": ["message"]
}
}
}
```
• 这个查询会搜索字段`message`中包含`(this AND test)`或`(error AND warning)`的文档。
8.2 使用`simple_query_string`查询
`simple_query_string`查询类似于`query_string`,但语法更简单,适合用户输入。例如:
```json
GET /_search
{
"query": {
"simple_query_string": {
"query": "this AND test",
"fields": ["message"]
}
}
}
```
• 这个查询会搜索字段`message`中包含`this`和`test`的文档。
8.3 使用`match_phrase`查询
`match_phrase`查询用于搜索短语匹配,要求文档中包含完整的短语。例如:
```json
GET /_search
{
"query": {
"match_phrase": {
"message": "this is a test"
}
}
}
```
• 这个查询会搜索字段`message`中包含完整短语`"this is a test"`的文档。
8.4 使用`match_phrase_prefix`查询
`match_phrase_prefix`查询用于搜索短语匹配,并允许短语的最后一个词元使用前缀匹配。例如:
```json
GET /_search
{
"query": {
"match_phrase_prefix": {
"message": "this is a te"
}
}
}
```
• 这个查询会搜索字段`message`中包含`"this is a"`并且以`"te"`开头的短语。
8.5 使用`multi_match`查询
`multi_match`查询允许在多个字段中搜索相同的文本。例如:
```json
GET /_search
{
"query": {
"multi_match": {
"query": "this is a test",
"fields": ["message", "description"]
}
}
}
```
• 这个查询会搜索字段`message`和`description`中包含`"this is a test"`的文档。
9.`match`查询的性能优化
9.1 索引优化
• 合理设计字段映射:根据字段的内容和查询需求,合理选择字段类型和分析器。
• 使用倒排索引:Elasticsearch 默认使用倒排索引,确保字段类型适合倒排索引。
• 使用`keyword`类型字段:对于不需要分词的字段,使用`keyword`类型以提高查询性能。
9.2 查询优化
• 避免使用`match_all`查询:尽量使用更具体的查询条件来缩小搜索范围。
• 使用`filter`来减少结果集:通过`filter`条件过滤出符合特定条件的文档。
• 限制返回的字段:使用`_source`参数指定返回的字段,减少数据传输量。
9.3 硬件优化
• 增加内存:Elasticsearch 是内存密集型应用,增加内存可以显著提高性能。
• 使用 SSD 磁盘:SSD 磁盘的读写速度比传统硬盘快得多,可以提高查询性能。
• 合理配置集群:根据数据量和查询负载,合理配置 Elasticsearch 集群的节点数量和硬件配置。
10.总结
`match`查询是 Elasticsearch 中最强大的全文搜索工具之一,它通过分析器将查询文本转换为词元,并通过布尔逻辑组合这些词元来搜索匹配的文档。通过合理配置参数和优化查询,可以实现高效、灵活的全文搜索。
相关文章:
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...

MATLAB 生成脉冲序列 pulstran函数使用详解
MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列,支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加,生成脉冲序列,适用于信号处理和系统…...

开源、免费项目管理工具比较:2025最新整理30款
好用的开源、免费版项目管理系统有:1.Redmine;2. Taiga;3. OpenProject; 4.ProjectLibre; 5.GanttProject; 6.Tuleap; 7.Trac;8. Phabricator; 9.Notion; 10.…...
ffmpeg -muxers
1. ffmpeg -muxers -loglevel quiet 显示ffmpeg支持的复用器。复用器的作用是将多个独立的媒体流(如视频流、音频流、字幕流等)按照一定的格式和规则组合成一个单一的复合流;解复用器的作用与复用器相反,它将复合流分解为多个独立…...

设置mysql的主从复制模式
mysql设置主从复制模式似乎很容易,关键在于1)主库启用二进制日志,2)从库将主库设为主库。另外,主从复制,复制些什么?从我现在获得的还很少的经验来看,复制的内容有表,用户…...
ASP.NET Core的贫血模型与充血模型
目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型:一个类中只有属性或者成员变量,没有方法。充血模型:一个类中既有属性、成员变量,也有方法。 需求 定义一个类保存用户的用户名、密码、积分;用户必须具有…...

君海游戏岗位,需要私我
游戏岗位内推啦,需要找我哈 共14个职位 广告投放主管 社会招聘全国 广告投放 社会招聘全国 设计主管 社会招聘全国 海外投放 社会招聘广东省广州市 海外运营 社会招聘广东省广州市 产品运营专员 社会招聘广东省广州市 平台运营 社会招聘广东…...

IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统
案例:刀箱某一blade,例如 blade 5 安装 Hyper-V Server 2019 操作系统(安装进硬盘) 刀箱USB插入安装系统U盘,登录192.168... IBM BlandeCenter Restart Blande 5,如果Restart 没反应,那就 Power Off Blade 然后再 Power On 重启后进入BIOS界面设置usb存储为开机启动项 …...

Unity中实现动态图集算法
在 Unity 中,动态图集(Dynamic Atlas)是一种在运行时将多个纹理合并成一个大纹理图集的技术,这样可以减少渲染时的纹理切换次数,提高渲染效率。 实现原理: 动态图集的核心思想是在运行时动态地将多个小纹理…...
MySQL中的覆盖索引的使用
文章目录 1. 覆盖索引的定义2. 覆盖索引的工作原理2.1 索引和回表2.2 如何实现覆盖索引 3. 覆盖索引的优势4. 覆盖索引的限制5. 创建和优化覆盖索引5.1 分析查询模式5.2 确定需要覆盖的列5.3 创建复合索引5.4 使用覆盖索引优化查询5.5 避免过度索引5.6 索引整理与优化 6. 实际应…...
XML DOM
XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …...

[开源]MaxKb+Ollama 构建RAG私有化知识库
MaxKbOllama,基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb?二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试
将编译好的镜像全部进行烧写,镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后,在调试串口查看打印日志,如下图所示: 然后打开 hdc 工具,运行测试程序,输入“led_test 1”&…...
将Mac上Python程序的虚拟环境搬到Windows
1. 导出Mac上Python虚拟环境的依赖 cd py && source venv/bin/activate && pip freeze > requirements.txt 2. 在Windows上创建一个新的虚拟环境 python -m venv venv 3. 激活虚拟环境 venv\Scripts\activate 4. 安装依赖 pip install -r requiremen…...
大语言模型评价 怎么实现去偏见处理
大语言模型评价 怎么实现去偏见处理 在训练大语言模型(LLMs)时,去偏处理对于避免模型学习到带有偏见的模式至关重要,以下从数据处理、模型训练、评估监测三个阶段介绍具体实现方法,并结合招聘场景进行举例说明: 数据处理阶段 数据清洗:仔细审查并剔除包含明显偏见的训练…...

3.React 组件化开发
react:版本 18.2.0node: 版本18.19.1脚手架:版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃,且目前使用会报错,官方已经不推荐使用&…...

19vue3实战-----菜单子树的展示
19vue3实战-----菜单子树的展示 1.实现目标2.实现思路3.实现步骤3.1新建config配置文件3.2封装组件3.3使用组件 1.实现目标 如上,以上效果的难点是“在表格里面实现树形结构”。可以用element-plus框架中的table作为辅助: 可以自己查看文档了解怎么使用。 2.实现思路 上面的…...

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库
文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…...
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能? 本文将从 JDK 17 与 JDK 21 的垃圾回收改进出发,结合代码示例解析优化方案,并提供实际项目中的调优策略,帮助…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...