【问题标题】:Can I filter for tags that must all be present? (not just one)我可以过滤所有必须存在的标签吗? (不止一个)
【发布时间】:2013-10-11 16:03:56
【问题描述】:

假设我有一个在 elasticsearch 中使用标签索引的文档:["red", "blue"]

我搜索了标签:["red"]

在我当前的实现 (terms query) 中,我返回了结果,但是使用新的业务规则,我们只想返回一个“所有标签”匹配。

例如,给定文档和使用tags 过滤的搜索:

["red"]                    # => no match
["red", "blue", "green"]   # => no match
["red", "blue"]            # => match
["blue", "red"]            # => match

在 elasticsearch 中是否有合适的过滤器?

【问题讨论】:

    标签: search elasticsearch filtering


    【解决方案1】:

    我认为您可以使用 QueryStringQueryBuilder 并将默认运算符设置为“AND”(因为默认情况下它的 OR)

    【讨论】:

    • 我尝试将术语查询执行模式更改为“AND”,但不幸的是它似乎不起作用。我认为整体构建器可能无法正常工作,因为我的标签都在模型级别的“标签”内(顺便说一下,在轨道上使用轮胎和红宝石)
    【解决方案2】:

    Script Filter(可能不是最佳的,但有效)

    • fieldName 在这种情况下是“标签”,即索引字段的名称。
    • searchValues 是我想要完全匹配的一系列术语。

    都作为参数传入

            all_values_mvel_script = """
    fieldValues = doc[fieldName].values;
    if (fieldValues.empty) {
        return false;
    }
    foreach (value : fieldValues) {
        if (!searchValues.contains(value)) {
            return false;
        }
    }
    return true;
            """
    

    上述脚本作为字符串传递给脚本类型过滤器。这在我的测试中表现良好,但无法缓存,维护起来更痛苦

    【讨论】:

      【解决方案3】:

      使用布尔查询。像这样的东西应该可以解决问题。

      {
          "bool": {
              "must": [
                  {
                      "term": {"tag":"blue"}
                  },
                  {
                      "term": {"tag":"red"}
                  }
              ],
              "should": [],
              "must_not": [
                  {
                      "term": {"tag":"green"}
                  }
              ]
          }
      }
      

      您必须明确排除您不想匹配的所有内容。

      【讨论】:

      • 谢谢 你有什么建议让它动态化吗?对于我的示例来说,这有点“硬编码”
      • 我没有看到任何简单的方法来做到这一点。在数据库中,您可以使用连接的组合来执行此操作。在弹性搜索中,基本上您匹配的是特定的、指定的术语,而您的问题是不知道完整的术语集。您可能可以使用自定义分数查询来伪造某些东西,并且只需将所有具有 >2 标记的所有内容都排名为 0,但您无法使用简单的布尔逻辑来表达这一点。
      • 我刚刚想到的另一个选项,因为您要查询标签的精确和特定组合,是以不同的方式索引:只需对标签进行排序,将它们连接成一个字符串,然后索引他们在非分析领域。然后,您可以在整个字段上进行完全匹配。也有一点技巧,但它可能对你有用。
      • 感谢您继续思考这个问题。我不确定单个字段字符串是否适用于重新排序的术语(请参阅有问题的最后 2 个匹配示例)。除非发生隐式排序?
      • 您可以编写一个分析器,对它们进行一致的排序(例如对它们进行排序)。
      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2010-11-15
      • 2016-11-12
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2016-11-13
      • 2016-09-08
      相关资源
      最近更新 更多