Elasticsearch:使用全文搜索在 ES|QL 中进行过滤 - 8.17

8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。

ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法,并了解为什么这些函数提供了更好的替代方案。我们还将研究 ES|QL 中全文函数的未来改进。

使用 ES|QL 过滤文本

日志中的文本数据对于理解、监控和排除系统和应用程序故障至关重要。文本的非结构化性质允许灵活地捕获各种信息。

由于是非结构化的,我们需要隔离特定模式、关键字或短语的方法。无论是搜索错误消息、使用标签缩小结果范围,还是查找特定主机名,都是我们一直在做的事情,以优化我们的结果并最终获得我们正在寻找的信息。

ES|QL 提供了不同的方法来帮助你处理文本。Elasticsearch 8.17 添加了全文函数 match 和 qstr,以帮助解决更复杂的搜索用例。

文本过滤的局限性

ES|QL 已经提供了文本过滤功能,包括:

  • 文本相等,使用相等运算符直接比较完整字符串。
  • 字符串开始和结束,使用 STARTS_WITH 和 ENDS_WITH 函数。
  • 使用 LIKE 和 RLIKE 运算符进行模式和正则表达式匹配。

文本过滤很有用 - 但它在面向文本的用例中可能会有所不足:

多值字段

将 ES|QL 函数与多值字段结合使用可能比较棘手 - 函数在应用于多值字段时会返回 null。

如果你需要将函数应用于多值字段,则首先需要使用 MV_CONCAT 将值转换为单个值,以便可以匹配单个值:

FROM logs
| EVAL all_tags = MV_CONCAT(tags)
| WHERE all_tags == "production"

分析文本

分析器对于全文搜索非常有用,因为它们允许转换文本。它们允许我们提取和修改索引文本,并修改查询,以便我们最大限度地找到我们正在寻找的内容。

使用文本过滤时不会分析文本。这意味着例如,你需要在搜索时匹配文本大小写,或者创建解决可能的大小写差异的正则表达式/模式。

在查找多语言文本(因此你不能使用  ASCII folding)、尝试匹配路径的部分(path hierarchy)或删除停用词(stopwords)时,这可能会变得更加成问题。

性能

模式匹配和正则表达式需要时间。Lucene 可以通过创建有限自动机来使用索引术语词典进行匹配,从而完成大量繁重的工作,但这仍然是一个计算密集型过程。

正如你在我们 8.17 版本博客中看到的那样,使用正则表达式进行文本过滤的速度可能比使用全文函数慢 50-1000 倍,具体取决于你的数据集。

进入全文函数

Elasticsearch 8.17 和 Serverless 引入了两个用于文本匹配的新函数:MATCH 和查询字符串(缩写为 QSTR)。

这些函数解决了文本过滤的一些限制:

  • 它们可以直接用于多值字段。当多值字段中的任何值与查询匹配时,它们将返回结果。
  • 它们使用文本字段的分析器。将使用目标字段的任何现有分析器分析查询,这将允许匹配而不考虑大小写。这还可以解锁 ASCII folding、删除停用词,甚至使用同义词。
  • 它们性能卓越。它们可以直接使用 Lucene 索引结构来定位数据中的特定术语,而不是依赖模式匹配或正则表达式。

MATCH 函数

MATCH 允许匹配特定字段上的值:

FROM logs
| WHERE match(message, "connection lost")

Match 函数在底层使用 match query。这意味着当使用多个术语时,它将创建一个布尔查询,并使用 OR 作为组合它们的默认运算符。

Match 函数目前有一些限制:

  • 它不提供指定参数的方法。它将使用匹配查询的默认值。
  • 它只能在 WHERE 子句中使用。
  • 它不能在 STATS 或 LIMIT 命令之后使用

8.17 版本存在以下限制:

  • 只有 text 或 keyword 字段可以与 MATCH 一起使用。
  • MATCH 可以与其他条件组合作为 AND 表达式的一部分,但不能作为 OR 表达式的一部分。可以使用 WHERE match(message, "connection lost") AND length(message) > 10,但不能使用 WHERE match(message, "connection lost") OR length(message) > 10。

我们正在积极努力解除这些限制,以便你可以充分利用 MATCH 的全部功能。你可以查看 Elastic Cloud Serverless 中的进度,它会不断更新我们的新工作。以下是针对上述限制的 serverless 当前状态:

  • MATCH 几乎可以与任何字段类型一起使用,并自动将字符串值转换为任何类型。
  • 当条件的所有元素都是全文函数时,MATCH 和全文函数允许使用 OR 条件

查看最新文档以了解无服务器上 MATCH 的状态。

匹配运算符

匹配运算符 (:) 相当于上面的匹配函数,但它提供了更简洁的语法:

FROM logs
| WHERE message:"connection lost"

使用 match 运算符更方便,但你可以使用对你更有意义的任何运算符。

match 运算符具有与 match 函数相同的限制。

查询字符串函数

查询字符串函数 (QSTR) 使用查询字符串语法对一个或多个字段执行复杂查询:

FROM logs
| WHERE qstr("message: 'connection lost' AND tags:'production'")

查询字符串语法允许指定强大的全文选项和操作,包括模糊搜索、邻近搜索(proximity searches)和布尔运算符(boolean operators)的使用。有关更多详细信息,请参阅文档。

查询字符串是一个非常强大的工具,但目前有一些限制,与 MATCH 函数非常相似:

  • 它不提供指定参数(如 match type)或指定要搜索的 default fields 的方法。
  • 它只能在 WHERE 子句中使用。
  • 它不能在 STATS 或 LIMIT 命令之后使用
  • 它不能在修改列的命令之后使用,例如 SHOW、ROW、DISSECT、DROP、ENRICH、EVAL、GROK、KEEP、MV_EXPAND 或 RENAME

与 MATCH 函数类似,我们对 OR 条件有一个限制。QSTR 可以作为 AND 表达式的一部分与其他条件组合,但不能作为 OR 表达式的一部分。可以使用 WHERE qstr("message: 'connection lost'") AND length(message) > 10,但不能使用 WHERE qstr("message: 'connection lost'") OR length(message) > 10。

当条件的所有元素都是全文函数时,Elastic Cloud Serverless 允许使用 OR 条件。请查看最新文档,了解 QSTR 在 Serverless 上的状态。

下一步是什么?

全文搜索将会发生什么?相当多的事情:

  • 为 MATCH 和 QSTR 函数的行为添加调整选项
  • 一个额外的 KQL 函数,可用于将你现有的 Kibana 查询移植到 ES|QL
  • 消除全文函数的当前限制

我们还在努力添加评分,因此你可以开始使用 ES|QL 进行相关性匹配,而不仅仅是进行过滤。这非常令人兴奋,因为这将定义 Elasticsearch 中文本搜索的未来!

试一试

MATCH 和 QSTR 在 Elasticsearch 8.17 上可用,当然它们在 Serverless 中始终是最新的。

你在文本过滤方面寻找什么?让我们知道你的反馈!

祝你全文过滤愉快!

Elasticsearch 包含新功能,可帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在你的本地机器上试用 Elastic。

原文:https://www.elastic.co/search-labs/blog/filtering-in-esql-full-text-search-match-qstr

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

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

相关文章

Java 0114学习总结

1.如何解决线程安全问题 当多个线程共享一个资源时,则可能出现线程安全问题。java中解决线程安全的方式有三种: ①同步代码快 ②同步方法 ③Lock锁 1.1同步代码块 synchronized(锁对象){ 需要同步的代码。 } ①synchronized 同步的意思; ②锁…

【Unity-Animator】通过 StateMachineBehaviour 实现回调

StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…

解决 VSCode 调试时 Python 文件出现相对路径报错问题‘FileNotFoundError’

文章目录 1. 问题描述2. 解决方法 1. 问题描述 在使用 VSCode 进行 Python 开发时,遇到一个的问题:在调试模式下,程序无法读取文件或路径,导致File Not Found Error 错误。然而,当不使用调试模式而是直接运行 Python 文…

OpenCV的TIF红外可见光融合算法

一、简介 首先TIF是Two-Scale Image Fusion的缩写,论文《Two-Scale Image Fusion of Infrared and Visible Images Using Saliency Detection (TIF)》,作者在论文中提到TIF算法主要通过以下三个步骤实现融合: 图像分解,图像分解使…

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架,专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括: 高效的抓取性能:Scrapy 采用了异步机制,能够高效…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中,如果需要对器件进行翻转、平移等操作,可以通过transform指…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章:Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具,放到C盘根目录, 2.1 打开windows Powershell(WinX),下边那个最好。 输入两条指令&a…

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

nexus搭建maven私服

说到maven私服每个公司都有&#xff0c;比如我上一篇文章介绍的自定义日志starter&#xff0c;就可以上传到maven私服供大家使用&#xff0c;每次更新只需deploy一下就行&#xff0c;以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…

【声音场景分类--论文阅读】

1.基于小波时频图特征在声音场景分类 基于小波时频图特征在声音场景分类任务中的表现 2.增强增强高效音频分类网络 https://arxiv.org/pdf/2204.11479v5 https://github.com/Alibaba-MIIL/AudioClassfication 音频分类网络如图4所示。在此阶段&#xff0c;主要重点是建立一…

基于springboot果蔬供应链信息管理平台

基于Spring Boot的果蔬供应链信息管理平台是一种集成了先进信息技术和果蔬供应链管理理念的综合性系统。 一、背景与意义 随着人们生活水平的提高和对健康饮食的重视&#xff0c;果蔬市场需求不断增长。然而&#xff0c;果蔬供应链涉及多个环节&#xff0c;包括种植、采摘、加…

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)

0.前言 递归&#xff01;循环神经网络Recurrent Neural Network 循环神经网络&#xff08;又称递归神经网络&#xff0c;Recurrent Neural Network&#xff0c;RNN&#xff09;。是一种用于处理序列数据的神经网络结构&#xff0c;具有记忆功能&#xff0c;能够捕捉序列中的时…

kafka原理和实践

Kafka是当前分布式系统中最流行的消息中间件之一&#xff0c;凭借着其高吞吐量的设计&#xff0c;在日志收集系统和消息系统的应用场景中深得开发者喜爱。本篇就聊聊Kafka相关的一些知识点。主要包括以下内容&#xff1a; Kafka简介 Kafka特点Kafka基本概念Kafka架构Kafka的几…

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…

详情页 路由传值

路由传值获取参数 渲染数据 主页面 <template><div class"km"><div v-for"item in items" :key"item.id"><div class"title-km" ><img :src"item.imageUrl" alt"Image" class"…

从源码角度分析SpringMVC执行流程

文章目录 一、SpringMVC基本概述二、SpringMVC的执行流程三、SpringMVC源码的执行流程四、前端控制器根据请求获取处理器原理五、如何根据处理器获取处理器适配器六、SpringMVC拦截器执行源码解读七、处理器适配器执行方法原理 一、SpringMVC基本概述 SpringMVC是基于Servlet进…

Java中网络编程的学习

目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址&#xff08;Internet Protocol Address&#xff09; 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤&#xff1a; 服务器程序…

Winforms开发基础之非主线程操作UI控件的误区

前言 想象一下&#xff0c;你正在开发一个桌面应用程序&#xff0c;用户点击按钮后需要执行一个耗时操作。为了避免界面卡顿&#xff0c;你决定使用后台线程来处理任务。然而&#xff0c;当你在后台线程中尝试更新UI控件时&#xff0c;程序突然崩溃了。这是为什么呢&#xff1…

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…