Elasticsearch 全文查询详解
全文查询(Full-Text Query)是 Elasticsearch 中的核心功能之一,用于对非结构化文本数据进行高效检索。与结构化查询不同,全文查询不仅仅是简单的精确匹配,还包括对文本进行分析和处理,从而实现更复杂的搜索功能。本文将介绍三种常用的全文查询:Match Query、Match Phrase Query 和 Query String Query,并讨论它们的应用场景及用法。
一、Match Query:标准的全文查询
Match Query 是 Elasticsearch 中最常用的全文查询之一。它的作用是对指定字段中的文本进行分词和分析,然后根据分析结果进行搜索。Match Query 支持模糊搜索、多字段搜索和布尔逻辑等功能,非常适合搜索非结构化文本数据。
使用场景
- 搜索博客文章、新闻、产品描述等长文本内容。
- 需要对搜索词进行分词处理,并匹配不同形式的相关内容。
工作原理
当你使用 Match Query 进行搜索时,Elasticsearch 会首先将查询词和文档中的文本内容都进行分词和归一化处理(例如转换为小写、去掉停用词等)。然后,它会在分析后的词汇中进行匹配,并根据匹配度返回结果。
示例
假设我们有一个包含博客文章的索引,现在我们想搜索包含 “Elasticsearch tutorial” 的文章:
{"query": {"match": {"content": "Elasticsearch tutorial"}}
}
在这个查询中,Elasticsearch 会将 “Elasticsearch tutorial” 分解为 “Elasticsearch” 和 “tutorial”,然后查找这些词在 content
字段中的出现情况,并按相关性返回匹配的文档。
二、Match Phrase Query:精确短语查询
Match Phrase Query 是 Elasticsearch 中用于搜索精确短语的查询方式。与 Match Query 不同,Match Phrase Query 不仅要求所有词都匹配,还要求它们以指定的顺序和间隔出现在文档中。它适用于需要查找特定词组或句子时的场景。
使用场景
- 查找特定短语或句子,例如法律文本中的固定表达、产品名称或技术术语。
- 搜索需要精确匹配词序和词间关系的内容。
工作原理
Match Phrase Query 首先对查询文本进行分词,然后检查分词后的词是否以指定的顺序和位置出现在文档的字段中。如果所有词都按指定顺序出现在文档中,则认为该文档匹配。
示例
假设我们需要搜索一个包含短语 “quick brown fox” 的文档,要求这些词必须按顺序紧密相连:
{"query": {"match_phrase": {"content": "quick brown fox"}}
}
在这个查询中,Elasticsearch 会查找 content
字段中是否存在按顺序出现的 “quick brown fox” 短语。如果这些词是以其他顺序或中间有其他词隔开,则不会匹配。
近似短语查询
Match Phrase Query 还支持设置词之间的距离,以允许某些灵活性。例如,我们可以允许两个词之间最多有一个其他词:
{"query": {"match_phrase": {"content": {"query": "quick brown fox","slop": 1}}}
}
slop
参数表示允许的词之间的最大距离,值越大,匹配的范围越宽松。
三、Query String Query:使用搜索语法的查询
Query String Query 提供了一个更加灵活和强大的查询方式。它允许用户直接使用 Lucene 查询语法在字符串中指定复杂的查询条件,包括布尔逻辑、通配符、范围查询等。Query String Query 非常适合对搜索语法熟悉的用户,或者需要构建复杂查询的场景。
使用场景
- 需要在同一字段或多个字段中进行复杂的条件查询。
- 允许用户输入包含逻辑运算符、通配符等的查询表达式。
工作原理
Query String Query 直接将用户输入的查询字符串解析为 Lucene 查询表达式,然后在索引中执行该查询。它支持多种高级功能,如布尔操作符(AND、OR、NOT)、通配符(* 和 ?)、范围查询([ TO ])、以及字段的权重控制等。
示例
假设我们想查找同时包含 “Elasticsearch” 和 “tutorial” 的文档,并且这些词必须出现在 title
字段中,而不是 content
字段中:
{"query": {"query_string": {"query": "title:(Elasticsearch AND tutorial)"}}
}
在这个例子中,title:(Elasticsearch AND tutorial)
表示只在 title
字段中搜索,同时包含 “Elasticsearch” 和 “tutorial” 的文档。
更复杂的查询
Query String Query 可以结合多个条件,构建更复杂的查询表达式。例如,查找包含 “Elasticsearch” 或 “tutorial” 的文档,并且排除包含 “basic” 的文档:
{"query": {"query_string": {"query": "(Elasticsearch OR tutorial) AND NOT basic"}}
}
这种查询表达式使得 Query String Query 在复杂检索需求中表现出色。
四、综合实例:全文搜索的实际应用
在实际应用中,全文查询通常与布尔查询、过滤条件等结合使用,以构建复杂的搜索功能。下面是一个实际的使用案例,展示如何结合 Match Query 和 Match Phrase Query 构建一个强大的搜索功能。
示例
假设我们有一个电商网站,用户可以通过搜索框输入商品描述来查找产品。我们希望搜索结果能够:
- 首先匹配用户输入的精确短语。
- 然后匹配所有包含用户输入的产品。
{"query": {"bool": {"should": [{"match_phrase": {"description": "wireless headphones"}},{"match": {"description": "wireless headphones"}}]}}
}
在这个查询中,bool
查询中的 should
子句允许匹配多个条件。首先,系统会优先返回包含精确短语 “wireless headphones” 的产品,然后返回包含这两个词的所有产品。
五、总结
Elasticsearch 的全文查询功能非常强大,提供了多种方式来处理和分析文本数据。Match Query 适合大多数非结构化文本搜索,Match Phrase Query 则用于需要精确短语匹配的场景,而 Query String Query 则为高级用户提供了灵活的查询语法,能够应对复杂的检索需求。
通过深入了解和掌握这些查询方式,你可以更高效地利用 Elasticsearch 的搜索能力,构建更加智能和精准的全文搜索功能,从而提升应用的用户体验和数据处理效率。
相关文章:
Elasticsearch 全文查询详解
全文查询(Full-Text Query)是 Elasticsearch 中的核心功能之一,用于对非结构化文本数据进行高效检索。与结构化查询不同,全文查询不仅仅是简单的精确匹配,还包括对文本进行分析和处理,从而实现更复杂的搜索…...

20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡
df -h mount fdisk无效 20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡 2024/8/10 21:19 缘起:当时比较便宜96.9¥/想看看256GB的TF卡的高速卡的效果,就在京东入手了3张三星的高速TF卡。最近在弄RK3588S,…...

java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类
前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写,XML文档约束schema,用Dom4j解析XML文档,Xpath检索XML文档,完整使用Junit单元测试框架常用部分,注解的定义和使用,枚举类的定义和开发…...

《向量数据库指南》——控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化
控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化 在Chatbot技术日益成熟的今天,如何有效地控制对话内容,以满足用户多样化的需求,成为了开发者们关注的焦点。Dopple AI,作为一款先进的聊天机器人平台,通过其独特的交互设计和后端技术支持,为用户提供了前所未有…...

构建实时数据仓库:流式处理与实时计算技术解析
目录 一、流式处理 请求与响应 批处理 二、实时计算 三、Lambda架构 Lambda架构的缺点 四、Kappa架构 五、实时数据仓库解决方案 近年来随着业务领域的不断拓展,尤其像互联网、无线终端APP等行业应用的激增,产生的数据量呈指数级增长,对海量数…...
python算术表达式遗传算法
import random import operator import math# 定义可能的运算符和操作 ops {: ,-: -,*: *,/: /,sin: math.sin,cos: math.cos }# 随机生成一个表达式(个体) def generate_expression(depth0):if depth > 2: # 限制表达式的最大深度return str(rando…...

net.sf.jsqlparser.statement.select.SelectItem
今天一启动项目,出现了这个错误,仔细想了想,应该是昨天合并代码,导致的mybatis-plus版本冲突,以及分页PageHelper版本不兼容 可以看见这个我是最下边的 Caused by 报错信息,这个地方提示我 net .s…...
lua匹配MAC地址 正则表达式
LUA的正则表达式匹配很弱智,能不用lua就不要用lua。 %x表示十六进制数值 (%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)它不允许这样用: ((%x%x):){5}(%x%x)mac这还算好办,ipv4就难了,ipv6不可能,这样写下来那一串表达…...
Chainlit快速实现AI对话应用并将聊天数据的AWS S3 和 Azure Blob云服务中
自定义数据层 Literal AI 提供了最简单的方法来保存、分析和监控您的数据。 如果您正在考虑实现自定义数据层,请查看此处的示例以获取一些启发。 此外,我们非常希望看到社区主导的开源数据层实现并将其列在这里。如果您有兴趣做出贡献,请通过 Discord 与我们联系。 您需…...

浅谈性能优化(基于C++)
本文主要针对C的性能优化方法展开讨论。虽然这些方法也适用于一些其他语言,但由于C经常用于底层操作,提供了更多的优化空间;相比之下,诸如Python、Kotlin等高级语言由于其抽象程度更高,优化空间较少。 性能优化原理 …...

Python 报错:ModuleNotFoundError: No module named ‘Crypto‘
Crypto报错解决方案 Python 报错:ModuleNotFoundError: No module named Crypto前言问题解决方案 Python 报错:ModuleNotFoundError: No module named ‘Crypto’ 前言 Crypto是一个加密模块,它包含了多种加密算法,如 AES、DES、…...
UE(User Equipment) 和 UA(User Agent)
UE(User Equipment) UE 是 用户设备,这是一个泛指的术语,涵盖了所有类型的终端设备,例如手机、电脑、平板、智能手表等。这些设备可以连接到网络并进行通信。UE可以包含多种功能,包括对话(语音…...

视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台…...

开关电源:优化电子产品中的能源使用
电压转换器是许多技术系统的支柱。根据应用的不同,所需的电源单元由变压器、整流器 AC/DC 转换器实现。当高性能开关电源尚未上市时,几乎只使用 50 Hz 变压器解决方案。 电源注意事项 电能几乎完全以三相电流的形式提供,系统电压为 10 ...3…...

Java语言程序设计——篇十三(2)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...

python结合csv和正则实现条件筛选数据统计分数
前景提要: 有一个项目的数值和员工统计的对不上,如果一页一页翻找自己手动算,一个就有16、7页, 功能实现 1、创建csv文件 需要将每一个模块的所有数据头提取出来,这个可以直接用爬虫或者手工复制出来,因…...
Ubuntu系统的基础操作和使用|Linux|安装|网络连接|更新与升级系统|系统维护|故障排除|监控|桌面环境|虚拟机|快捷键
目录 1. Ubuntu系统的安装与初步设置 1.1 下载与安装Ubuntu 1.2 创建用户和设置密码 1.3 配置网络连接 1.4 更新与升级系统 2. Ubuntu的基本操作 2.1 文件与目录管理 2.2 系统进程管理 2.3 软件安装与管理 2.4 权限与用户管理 3. 系统维护与故障排除 3.1 系统日志查…...
day 38
2824.统计和小于目标的下标对数目 int countPairs(int* nums, int numsSize, int target){int x0;for(int i0;i<numsSize;i){for(int ji1;j<numsSize;j){if(nums[i]nums[j]<target){x;}}}return x; }2951.找出峰值 int* findPeaks(int* mountain, int mountainSize,…...

352532
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...
Day.38 | 1143.最长公共子序列 1035.不相交的线 53.最大子序和 392.判断子序列
1143.最长公共子序列 要点:dp[i][j] dp[i - 1][j - 1] 1; dp[i][j] max(dp[i - 1][j], dp[i][j - 1]); class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...