
你知道吗,查询规则可以无缝配合语义搜索使用?通过将查询规则作为一个检索器,结合复杂逻辑(如RRF或语义重排序),可以更轻松地实现强大的搜索功能。
查询规则是我们相关性工具箱中的重要工具。
规则检索器是一个复合检索器,可以在检索器树中链式连接复杂行为,并且操作顺序很重要。
就像规则查询一样,规则检索器基于已经定义的查询规则集。你可以使用查询规则 CRUD API创建规则集。
实际应用中是怎样的呢?下面是一个简单的查询规则集示例,当 query_string 参数匹配 puggles 时,固定文档 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"
}
}
}
}
}
}
}在这个例子中,我们定义了一个标准的子检索器,它只是一个简单的 query_string 查询。这与当前的规则查询工作方式非常相似,指定一个常规查询。检索器将返回应用了匹配规则的搜索结果列表。
简单的例子并没有展示查询规则的真正威力:在语义搜索之上应用业务规则。这可以帮助返回对促销活动重要的结果,或者修正语义搜索未能返回我们期望结果的查询。
我们可以使用相同的检索器框架,通过在定义的标准检索器下指定这些查询,来执行语义搜索的查询规则。以下是使用 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?"
}
}
}
}
}
}
}同样,当定义为 standard 检索器时,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,但由于检索器树中的操作顺序,这样做不会如预期那样工作。当你运行规则检索器时,为确保所有规则都按预期应用,规则检索器必须始终是最外层/顶层检索器。
同样,你可以将查询规则与语义重排序结合使用。以下是使用我们 Elastic 重排序器的示例:
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 和 lexical text 搜索查询与 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?"
}
}
}
}
}查询规则不仅仅是用来固定文档的!在 Elasticsearch 8.16 中,我们引入了一种新的规则类型,排除。这允许你指定一些永远不希望出现在搜索结果中的文档,以及一些希望固定在搜索结果顶部的文档。
排除规则的使用场景包括但不限于:
这是一个包含固定和排除规则的查询规则集示例:
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"
]
}
}
]
}规则根据匹配条件应用,因此一个规则检索器可以在同一个查询中同时匹配固定和排除的文档。
当结合语义搜索和重排序策略时,rule 检索器非常强大,因为它在利用语义搜索的同时提供了对搜索结果的精细控制。规则检索器已经在我们的无服务器服务中可用,并将在 8.17.0 及以上的 Stack 版本中可用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。