在弹性搜索中过滤掉分支

时间:2017-03-01 16:30:08

标签: elasticsearch dsl

我想在弹性搜索2.4中过滤一些数据。 更具体地说,我只想考虑“岛屿”下的记录。标签。
如果我像这样过滤:

filter : [{term: {Artists.Artist.Records.label : "Island"}}] 

我会失去迈尔斯,但保留其他两个,因为他们有一个岛屿标签。这很好,但我想丢失所有无岛记录,但仍保留所有数据。

所以给出:

{
  "Artists": [
    {
      "Artist": "Tom Waits",
      "Records": [
        {
          "id": 1,
          "title": "Rain dogs",
          "label": "Island"
        },
        {
          "id": 2,
          "title": "SwordFishTrombones",
          "label": "Island"
        },
        {
          "id": 3,
          "title": "Bone Machine",
          "label": "ANTI"
        }
      ]
    },
    {
      "Artist": "dEUS",
      "Records": [
        {
          "id": 112,
          "title": "Worst Case Scenario",
          "label": "Island"
        },
        {
          "id": 2213,
          "title": "Keep you close",
          "label": "Universal"
        }
      ]
    },
    {
      "Artist": "Miles",
      "Records": [
        {
          "id": 42,
          "title": "Kind of blue",
          "label": "columbia"
        }
      ]
    }
  ]
}

我想最终:

{
  "Artists": [
    {
      "Artist": "Tom Waits",
      "Records": [
        {
          "id": 1,
          "title": "Rain dogs",
          "label": "Island"
        },
        {
          "id": 2,
          "title": "SwordFishTrombones",
          "label": "Island"
        }
      ]
    },
    {
      "Artist": "dEUS",
      "Records": [
        {
          "id": 112,
          "title": "Worst Case Scenario",
          "label": "Island"
        }
      ]
    }
  ]
}

这可能吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我相信这可以通过内部命中功能来实现。您的查询看起来像这样:

{
  "query": {
    "filtered": {
      "query": {"match_all": {}},
      "filter": {
        "nested": {
          "path": "Artists.Artist.Records",
          "filter": {
            "term": {
              "Records.label": "Island"
            }
          }, 
          "inner_hits" : {}
        }
      }
    }
  }
}