我可以过滤必须全部存在的标签吗? (不只是一个)

时间:2013-10-11 16:03:57

标签: search elasticsearch filtering

假设我有一个带有标签的弹性搜索索引的文档:["red", "blue"]

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我认为你可以使用QueryStringQueryBuilder并将默认运算符设置为'AND'(因为默认情况下它是OR)

答案 1 :(得分:0)

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

    在这种情况下,
  • fieldName将是“tag”,即索引字段的名称。
  • searchValues是我要完全匹配的术语数组。

两者都以params传递

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

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

答案 2 :(得分:0)

使用bool查询。这样的事情可以解决问题。

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

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