作者:来自 Elastic Kathleen_DeRusso
查询规则(Query rules)为用户提供了一种对特定查询进行细粒度控制的方法。目前,查询规则的功能允许你将你选择的搜索结果固定在结果集的顶部,和/或根据上下文查询数据从结果集中排除特定文档。
这种类型的查找调整控制有几种用例。其中包括将业务规则(例如促销活动)应用于你的搜索结果或 “修复” 高度可见的问题查询。
查询规则可以使用规则查询(rule query)访问,并且很快将作为与 RRF 等重新排名策略配合使用的检索器(retriever)提供!
这篇文章是关于如何知道你的查询规则是否按预期工作。
让我们从一个非常简单的示例开始,其中包含一个固定规则和一个排除规则:
PUT my-index/_doc/my-pinned-doc
{
"title": "My pinned document"
}
PUT my-index/_doc/my-excluded-doc
{
"title": "My excluded document"
}
PUT _query_rules/my-ruleset
{
"rules": [
{
"rule_id": "my-pinned-rule",
"type": "pinned",
"criteria": [
{
"type": "exact",
"metadata": "match",
"values": [
"pinned"
]
}
],
"actions": {
"ids": [
"my-pinned-doc"
]
}
},
{
"rule_id": "my-exclude-rule",
"type": "exclude",
"criteria": [
{
"type": "exact",
"metadata": "match",
"values": [
"exclude"
]
}
],
"actions": {
"ids": [
"my-excluded-doc"
]
}
}
]
}
当查询规则启动时,我们仅支持 pinned 规则。此规则保证指定的文档出现在搜索结果的顶部,无论它们是否会在原始查询中返回。因此,验证规则是否应用的解决方法可能是发出 match_none 查询作为规则查询的 organic 部分,确保任何返回的文档都是由于规则匹配而固定的命中。
对于上述示例,这可能看起来像:
POST my-index/_search
{
"query": {
"rule": {
"organic": {
"match_none": {}
},
"ruleset_ids": [
"my-ruleset"
],
"match_criteria": {
"match": "pinned"
}
}
}
}
此后,我们添加了 exclude 规则,用于识别结果集中永远不应返回的文档。
同样,对于 exclude 规则,你可以针对 ids 查询运行规则查询,或者针对非常小的数据集运行 match_all 查询:
POST my-index/_search
{
"query": {
"rule": {
"organic": {
"ids": {
"values": [
"my-excluded-doc"
]
}
},
"ruleset_ids": [
"my-ruleset"
],
"match_criteria": {
"match": "exclude"
}
}
}
}
这不是最好的解决方案,因此我们在 Elasticsearch 8.16 版中引入了一个新的查询规则测试器 API 调用(query rule tester API call),它允许你确定哪些规则符合特定条件,以及它们的应用顺序。以下是如何调用它的示例:
POST _query_rules/my-ruleset/_test
{
"match_criteria": {
"match": "exclude"
}
}
该调用将返回以下响应:
{
"total_matched_rules": 1,
"matched_rules": [
{
"ruleset_id": "my-ruleset",
"rule_id": "my-exclude-rule"
}
]
}
这在未来也同样适用,即使添加了新的规则,这些规则不会从搜索结果中选择或排除文档。
祝你愉快地管理搜索结果!
原文:Dec 11th, 2024: [EN] Troubleshooting query rules - Advent Calendar - Discuss the Elastic Stack