我有带有标签列表的文档:
{ “field”:{ “标签”: [ “ foo”, “酒吧”, “巴兹” ], “名称”: [ “文件一” ], “ description”:“优良的第一份文件”, “ id”:1 } }, { “字段”:{ “标签”: [ “ foo”, “dog” ], “name”: [ “文件二” ], “ description”:“优良的第二份文件”, “ id”:2 } }
我有一个术语列表:
[“ foo”,“ bar”,“ qux”,“ zip”,“ baz”]
我想要一个查询,该查询将返回在术语列表中具有标签的文档-但没有其他术语。
因此,鉴于上述列表,查询将返回Document One,但 不会 返回Document Two(因为查询中的术语dog不在术语列表中。)
Document One
Document Two
dog
我尝试使用not terms过滤器进行查询,如下所示:
not
terms
POST / documents / _search?size = 1000 { “字段”:[ “ID”, “名称”, “标签” ], “过滤器”:{ “不”:{ “过滤器”:{ “布尔”:{ “一定不”: { “条款”:{ “标签”: [ “ foo”, “酒吧”, “ qux”, “压缩”, “巴兹” ] } } } } } } }
但这没有用。
在给定的术语列表的情况下,如何创建一个查询,该查询将匹配仅包含列表中的术语而没有其他术语的文档?换句话说,所有文档都应包含标签列表,这些标签是所提供术语列表的子集。
您可以使用脚本过滤器来检查数组项是否在文档中具有标签数组的所有值。我建议您制作一个单独的groovy文件或纯javascript文件,将其放在config/ scripts / folderToYourScript中,并在您的查询中使用filter: { script : {script_file:file } }
filter: { script : {script_file:file } }
在脚本文件中时,您可以使用循环来检查需求