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.mzph.cn/news/884498.shtml

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

相关文章

软件测试模型

软件测试模型是在软件开发过程中&#xff0c;用于指导软件测试活动的一系列方法和框架。这些模型帮助测试团队确定何时进行测试、测试什么以及如何测试&#xff0c;从而确保软件的质量和稳定性。 一 V模型 V模型是一种经典的软件测试模型,它由瀑布研发模型演变而来的测试模型…

Tiling与流水线技术小结

文章目录 Tiling技术Loop TilingAI推理中的Tiling 参考 流水线技术指令周期 参考 Tiling技术 Tiling&#xff08;平铺&#xff09;是一种将大的问题或数据集分解为较小的子问题或子数据集的技术&#xff0c;目的是提高数据局部性和缓存利用率&#xff0c;从而提升程序性能。 在…

Pinia-状态管理

Pinia-状态管理 特点&#xff1a; 1. 轻量和模块化 Pinia 是一个轻量级的状态管理库&#xff0c;支持模块化管理&#xff0c;即可以将应用的状态分成多个 store 以实现更好的组织。使用 Pinia&#xff0c;可以定义多个 store&#xff0c;每个 store 都是一个独立的模块&#x…

openpnp - 在openpnp中单独测试相机

文章目录 openpnp - 在openpnp中单独测试相机概述笔记测试工装相机镜头顶部盖子到目标的距离END openpnp - 在openpnp中单独测试相机 概述 底部相机的位置不合适, 重新做了零件&#xff0c;准备先确定一下相机和吸嘴的距离是多少才合适。 如果在设备上直接实验&#xff0c;那…

网络模型——二层转发原理

网课地址&#xff1a;网络模型_二层转发原理&#xff08;三&#xff09;_哔哩哔哩_bilibili 一、路由交换 网络&#xff1a;用来信息通信&#xff0c;信息共享的平台。 网络节点&#xff08;交换机&#xff0c;路由器&#xff0c;防火墙&#xff0c;AP&#xff09;介质&#…

[watevrCTF 2019]Voting Machine 1-好久不见10

shiiftF12查找字符串&#xff0c;发现flag.text跟踪 from pwn import * i remote("node5.anna.nssctf.cn",22956) address 0x400807 payload ba*(0x28) p64(address) i.sendline(payload) i.interactive()

【Linux】从零开始使用多路转接IO --- select

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念&#xff0c;并…

【Java SE 】String 类 详解!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 1. String 的地位 在Java 编程中&#xff0c;字符串的使用是非常频繁的&#xff0c;而字符串的使用有离不开 String类 &#xff0c;在开发和面试中String类也是非常…

专业130+总400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书。

已经顺利读研一段时间&#xff0c;回顾一下考研还是历历在目。应群里学弟要求&#xff0c;回忆总结一下自己考研经历&#xff0c;希望对大家复习有帮助。总分400&#xff0c;专业课855信号与系统130&#xff08;犯了低级错误&#xff0c;计算出现问题&#xff0c;大家专业好好准…

Self-Lengthen:阿里千问开源提升 LLM 长文本生成能力的训练框架

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构&#xff0c;与单向链表相比可以有更多的应用场景&#xff0c;本文讨论双向链表的基本概念及实现方法&#xff0c;并着重介绍使用GLib的GList实现单向链表的方法及步骤&#xff0c;本文给出了多个实际范例源代码&#xff0c;旨在帮助…

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…

【Java笔记】1-JDK/JRE/JVM是个啥?

JDK、JRE、JVM可以说是入门必须了解的三个词汇 先说全称 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包 JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行环境 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机 再说关系 JVM⊆J…

c语言-进位计数制

文章目录 一、进位计数制是什么&#xff1f;二、c语言1.二进制转十进制2.十进制转二进制 一、进位计数制是什么&#xff1f; 进位计数制简称进制&#xff0c;是人类用于计算数量的基本规则。 可使用数字符号的数目称为基数或底数&#xff0c;基数个数为n个&#xff0c;即可称n…

HTML 基础标签——结构化标签<html>、<head>、<body>

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

【算法赌场】区间合并

区间问题 区间问题的引入 数学上&#xff0c;用两个数字可以确定数轴上的一个区间&#xff0c;较小的数字叫做区间的左端点&#xff0c;也叫区间起点&#xff0c;较大的数字叫做区间的右端点&#xff0c;也叫区间终点。 在算法竞赛中&#xff0c;很多题目是以区间为单位去进行…

给定开始日期时间结束日期时间、间隔得到符合条件的序列pandas.timedelta_range()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 给定开始日期时间 结束日期时间、间隔 得到符合条件的序列 pandas.timedelta_range() [太阳]选择题 以下代码执行后&#xff0c;delta中包含的时间差序列的个数是多少&#xff1f; import pa…

【AI工作流】FastGPT - 深入解析FastGPT工作流编排:从基础到高级应用的全面指南

文章目录 一、工作流编排概述二、FastGPT的节点类型1. 基础功能插件(1) 文本输出(2) 功能调用(3) 工具(4) 外部调用(5) 其他 2. 系统插件3. 团队插件 三、工作流中的流向结语 在当今快速发展的人工智能领域&#xff0c;工作流编排的能力已成为提升用户体验和应用效率的关键因素…

qt QAction详解

1、概述 QAction是Qt框架中的一个抽象类&#xff0c;用于表示用户界面中的一个动作&#xff08;action&#xff09;。这些动作可以绑定到菜单项、工具栏按钮或快捷键上&#xff0c;提供了一种灵活的方式来处理用户交互。QAction不仅包含了动作的名称、图标、提示信息等属性&am…

MRCTF2020:你传你ma呢

文件上传题先判断黑白名单过滤&#xff0c;先传个最简单的木马 这里上传不了php文件&#xff0c;猜测可能是对php文件进行了过滤&#xff0c;将文件改为任意后缀这里改为.abc 还是上传不成功&#xff0c;猜测可能对MIME也做了过滤&#xff0c;将Content-Type更改为image/jpeg再…