Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换

作者:来自 Elastic Mayya Sharipova

解释 span 查询如何成为真正的位置查询以及如何从 span 查询过渡到它们。

长期以来,Span 查询一直是有序和邻近搜索的工具。这些查询对于特定领域(例如法律或专利搜索)尤其有用。但相对较新的 Interval 查询实际上更适合这项工作。与 Span 查询不同,Interval 查询是真正的位置查询,仅根据位置邻近性对文档进行评分(下文将对此进行扩展)。

从 Elasticsearch v8.16 开始,我们将 Interval 查询与 Span 查询进行了对比。具体来说:

  • Interval 查询现在支持 “range” 和 “regexp” 规则。
  • 与 Span 查询类似的基于多个术语的间隔规则可以扩展到 indices.query.bool.max_clause_count 术语,而不是之前的 128 这个值。

我们未来的计划是弃用 Span 查询,转而使用 Interval 查询,它涵盖相同的功能,但以更用户友好的方式进行。

更多阅读:Elasticsearch:使用 intervals query - 根据匹配项的顺序和接近度返回文档。

Interval 查询相对于 span 查询的优势

Interval 查询根据匹配术语的顺序和接近度对文档进行排名。Interval 查询的一些优势:

  • 真正的位置(positional)查询
  • 基于学术研究,基于最小区间语义(minimal interval semantics )论文,具有经过验证的算法,这些算法与位置数量成线性关系
  • 语法更简单
  • 速度稍快(无需根据语料库统计数据计算分数)
  • 能够使用脚本进行专门的用例

Interval 查询是真正的位置查询,在对文档进行评分时仅考虑位置信息(分数与 interval 长度成反比)。这与 span 查询不同,跨度查询还考虑 TF-IDF 等标准指标。以下示例说明了区间查询如何进行更好的排名。

PUT docs
{"mappings": {"properties": {"content": {"type": "text"}}}
}PUT docs/_doc/1
{"content" : "She sells beautiful seashells by the seashore, their smooth shapes shining in the sun, catching the light with every curve. The girl’s bright smile is just as inviting, drawing people in as they stop to admire the shells, each one a little piece of the ocean she loves. Her gentle voice, like the sound of the waves, adds to the peaceful charm of the moment."
}PUT docs/_doc/2
{"content" : "She plays; her father sells seashells. "
}

我们希望找到 “she” 一词与 “sells” 一词相近的文档。所需的排名将返回第一个文档,然后是第二个文档,因为这两个词在第一个文档中出现得比在第二个文档中更接近。

但是,如果我们运行 Span 查询,我们将得到不同的排名:[doc2, doc1],因为 Span 查询除了邻近度计算外,还结合了语料库统计数据,例如 TF 和 IDF 指标,这些指标会仅根据邻近度扭曲排名。

GET docs/_search?explain=true
{"query": {"span_near": {"clauses": [{"span_term": {"content": "she"}},{"span_term": {"content": "sells"}}],"slop": 10,"in_order": true}}
}

相比之下,区间查询根据接近度计算分数,而不考虑语料库统计信息和文档长度。我们将得到所需的排名:[doc1,doc2]。

GET docs/_search?explain=true
{"query": {"intervals": {"content": {"match": {"query": "she sells","max_gaps": 10,"ordered" : true}}}}
}

这使得 interval 查询成为真正邻近查询的理想选择。

Interval 查询允许提取邻近度得分作为整体相关性得分的信号。它们经过优化,可以与其他相关性信号(如 BM25)混合使用,例如:

GET docs/_search
{"query": {"bool": {"must": {"match": {"content": {"query": "she sells","boost": "{{bm25_boost}}"}}},"should": {"intervals": {"content": {"match": {"query": "she sells","max_gaps": 10},"boost": "{{proximity_boost}}"}}}}}
}

请注意上面的两个参数:bm25_boost, proximity_boost。它们的用法是 search template。你可以分别使用不同的权重来进行调节。

请注意,这也可以应用于重新评分:我们可以单独使用 BM25 进行第一次传递,然后添加具有 BM25 + interval 组合的重新评分器。

请注意,如果我们需要通过 BM25 和接近度对 Span 查询在匹配和评分中的行为进行建模,我们可以通过将 interval 查询与 BM25 查询组合为布尔查询中的必备子句,并设置适当的 boosts 来实现。

过渡指南

下面我们展示了从以下 Span 查询过渡到等效 Interval 查询的方法:

  • span_containing
  • span_field_masking
  • span_first
  • span_multi
  • span_near
  • span_not
  • span_or
  • span_term
  • span_within

PUT parks
{"mappings": {"properties": {"park": {"type": "text"},"park_rules": {"type": "text"}}}
}PUT parks/_doc/1
{"park" : "Sunny Meadows Park","park_rules" : "Children are encouraged to enjoy our playground equipment, including slides, swings, and climbing structures. Feeding the ducks and fish in the pond is allowed, but only with approved feed available at the park office. Children are not permitted to climb trees or enter the park's fountains and water features. Please do not bring glass containers, sharp objects, or personal sports equipment into the park."
}PUT parks/_doc/2
{"park" : "Greenwood Forest Park","park_rules" : "Children are welcome to explore our nature trails, participate in organized activities, and use the designated picnic areas. Picking flowers, disturbing wildlife, or leaving the designated trails is not allowed. Children must be accompanied by an adult when using the park's grills and fire pits. Please refrain from bringing pets, bicycles, or scooters into the park."
}PUT parks/_doc/3
{"park" : "Happy Haven Playground","park_rules" : "Children can enjoy our sandbox, jungle gym, and seesaws, as well as participate in organized games and activities. Running, shouting, or playing rough games near the playground equipment is not permitted. Children must be supervised by an adult at all times and should use the equipment according to their age and size. Please do not bring food, drinks, or chewing gum into the playground area."
}PUT parks/_doc/4
{"park" : "Lakeside Recreation Park","park_rules" : "Children can enjoy fishing at the lake with an adult, using the sports fields for organized games, and playing in the designated play areas. Swimming, wading, or boating in the lake is strictly prohibited. Children must wear appropriate safety gear when using the sports fields and play equipment. Please do not bring alcohol, tobacco products, or illegal substances into the park."
}PUT parks/_doc/5
{"park" : "Adventure Land Park","park_rules" : "Children are encouraged to use our zip lines, ropes courses, and climbing walls under adult supervision and with proper safety equipment. Running, pushing, or engaging in horseplay near the adventure equipment is not allowed. Children must follow all height, weight, and age restrictions for each activity. Please do not bring personal items, such as cell phones or cameras, onto the adventure equipment."
}

SPAN NEAR

GET parks/_search
{"query": {"span_near": {"clauses": [{"span_term": {"park_rules": "prohibited"}},{"span_term": {"park_rules": "swimming"}}],"slop": 10,"in_order": false}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"match": {"query": "swimming prohibited","max_gaps": 10,"ordered" : false  }}}},"highlight": {"fields": {"park_rules": {}}}
}

SPAN FIRST

GET parks/_search
{"query": {"span_first": {"match": {"span_term": { "park_rules": "sandbox" }},"end": 5}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals" : {"park_rules" : {"match" : {"query" : "sandbox","filter" : {"script" : {"source" : "interval.end < 5"}}}}}},"highlight": {"fields": {"park_rules": {}}}
}
 

SPAN OR

GET parks/_search
{"query": {"span_or" : {"clauses" : [{ "span_term" : { "park_rules" : "prohibited" } },{ "span_near": {"clauses": [{"span_term": {"park_rules": "not"}}, {"span_term": {"park_rules": "allowed"}}], "in_order": true}},{ "span_near": {"clauses": [{"span_term": {"park_rules": "not"}}, {"span_term": {"park_rules": "permitted"}}], "in_order": true}}]}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals" : {"park_rules" : {"any_of" : {"intervals" : [{ "match" : { "query" : "prohibited"} },{ "match" : { "query" : "not allowed", "ordered" : true } },{ "match" : { "query" : "not permitted", "ordered" : true } }]}}}},"highlight": {"fields": {"park_rules": {}}}
}

SPAN CONTAINING

GET parks/_search
{"query": {"span_containing": {"little": {"span_term": {"park_rules": "sports"}},"big": {"span_near": {"clauses": [{"span_term": {"park_rules": "children"}},{"span_term": {"park_rules": "park"}}],"slop": 50,"in_order": false}}}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"match": {"query": "children park","max_gaps": 50,"filter" : {"containing" : {"match" : {"query" : "sports"}}}}}}},"highlight": {"fields": {"park_rules": {}}}
}

SPAN WITHIN

GET parks/_search
{"query": {"span_within": {"little": {"span_term": {"park_rules": "sports"}},"big": {"span_near": {"clauses": [{"span_term": {"park_rules": "children"}},{"span_term": {"park_rules": "park"}}],"slop": 50,"in_order": false}}}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"match": {"query": "sports","filter" : {"contained_by" : {"match" : {"query" : "children park","max_gaps": 50}}}}}}},"highlight": {"fields": {"park_rules": {"number_of_fragments": 0}}}
}

SPAN NOT

GET parks/_search
{"query": {"span_not": {"include": {"span_term": { "park_rules": "allowed" }},"exclude": {"span_near": {"clauses": [{ "span_term": { "park_rules": "not" } },{ "span_term": { "park_rules": "allowed" } }],"slop": 0,"in_order": true}}}},"highlight": {"fields": {"park_rules": {}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"match": {"query": "allowed","filter": {"not_contained_by": {"match": {"query": "not allowed","max_gaps": 0,"ordered" : true}}}}}}},"highlight": {"fields": {"park_rules": {}}}
}

SPAN_MULTI

wildcard

GET parks/_search
{"query": {"span_multi": {"match": {"wildcard": {"park_rules": {"value": "sand*" }}}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"wildcard": {"pattern": "sand*"}}}}
}

fuzzy

GET parks/_search
{"query": {"span_multi": {"match": {"fuzzy": {"park_rules": {"value": "sandbo" }}}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"fuzzy": {"term": "sandbo"}}}}
}

prefix

GET parks/_search
{"query": {"span_multi": {"match": {"prefix": {"park_rules": {"value": "sandbo" }}}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"prefix": {"prefix": "sandbo"}}}}
}

regexp

GET parks/_search
{"query": {"span_multi": {"match": {"regexp": {"park_rules": {"value": "sand.*" }}}}}
}GET parks/_search
{"query": {"intervals": {"park_rules": {"regexp": {"pattern": "sand.*"}}}}
}

range

GET parks/_search
{"query": {"span_multi": {"match": {"range": {"park": {"gte" : "a","lte": "h"}}}}}
}GET parks/_search
{"query": {"intervals": {"park": {"range": {"gte" : "a","lte" : "h"}}}}
}

span_field_masking

使用 Intervals 的 use_field

GET parks/_search
{"query": {"span_near": {"clauses": [{"span_term": {"park_rules": "nature"}},{"span_field_masking": {"query": {"span_term": {"park_rules.stemmed": "trail"}},"field": "park_rules" }}],"slop": 5}}
}GET parks/_search
{"query": {"intervals" : {"park_rules" : {"all_of" : {"ordered" : true,"max_gaps" : 5, "intervals" : [{"match" : {"query" : "nature"}},{"match" : {"query" : "trail","use_field" : "park_rules.stemmed"}}]}}}}
}

结论

间隔查询是进行真正位置搜索的强大工具。从 8.16 版本开始,使用扩展功能进行尝试。

准备好自己尝试了吗?开始免费试用。

想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训何时举行!

原文:Interval queries: why they are true positional queries, and how to transition from Span - Search Labs

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

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

相关文章

IoTDB时序数据库使用

简介 Apache IoTDB 是一款低成本、高性能的物联网原生时序数据库。它可以解决企业组建物联网大数据平台管理时序数据时所遇到的应用场景复杂、数据体量大、采样频率高、数据乱序多、数据处理耗时长、分析需求多样、存储与运维成本高等多种问题。 IoTDB官网 1. 连接数据库 官方…

河北冠益荣信科技公司洞庭变电站工程低压备自投装置的应用

摘 要&#xff1a;随着电力需求增长&#xff0c;供电可靠性变得至关重要&#xff0c;许多系统已有多回路供电。备用电源自动投入装置能提升供电可靠性&#xff0c;它能在主电源故障时迅速切换到备用电源。本文介绍的AM5-DB低压备自投装置&#xff0c;为洞庭变电站提供多种供电方…

STM32实现IAP串口升级含源码(HAL库)

文章目录 一. 关于IAP升级二. IAP升级的分类二. IAP升级原理2.1 正常启动流程2.2 IAP启动流程 三. Ymodem协议3.1 传输过程3.2 帧命令3.3 起始帧3.4 数据帧3.5 结束帧 四. IAP代码实现4.1 Boot 程序4.2 App 程序4.3 展示效果 五. Demo源码六. Qt 上位机 一. 关于IAP升级 IAP&am…

【Hello World 】

【Hello World 】! C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 几乎每一个程序员都是从Hello World!开始自己的程序人生&#xff0c;作为一个初学编程的小朋友&#xff0c;也需要先编程来输出Hello Wo…

LabVIEW程序员赚钱不仅限于上班

LabVIEW程序员拥有多种途径来实现财富增值&#xff0c;而不仅仅局限于传统的全职工作。以下是一些他们可以利用自身技能和专业知识实现更高财务收益的方法&#xff1a; 1. 专注领域的自由职业与合同工作 制造、科研、医疗技术等行业都需要LabVIEW的专业知识。通过自由职业&…

vue3项目中el-tooltip实现内容溢出时再显示,并设置tip的最大宽度

html代码 <el-tooltip :disabled"!textIsOverflow" placement"top"><template #content><div class"tooltip-div">tootip的内容</div></template><div class"textOverflow" ref"textRef"…

文案语音图片视频管理分析系统-视频矩阵

文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称&#xff1a; 智驭视频矩阵深度分析系统&#xff08;SmartVMatrix&#xff09; 主要功能&#xff1a; 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…

安防被动红外和主动红外

被动红外探测器是依靠被动的吸收热能动物活动时身体散发出的红外热能进行报警的&#xff0c;也称热释红外探头&#xff0c;其探测器本身是不会发射红外线的。 被动红外探测器中有2个关键性元件&#xff0c;一个是菲涅尔透镜&#xff0c;另一个是热释电传感器。**自然界中任何高…

Windows下将网盘挂载到本地使用(Docker+AList+RaiDrive)

文章目录 安装安装Docker安装Alist安装RaiDrive 安装 安装Docker Windows下安装Docker网上有很多教程&#xff0c;也可以参考我写的博客链接 3.1章节 安装Alist 官网 “切换中文”并找到“使用指南” ”安装“–>"使用Docker” 打开cmd执行如下命令启动容器 do…

C语言 | Leetcode C语言题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; typedef struct {unsigned long long val;UT_hash_handle hh; } Hash;typedef struct {Hash *hash;int n_rows;int n_cols; } Solution, SL;Solution* solutionCreate(int n_rows, int n_cols) {SL *obj malloc(sizeof(SL));obj->hash …

C++之多态(上)

C之多态 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…

EtherCAT转ModbusTCP相关技术

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 MS-GW15 概述 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 PLC 扩展的集成解决方案&#xff0c;可以轻松容易将 Modbu…

kafka相关面试题

文章目录 什么是消息中间件&#xff1f;kafka 是什么&#xff1f;有什么作用&#xff1f;kafka 的架构是怎么样的&#xff1f;Kafka Replicas是怎么管理的&#xff1f;如何确定当前能读到哪一条消息&#xff1f;生产者发送消息有哪些模式&#xff1f;发送消息的分区策略有哪些&…

.NET Core WebApi第7讲:项目的发布与部署

一、理解 前端跟后端拿数据&#xff0c;然后在前端页面中展示&#xff0c;就是我们要完成的事情。 把前端跟后端开发好之后&#xff0c;我们需要落地部署&#xff0c;这个时候就需要一个服务器。 服务器就是一台电脑&#xff0c;只要windows里面有一个叫IIS的管理器。 二、项目…

JAVA题目笔记(十一)多态+带有抽象类/接口的JavaBean类

一、多态定义方法并调用子类特有方法 public class Animal {private String colour;private int age;public Animal(){}public Animal(int age,String colour){this.ageage;this.colourcolour;}public String getColour() {return colour;}public void setColour(String colour…

【Visual Studio】解决 CC++ 控制台程序 printf 函数输出中文和换行符显示异常

问题描述 C&C 控制台程序 printf 函数输出中文和换行符 \n 显示异常。 #include <stdio.h>int main() {int choice;printf("菜单:\n");printf("1. 选项一\n");printf("2. 选项二\n");printf("3. 选项三\n");printf("…

从线性代数到unity mvp矩阵

坐标变换&#xff1a;矩阵是一种线性空间变换的描述&#xff08;矩阵的列向量&#xff0c;是坐标变换后的基向量&#xff09;。 如: 如上图,即向量(-1,2)在经过由基底x轴:(1, -2) ,y轴:(3, 0)组成的矩阵变换后得到向量(5,2) 实际上就是-1倍的x轴:(1, -2)加上2倍的y轴:(3,…

【ShuQiHere】 如何理解渐进符号及其应用:大 O、大 Ω 和大 Θ

List item &#x1f4d8; 【ShuQiHere】 &#x1f680; 在算法复杂度分析中&#xff0c;渐进符号&#xff08;Asymptotic Notation&#xff09;是必不可少的工具&#xff0c;帮助我们估计算法的时间和空间需求&#xff0c;特别是当输入规模非常大时。这篇文章将为大家详细介绍…

Docker篇(安装容器)

目录 一、安装mysql容器 1. 拉取mysql镜像 2. 创建并运行容器 二、安装Tomcat容器 1. 拉取镜像 2. 创建并运行容器 三、安装Nginx容器 1. 拉取镜像 2. 创建并运行容器 四、安装Redis容器 1. 拉取镜像 2. 创建并运行容器 五、安装RabbitMQ 1. 拉取镜像 2. 创建并运…