Elasticsearch:确保业务规则与语义搜索无缝协作

devtools/2024/12/29 8:30:30/

作者:来自 Elastic Kathleen DeRusso

利用查询规则与语义搜索和重新排序相结合的强大功能。

更多阅读:

  • Elasticsearch 8.10 中引入查询规则 - query rules

  • Elasticsearch 查询规则现已正式发布 - query rules

你是否知道查询规则(query rules)可以与语义搜索无缝协作?使用查询规则作为检索器,将语义搜索和复杂逻辑(例如 RRF 或语义重新排序)与查询规则的强大功能相结合从未如此简单。

查询规则是我们相关性工具箱中的一个重要工具,

介绍查询规则检索器

规则检索器(rule retriever)就是所谓的复合检索器(ompound retriever),它允许在检索器树中链接复杂的行为,其中操作顺序很重要。

与规则查询(rule query)一样,规则检索器适用于已定义的查询规则集。你可以使用查询规则 CRUD API(uery rules CRUD API)创建规则集。

这在实践中是什么样子的?这是一个简单查询规则集的示例,当 query_string 参数与 puggles 匹配时,它会固定 id 为 id1 的文档:

PUT /_query_rules/my-ruleset
{"rules": [{"rule_id": "rule1","type": "pinned","criteria": [{"type": "exact","metadata": "query_string","values": [ "puggles" ]}],"actions": {"ids": ["id1"]}}]
}

接下来,这里有一个与该规则集匹配的规则检索器的简单示例:

POST my-index/_search
{"retriever": {"rule": {"match_criteria": {"query_string": "puggles"},"ruleset_ids": ["my-ruleset"],"retriever": {"standard": {"query": {"query_string": {"query": "puggles"}}}}}}
}

在本例中,我们只是定义了一个 standard 子检索器,它是一个简单的 query_string 查询。这与当今规则查询的工作方式非常相似,即通过指定 organic 查询。检索器将返回应用了匹配规则的搜索结果列表。

语义搜索和查询规则

这个简单的例子并没有展示查询规则的真正威力:在语义搜索之上应用业务规则。这可以帮助返回对促销活动很重要的结果,或者简单地 “修复” 语义搜索没有返回我们想要的结果的特定查询。

我们可以使用相同的检索器框架,通过在定义的 standard 检索器下指定这些查询,使用语义搜索执行查询规则。以下是使用 semantic 查询的示例:

POST my-index/_search
{"retriever": {"rule": {"match_criteria": {"query_string": "puggles"},"ruleset_ids": [ "my-ruleset" ],"retriever": {"standard": {"query": {"semantic": {"field": "semantic_field","query": "what is the best pug mix?"}}}}}}
}

类似地,当使用查询规则检索器定义为标准检索器时,sparse_vector 和 knn 查询将无缝地工作。

重新排序和查询规则

你可以通过将 rrf 检索器嵌套在 rule 检索器下,将 RRF 与查询规则结合起来,例如:

POST my-index/_search
{"retriever": {"rule": {"match_criteria": {"query_string": "puggles"},"ruleset_ids": ["my-ruleset"],"retriever": {"rrf": {"retrievers": [{"standard": {"query": {"semantic": {"field": "semantic_field","query": "what is the best pug mix?"}}}},{"standard": {"query": {"query_string": {"query": "puggles"}}}}]}}}}
}

重要提示:顺序在这里很重要。虽然从技术上讲,没有什么可以阻止你在规则检索器上运行 RRF,但由于检索器树中的操作顺序,这将无法按预期工作。当你运行规则检索器时,为了确保所有规则都按预期应用,规则检索器必须始终是最外层/顶层检索器。

同样,你可以将查询规则与语义重新排序(semantic reranking)相结合。以下是使用我们的 Elastic 重新排序器(Elastic reranker)的示例:

POST my-index/_search
{"retriever": {"rule": {"match_criteria": {"query_string": "puggles"},"ruleset_ids": [ "my-ruleset" ],"retriever": {"text_similarity_reranker": {"retriever": {"standard": {"query": {"semantic": {"field": "semantic_field","query": "what is the best pug mix?"}}}}}},"field": "text_field","inference_id": "elastic-rerank-endpoint","inference_text": "what is the best pug mix?"}}
}

综上所述,这里有一个示例,说明如何将语义、sparse_vector、knn 和词汇文本搜索查询与 RRF 和语义重新排序结合起来,并在它们之上应用查询规则:

POST my-index/_search
{"retriever": {"rule": {"match_criteria": {"query_string": "puggles"},"ruleset_ids": [ "my-ruleset" ],"retriever": {"text_similarity_reranker": {"retriever": {"rrf": {"retrievers": [{"standard": {"query": {"sparse_vector": {"field": "sparse_field","inference_id": "elser-endpoint","query": "what is the best pug mix?"}}}},{"standard": {"query": {"knn": {"field": "dense_field","query_vector": [ 1, 2, 3 ],"k": 10,"num_candidates": 100}}}},{"standard": {"query": {"semantic": {"field": "semantic_field","query": "what is the best pug mix?"}}}},{"standard": {"query": {"query_string": {"query": "puggles"}}}}]}},"field": "text_field","inference_id": "elastic-rerank-endpoint","inference_text": "what is the best pug mix?"}}}}
}

组合规则类型

查询规则(query rules)不再只适用于固定文档!在 Elasticsearch 8.16 中,我们引入了一种新的规则类型,即排除。这允许你指定你永远不希望在搜索结果中返回的文档,以及你想要固定在搜索结果顶部的文档。

排除(exclude)规则的用例包括但不限于:

  • 通过删除对查询无用或不相关的结果来修复特定查询中的相关性问题
  • 暂时抑制我们不希望在某个时间之前在任何搜索结果中返回的结果

以下是包含固定(pinned)和排除(excluded)规则的查询规则集的示例:

PUT /_query_rules/my-ruleset
{"rules": [{"rule_id": "rule1","type": "pinned","criteria": [{"type": "exact","metadata": "query_string","values": [ "puggles" ]}],"actions": {"ids": ["id1"]}},{"rule_id": "rule2","type": "exclude","criteria": [{"type": "exact","metadata": "query_string","values": [ "chiweenies" ]}],"actions": {"ids": ["id2"]}}]
}

规则是根据匹配条件应用的,因此规则检索器可以在同一查询中匹配固定文档和排除文档。

试试看吧!

规则检索器在结合语义搜索和重排序策略时表现得异常强大,因为它在利用语义搜索能力的同时,还提供了对搜索结果的精细控制。规则检索器已经在我们的 serverless 服务中提供,并将在 8.17.0 及更高版本的 Stack 中可用。

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

原文:Ensuring business rules work seamlessly with semantic search - Elasticsearch Labs


http://www.ppmy.cn/devtools/145323.html

相关文章

Reactor

文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb,而其他sock,读,写,异常 所以今天写nullptr其实就不太对,添加为空就没办法去响应事件 获…

连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构

共聚聚丙烯是一种多相多组分高分子体系,体系中同时存在多种链组成、序列结构和相结构。研究表明,共聚聚丙烯中除了均聚聚丙烯外,还有乙丙无规共聚物(又称乙丙橡胶,EPR)及不同序列长度的乙丙嵌段共聚物&…

React和Three.js结合-React Three Fiber

简介 React Three Fiber(简称 R3F)是一个用于在 React 中渲染 3D 图形的库,它将 Three.js 与 React 的声明式编程模型结合起来。Three.js 是一个广泛使用的 JavaScript 库,用于在 Web 中创建 3D 场景、动画和互动效果&#xff0c…

React 第十九节 useLayoutEffect 用途使用技巧注意事项详解

1、概述 useLayoutEffect 是useEffect 的一个衍生版本,只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后,浏览器渲染绘制之前执行,这会阻塞浏览器的渲染; useEffect 的执行时机是在组件首次渲染和更新渲染之后…

Python 爱心代码实现动态爱心图案展示

引言 在 Python 中,我们可以利用 tkinter 库来创建有趣的图形界面,本文将为大家分享一段使用 tkinter 库绘制动态爱心图案的代码,并详细介绍其实现逻辑与运行方法。 一、代码功能概述 这段 Python 代码借助 tkinter 库创建了一个窗口&…

Ubuntu下通过Docker部署MySQL服务器

嘿伙计们,今天我们要探讨的话题是如何在Ubuntu系统下通过Docker来部署MySQL服务器。对于那些想要快速搭建MySQL环境的家伙,这绝对是个不错的选择。废话不多说,让我们开始吧! Docker和MySQL简介 首先,让我简要介绍一下…

Webhook 是什么?详解其工作原理

在现代技术中,一切都相互连接,每个应用程序通过许多服务的组合和协调实现无缝工作。这种协调是通过 webhooks 实现的。 Webhooks 是基于 HTTP 的回调函数,其中一个服务使用 API 立即通知另一个服务发生的事件。这就是简单的版本。从技术上讲…

python学opencv读取图像(十四)BGR图像和HSV图像通道拆分

【1】引言 前序已经对BGR图像和HSV图像的转换进行了基本讨论,相关文章链接为: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入-C…