小编典典

Elasticsearch数组属性必须包含给定的数组项

elasticsearch

我的文件看起来像:

{
    "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是唯一匹配项?


阅读 607

收藏
2020-06-22

共1个答案

小编典典

您需要通过添加到过滤器来将
执行模式 设置为 “和” ,以便所有术语都必须包含在文档中才能被视为匹配项"execution": "and"``terms

GET _search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "terms": {
               "tags": [
                  "tag1",
                  "tag3"
               ],
               "execution": "and"
            }
         }
      }
   }
}

这实际上bool must与使用所有术语的合集构建过滤器相同,但形式更紧凑。

2020-06-22