一尘不染

仅具有与术语列表相交但不与其他术语相交的术语的Elasticsearch文档

elasticsearch

我有带有标签列表的文档:

    {
       “field”:{
          “标签”: [
               “ foo”,
               “酒吧”,
               “巴兹”
          ],
          “名称”: [
             “文件一”
          ],
          “ description”:“优良的第一份文件”,
          “ id”:1
       }
    },
    {
       “字段”:{
          “标签”: [
               “ foo”,
               “dog”
          ],
          “name”: [
             “文件二”
          ],
          “ description”:“优良的第二份文件”,
          “ id”:2
       }
    }

我有一个术语列表:

    [“ foo”,“ bar”,“ qux”,“ zip”,“ baz”]

我想要一个查询,该查询将返回在术语列表中具有标签的文档-但没有其他术语。

因此,鉴于上述列表,查询将返回Document One,但 不会 返回Document Two(因为查询中的术语dog不在术语列表中。)

我尝试使用not terms过滤器进行查询,如下所示:

    POST / documents / _search?size = 1000
    {
       “字段”:[
          “ID”,
          “名称”,
          “标签”
       ],
       “过滤器”:{
           “不”:{
               “过滤器”:{
                   “布尔”:{
                       “一定不”: {
                          “条款”:{
                             “标签”: [
                                “ foo”,
                                “酒吧”,
                                “ qux”,
                                “压缩”,
                                “巴兹”
                             ]
                          }
                       }
                   }
               }
           }
       }
    }

但这没有用。

在给定的术语列表的情况下,如何创建一个查询,该查询将匹配仅包含列表中的术语而没有其他术语的文档?换句话说,所有文档都应包含标签列表,这些标签是所提供术语列表的子集。


阅读 213

收藏
2020-06-22

共1个答案

一尘不染

您可以使用脚本过滤器来检查数组项是否在文档中具有标签数组的所有值。我建议您制作一个单独的groovy文件或纯javascript文件,将其放在config/ scripts / folderToYourScript中,并在您的查询中使用filter: { script : {script_file:file } }

在脚本文件中时,您可以使用循环来检查需求

2020-06-22