作者:来自 Elastic Justin Castilla

想要获得 Elastic 认证?看看下一次 Elasticsearch Engineer 培训什么时候开始吧!

Elasticsearch 拥有大量新功能,可以帮助你为你的使用场景构建最佳的搜索解决方案。深入了解我们的示例 notebooks,开始免费 cloud 试用,或立即在本地机器上体验 Elastic。


在 Elasticsearch 中,在字段中搜索包含特定子字符串的文档是一项常见需求。本文将探讨在 Elasticsearch 中进行查询的高级技巧,以找到字段中包含特定子字符串的文档。我们将讨论 query_string、match_phrase 和 wildcard 查询的使用,使用分析器和分词器来提高搜索准确性,以及可用于定位字段中子字符串的 ES|QL 函数。如果你想了解精确值与全文本的使用差异,请查看本指南。

1)query_string 查询

query_string 查询是一种强大且灵活的方式,用于搜索包含特定子字符串的文档。它允许你使用 Lucene 查询语法,提供了多种搜索选项。以下是一个 query_string 查询的示例,用于搜索包含子字符串 “example” 的文档:

GET /_search
{"query": {"query_string": {"query": "*example*"}}
}

在这个示例中,星号( * )被用作通配符,匹配任意字符序列。query_string 查询会返回在任意字段中包含子字符串 “example” 的文档。但需要注意的是,前缀通配符可能会对你的集群性能产生负面影响。

2)match_phrase 查询

match_phrase 查询是另一种搜索包含特定子字符串文档的方式。它会在字段中搜索精确短语,并且可以配合 slop 参数使用,以允许单词顺序的变化。以下是一个 match_phrase 查询的示例,用于搜索包含子字符串 “quick brown” 的文档:

GET /_search
{"query": {"match_phrase": {"field_name": "quick brown"}}
}

在这个示例中,match_phrase 查询会返回在指定字段中包含确切短语 “quick brown” 的文档。

3)wildcard 查询

wildcard 查询是一种简单的方式,用于搜索包含特定子字符串的文档。它使用通配符来匹配字段中任意字符序列。以下是一个 wildcard 查询的示例,用于搜索包含子字符串 “exam” 的文档:

GET /_search
{"query": {"wildcard": {"field_name": "*exam*"}}
}

在这个示例中,wildcard 查询会返回在指定字段中包含子字符串 “exam” 的文档。在这种情况下,也需要特别注意在 wildcard 查询中使用前缀通配符,因为这可能会降低搜索性能。

4)分析器和分词器

为了提高子字符串搜索的准确性,你可以使用分析器和分词器来处理文档中的文本。分析器负责将文本分解成 token,这些 token 会用于索引和搜索。分词器是分析器的一个组件,用于将文本拆分为单个 token。

例如,你可以使用 n-gram 分词器从输入文本中创建不同长度的 token。这样可以通过匹配不同长度的子字符串来提高子字符串搜索的准确性。以下是一个使用 n-gram 分词器创建自定义分析器的示例:

PUT /my_index
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "ngram","min_gram": 3,"max_gram": 5}}}}
}

在这个示例中,自定义分析器使用了一个 n-gram 分词器,其最小 token 长度为 3,最大 token 长度为 5。你可以在索引文档时以及进行子字符串搜索时使用这个自定义分析器。

需要注意的是,将大量文本分词为 n‑gram 会显著增加倒排索引中的 term 数量,从而不必要地增加存储,并降低索引和查询的速度。最好只对需要子字符串匹配的文本字段使用 n‑gram 分词器。

5)ES|QL 函数

LOCATE

ES|QL 的 LOCATE 函数用于查找文档中指定子字符串的首次出现位置。LOCATE 函数的调用方式如下:

这里,string 是要查询的字段,substring 是目标子字符串,start 是字符串中的整数偏移量。这个函数会返回从提供的 start 位置之后首次出现子字符串的位置的整数值;如果子字符串不存在,则返回 0。

对于字段中出现多次的子字符串,不建议使用这个函数,因为 ES|QL 中不支持迭代处理,它是一种纯声明式、流水线风格的查询语言。

MATCH

MATCH 函数会返回布尔值 true,如果传入 query 参数的子字符串出现在传入 field 参数的文本中。它适用于一般的全文搜索,相关性由术语是否存在决定,而不考虑它们的位置。

可选的命名函数参数可以传入以获得更细粒度的控制,比如模糊度( fuzziness )、用于解释文本的操作符,以及宽容度( leniency )值。

注意,查询中可以包含多个词项,结果可能包含这些词项中的任意一个,但不一定按给定顺序出现。

示例:搜索 “quick brown fox” 会匹配包含 “the fox is quick and brown” 的文档。

MATCH_PHRASE

MATCH_PHRASE 与 MATCH 函数类似,但它必须匹配传入函数的整个短语,而不是单个词项。它适用于你想搜索确切短语而不仅仅是单个词项是否存在的情况。

MATCH_PHRASE 也有可选的命名参数,允许各种细化设置,比如 slop 和 token 分析器。

示例:搜索 “quick brown fox” 只会匹配包含确切短语 “quick brown fox” 的文档。

KQL

KQL 查询指的是用 Kibana Query Language(KQL)编写的查询。KQL 是 Kibana 中使用的搜索和过滤语言,Kibana 是我们的数据可视化工具。Elastic 已将这种查询语言引入 ES|QL,以增强搜索功能。

示例:搜索 “foo: bar” AND “baz > 12” 会返回所有 “foo” 字段包含 “bar” 且 “baz” 字段值大于 12 的文档。

QSTR

QSTR 是 Lucene 使用的一种查询格式,提供对文本字段的灵活、基于相关性的搜索,类似于在 Elasticsearch DSL 中使用 match 查询。

示例:在工单索引中使用 QSTR 搜索 "timeout error OR "connection refused"",会返回包含 “timeout error” 或确切短语 “connection refused” 的工单文档。

QSTR 还提供最多的选项,能够在搜索中提供高度的粒度和灵活性。

附加内容:区间查询和跨度查询

区间查询 - interval queries

区间查询是搜索必须按照给定顺序出现的词项的查询。以下是一个示例查询:

POST _search
{"query": {"intervals" : {"my_text" : {"all_of" : {"ordered" : true,"intervals" : [{"match" : {"query" : "it's rainy outside","max_gaps" : 0,"ordered" : true}},{"any_of" : {"intervals" : [{ "match" : { "query" : "curl up with a good book" } },{ "match" : { "query" : "listen to a podcast" } }]}}]}}}}
}

该查询搜索短语 “it’s rainy outside”,后面紧跟着 “curl up with a good book” 或 “listen to a podcast” 中的任意一个词项。

这句话会匹配:“When it’s rainy outside, I like to dress up in cozy clothes, turn on some classical music, and curl up with a good book.”

这句话不会匹配:“I find it best to listen to a podcast in my car when there’s a lot of traffic and it’s rainy outside.”

这是因为 “all_of”: {“ordered”: true} 条款,要求上述顺序必须严格遵守。

这是一个非常强大且可扩展的查询,适合用于动态且复杂的子字符串搜索。

跨度查询 - span

跨度查询通过操作 token 偏移量而非原始文本,提供了一种低级且带位置感知的子字符串搜索方法。跨度可以嵌套子跨度,这些子跨度必须满足诸如在指定距离内出现在另一个跨度之前或之后等约束条件。这使得它们非常适合处理某些领域(如法律文件),在这些领域中常见术语在靠近特定关键词时会获得特殊含义。

GET /_search
{"query": {"span_near": {"clauses": [{ "span_term": { "field": "contract" } },{ "span_term": { "field": "breach" } }],"slop": 3,"in_order": false}}
}

例如,你可以使用 span_near 查询来查找距离 “breach” 四个 token 以内的 “contract”。一份冗长的法律摘要中可能多次提到 “contract”,但只有两个地方出现了短语 “breach of obligation and contract” 或 “breach of contract litigation”。通过调整跨度距离(例如 slop: 3),你只会匹配这两个上下文,忽略所有其他的 “contract” 出现。

总结

Elasticsearch 提供了多种高级技术,用于查询包含特定子字符串的文档。通过使用 query_string、match_phrase 和 wildcard 查询,自定义分析器和分词器,ES|QL 函数,甚至是区间查询或跨度查询,你可以提高子字符串搜索的准确性和灵活性。尝试这些技术,找到最适合你具体用例和数据集的方法。

原文:https://www.elastic.co/search-labs/blog/elasticsearch-string-contains-substring

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

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

相关文章

Vue、Laravel 项目初始化命令对比 / curl 命令/ CORS 机制总结与案例

前言一个疑问衍生出另一个疑问再衍生出又一个疑问,于是有了这篇文章。一、Vue 项目初始化命令 基于 Vite 创建 Vue 项目 命令:npm create vitelatest my-project -- --template vue适用场景:需轻量级、高速开发环境关键点:使用 Vi…

Jenkins 流水线配置

Jenkinsfile dsl文件:pipeline {// 指定任务在哪个集群节点执行agent any// 声明全局变量environment {keyvalueAPPLICATION_NAMEspringboot-demo // 项目名称HOST_PORT7777 // 宿主机暴露服务端口CONTAINER_PORT8080 // 容器内部服务端口…

服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录

目录 摘要 一、 背景:熟悉的陌生人 二、 问题浮现:一次次失败的尝试 问题一:source activate 失效,被写死的旧路径 问题二:官方安装器修复失败,神秘的“进程池损坏” 问题三:核心脚本也“背…

Redis的多并发实际业务场景下的使用分析:布隆过滤器

文章目录前言什么是布隆过滤器项目中引入布隆过滤器与缓存结合的最佳实践场景:高并发用户访问商品详情页(防止缓存穿透)总结:前言 okok 我们已经学完了 所有的redis中的常用的数据结构 下面就是进阶 我会用一系列的例子 去讲解 如…

【AI】人工智能领域关键术语全解析

一、前言 人工智能(AI)作为当今最热门的技术领域之一,正在深刻改变着我们的生活和工作方式。然而,对于初学者或非技术背景的人士来说,理解AI领域的专业术语可能是一项挑战。本文旨在全面解析人工智能领域的关键术语&a…

【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed

在Linux系统中,正则表达式是一种强大的文本处理工具,广泛用于文本搜索、替换和批量处理。通过掌握基础正则表达式的语法,结合grep和sed命令,用户可以高效地完成复杂的文本处理任务。无论是数据分析师、软件开发者还是系统管理员&a…

SIMATIC S7-1200的以太网通信能力:协议与资源详细解析

SIMATIC S7-1200的以太网通信能力:协议与资源解析 在工业自动化领域,PLC的通信能力往往直接影响着整个控制系统的灵活性与高效性。西门子SIMATIC S7-1200系列PLC作为一款广泛应用的中小型控制器,其强大的以太网通信功能是其核心优势之一。本文…

什么是高防 IP?从技术原理到实战部署的深度解析

目录 前言 一、高防 IP 的定义与核心价值 二、高防 IP 的技术原理与架构 2.1 流量牵引技术 2.2 流量清洗引擎 2.3 回源机制 三、高防 IP 的核心防护技术详解 3.1 DDoS 攻击防御技术 3.2 高防 IP 的弹性带宽设计 四、实战:基于 Linux 的高防 IP 环境配置 …

NW710NW713美光固态闪存NW719NW720

美光NW系列固态闪存深度解析:技术、性能与市场洞察一、技术架构与核心创新美光NW系列固态闪存(包括NW710、NW713、NW719、NW720)的技术根基源于其先进的G9 NAND架构。该架构通过5纳米制程工艺和多层3D堆叠技术,在单位面积内实现了…

JVM汇总

1.什么是JVM?Java虚拟机,Java具有自动内存管理等一系列特性,为实现Java跨平台,一次编译处处执行。2.JVM结构图3.类加载器-入口加载class文件,将类信息存放到运行时数据区的方法区内存空间中通过魔数和文件格式来判断是…

2024.09.20 leetcode刷题记录

# 前言 昨天发布了第一遍博客,感觉很好,趁着我现在还是很感兴趣就多发几遍,希望能坚持下去,在这里记录下自己学习成长的经历。 今天是周五,下周一就又要去实习啦,距离上一段实习刚结束一个月,之…

SQLite3 中列(变量)的特殊属性

在 SQLite3 中,列的特殊属性通常通过约束(Constraints)和数据类型修饰符来定义。这些属性可以在创建表时指定,用于限制数据的完整性或定义特殊行为。以下是 SQLite3 支持的主要特殊属性及其说明: 1. 主键约束&#xff…

Datawhale AI 夏令营:用户洞察挑战赛 Notebook(2)

针对文本聚类优化 优化TF-IDF特征工程# 调整ngram_range:设置为(1, 2),捕捉单字和双字词(如“不错”“不满意”)。 # 限制特征数量:通过max_features5000保留高信息密度特征,降低维度。 # 过滤低频/高频词&…

【博主亲测可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安装教程)

软件简介 Adobe Photoshop 2025是Adobe公司开发的一款图像处理软件。作为行业标准的数字图像编辑工具,其核心定位是创意设计、后期摄影、3D建模和AI驱动创作,适用于专业设计师、摄影师、插画家和多媒体创作者。界面设计简单直观,易于操作&…

unity A星寻路

算法 fCost gCost hCost gCost 是当前节点到移动起始点的消耗,hCost是当前节点到终点的消耗 网格为变成为1的矩形,左右相邻的两个网格直接的gCost为1,斜对角相邻的两个网格的gCost为1.4 hCost 当前网格到终点网格的 水平距离 垂直距离 比如…

十一 Javascript的按值传递

你将知道:“传递” 值是什么意思什么是按值传递传递物品JavaScript 中没有传递引用!介绍当需要在 JavaScript 中分配或简单地将一个值传递给其他标识符时,我们就会看到通常所说的 按值传递 。严格来说,JavaScript 中传递值的方式只…

SpringBoot ThreadLocal 全局动态变量设置

需求说明: 现有一个游戏后台管理系统,该系统可管理多个大区的数据,但是需要使用大区id实现数据隔离,并且提供了大区选择功能,先择大区后展示对应的数据。需要实现一下几点: 1.前端请求时,area_i…

如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题 摘要: 在使用 PyCharm 2025 控制台通过 pip install 安装第三方库时,常会遇到诸如 ModuleNotFoundError: No module name…

打破技术债困境:从“保持现状”到成为变革的推动者

相信许多在科技行业的同行都面临过类似的挑战:明知系统存在“技术债”,却因为沟通成本、团队压力和短期KPI等原因,难以推动改进,最终陷入“想做却不敢做”的矛盾心态。这不仅影响个人心情,更重要的是,它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述:RabbitMQ 是什么? 你可以把 RabbitMQ 想象成一个「快递中转站」。 比如你在网上买了一本书,卖家(生产者)把包裹(消息)交给快递站(RabbitMQ&…