我的文件看起来像:
{ "tags" => [ "tag1", "tag2", ], "name" => "Example 1" } { "tags" => [ "tag1", "tag3", "tag4" ], "name" => "Example 2" }
我现在想要的是进行术语搜索,其中给定数组可能看起来像:
[tag1, tag3]
预期命中应在哪里:
{ "tags" => [ "tag1", "tag3", "tag4" ], "name" => "Example 2" }
但是,当我执行类似的查询时:
GET _search { "query": { "filtered": { "query": { "match_all": {} }, "filter": { "bool": { "must": [ { "terms": { "tags": [ "tag1", "tag3" ] } } ] } } } } }
由于示例1和示例2都包含tag1或tag3,因此获得了“示例1”和“示例2”作为匹配。通过查看文档中的术语,我发现术语实际上是一个包含查询。
在这种情况下,如何在使用tag1和tag3查询时确保示例2是唯一匹配项?
您需要通过添加到过滤器来将 执行模式 设置为 “和” ,以便所有术语都必须包含在文档中才能被视为匹配项"execution": "and"``terms
"execution": "and"``terms
GET _search { "query": { "filtered": { "query": { "match_all": {} }, "filter": { "terms": { "tags": [ "tag1", "tag3" ], "execution": "and" } } } } }
这实际上bool must与使用所有术语的合集构建过滤器相同,但形式更紧凑。
bool must