【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、研究背景和意义 随着全球能源危机和环境问题的日…...
开源高级提示词数据库:一键部署,解锁AI生产力
1. 项目概述:一个开箱即用的高级提示词数据库如果你和我一样,经常在ChatGPT、Claude或者Midjourney这类AI工具里折腾,那你肯定明白一个道理:好的提示词(Prompt)就是生产力。但问题来了,那些真正…...
电源设计和效率优化案例C01
本文重点讲清楚三个非常重要的问题: 手把手教会计算电源的效率计算,包括线性电源和开关电源等 1-电源的上下管的 Qg和Rdson为什么是一对矛盾量? 2-单相30A的电流输出电源要求,对上下管子应该如何取舍这两个参数,为什么? 电源设计是硬件设计的核心组成部分,尤其事目前…...
Meta发布最大视觉模型:DSG架构如何重构视觉理解范式
1. 项目概述:这不是一次普通更新,而是一次视觉理解边界的重写“Meta Just Updated the Largest Computer Vision Model in History”——这个标题乍看像科技媒体的快讯标题,但如果你在CV领域摸爬滚打过几年,第一反应不是点开链接&…...
如何快速掌握Unitree Go2机器人ROS2开发:面向初学者的完整教程
如何快速掌握Unitree Go2机器人ROS2开发:面向初学者的完整教程 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree Go2 ROS2 SDK是一个强大的开源项…...
终极窗口调整神器:WindowResizer完整使用指南
终极窗口调整神器:WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows窗口而烦恼吗?无论你是遇到老旧软件界…...
VS2019/2022插件安装指南:让CppCheck帮你揪出C++代码里那些编译器发现不了的‘幽灵Bug’
VS2019/2022插件安装指南:让CppCheck帮你揪出C代码里那些编译器发现不了的‘幽灵Bug’ 在C开发中,编译器能捕捉语法错误,但那些潜伏在逻辑深处的"幽灵Bug"——内存泄漏、未初始化变量、数组越界——往往要等到运行时才暴露。CppCh…...
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力 【免费下载链接】PptxGenJS Build PowerPoint presentations with JavaScript. Works with Node, React, web browsers, and more. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 还在为…...
终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报
终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure Quickstart Templates是微软…...
NomNom终极指南:3个技巧让你轻松掌控《无人深空》存档
NomNom终极指南:3个技巧让你轻松掌控《无人深空》存档 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indi…...
从数据模型到领域驱动设计:数据库抽象与微服务实践的演进
在软件开发的漫长历史中,如何有效地对现实世界进行建模,始终是核心挑战之一。从早期的层次数据库到当今的微服务架构,数据模型作为连接业务需求与技术实现的桥梁,经历了深刻的演变。本文基于对概念数据模型、基本数据模型和面向对象模型的系统探讨,进一步延伸到领域驱动设…...
