假设我有一个带有标签的弹性搜索索引的文档:["red", "blue"]
我搜索了标签:["red"]
在我当前的实现(terms query)中,我带回了结果,但是根据新的业务规则,我们只想返回“所有标记”匹配。
例如,给定文档和使用tags
过滤的搜索:
["red"] # => no match
["red", "blue", "green"] # => no match
["red", "blue"] # => match
["blue", "red"] # => match
在elasticsearch中是否有适当的过滤器?
答案 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"}
}
]
}
}
您必须明确排除您不想匹配的所有内容。