haystack apply_filter_policy 和 FilterPolicy.MERGE 对新过滤器语法的处理不正常,

kcrjzv8t  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(44)

您的功能请求是否与问题相关?请描述。

当前的 apply_filter_policy 函数在我们检索系统中仅支持基于字典的旧版过滤器。这个限制对于新过滤器语法来说变得有问题。例如,我们无法使用当前实现合并以下过滤器:
{"field": "meta.name", "operator": "==", "value": "John"}
{"field": "meta.year", "operator": "==", "value": "2022"}

描述您希望的解决方案

更新 apply_filter_policy 函数以支持旧版过滤器和新过滤器格式的合并功能。该函数应:
接受旧版和新版过滤器作为 init_filtersruntime_filters 的输入。
根据 FilterPolicy 为两种格式正确地合并(或替换)过滤器。

描述您考虑过的替代方案

没有考虑过

附加上下文

这个更改对于改进处理旧版和新版过滤器以及正确应用 FilterPolicy 至关重要。

svdrlsy4

svdrlsy41#

@julian-risch @mrm1001 这个是2.3.0最终版本所需的,cc @sjrl

nue99wik

nue99wik2#

我拥有最多的上下文来修复这个问题,@sjrl将进行审查。

ajsxfq5m

ajsxfq5m3#

所以我认为有三个基本场景我们可能想要涵盖:

  1. 将两个比较过滤器组合在一起,其中需要由用户提供逻辑运算符。例如,
comparison_filter_1 = {"field": "meta.name", "operator": "==", "value": "John"}
comparison_filter_2 = {"field": "meta.year", "operator": "==", "value": "2022"}
user_provided_logical_filter = "AND"
combined_filter = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.name", "operator": "==", "value": "John"},
      {"field": "meta.year", "operator": "==", "value": "2022"}
    ]
}
  • 在这个场景中,我们应该考虑的一个边缘情况是,如果两个过滤器都有相同的字段,我们应该如何处理。例如,如果字段都是 meta.name,我们应该使用哪一个。
  1. 将比较过滤器和逻辑过滤器组合在一起
  • 在这个场景中,我认为用户提供的逻辑过滤器仍然应该被提供。也许如果它与现有的逻辑运算符匹配,我们应该将它们合并,但我不确定当我们的逻辑运算符不同时应该如何处理。
comparison_filter = {"field": "meta.type", "operator": "==", "value": "pdf"}
logical_filter = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.name", "operator": "==", "value": "John"},
      {"field": "meta.year", "operator": "==", "value": "2022"}
    ]
}
user_provided_logical_filter = "AND"
combined_filter = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.name", "operator": "==", "value": "John"},
      {"field": "meta.year", "operator": "==", "value": "2022"},
      {"field": "meta.type", "operator": "==", "value": "pdf"}
    ]
}
  1. 组合两个逻辑过滤器
  • 我不太确定在这个情况下如何完全处理所有情况。我相信如果两个逻辑过滤器都有 "AND" 运算符,将它们合并应该是没问题的。然而,如果其中一个是 "OR",另一个是 "AND",我不确定它们应该如何组合,在这里得到一些建议将是非常有帮助的。
logical_filter_1 = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.type", "operator": "==", "value": "pdf"},
      {"field": "meta.month", "operator": "==", "value": "April"}
    ]
}
logical_filter_2 = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.name", "operator": "==", "value": "John"},
      {"field": "meta.year", "operator": "==", "value": "2022"}
    ]
}
combined_filter = {
    "operator": "AND",
    "conditions": [
      {"field": "meta.name", "operator": "==", "value": "John"},
      {"field": "meta.year", "operator": "==", "value": "2022"},
      {"field": "meta.type", "operator": "==", "value": "pdf"},
      {"field": "meta.month", "operator": "==", "value": "April"}
    ]
}

相关问题