1

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

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

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

例如,给定文档和使用以下内容过滤的搜索tags

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

在弹性搜索中是否有适当的过滤器?

4

3 回答 3

0

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

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

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

于 2013-10-13T13:09:12.300 回答
0

脚本过滤器(可能不是最佳的,但有效)

  • 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;
        """

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

于 2013-10-11T21:22:18.543 回答
0

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

于 2013-10-11T20:17:13.470 回答