簡體   English   中英

Elasticsearch:過濾嵌套文檔中的數組元素

[英]Elasticsearch: Filter array elements in nested documents

目前我正在嘗試了解 Elasticsearch 文檔的結構和這些響應。 我創建了一些索引並添加了一些文檔來學習基礎知識。 現在我正在為嵌套字典的響應而苦苦掙扎。

最近我在現有索引中添加了 2 個文檔:

{
   {"id": 1,
    "vehicle": "car",
    "equipment": [
       {"v_id": 24, "gps": true,"color": "black"}
       {"v_id": 11, "gps": false, "color": "yellow"}
    ]
   },

  {"id": 2,
   "vehicle": "bus",
   "equipment": [
       {"v_id": 34, "gps": false,"color": "red"}
       {"v_id": 99, "gps": false,"color": "yellow"}
       {"v_id": 10, "gps": true,"color": "red"}
   ]
  }
}

現在我想使用查詢檢索所有黃色車輛:

{
   "query": {
     "match": {
         "equipment.color": "yellow“
      }
   }
}

我會得到如下回復:

{
   {"id": 1,
    "vehicle": "car",
    "equipment": [
       {"v_id": 24, "gps": true,"color": "black"}
       {"v_id": 11, "gps": false, "color": "yellow"}
    ]
   },

  {"id": 2,
   "vehicle": "bus",
   "equipment": [
       {"v_id": 34, "gps": false,"color": "red"}
       {"v_id": 99, "gps": false,"color": "yellow"}
       {"v_id": 10, "gps": true,"color": "red"}
   ]
  }
}

因為這兩個文檔都包含一個顏色值為“黃色”的車輛。 實際上,我嘗試從響應中過濾出一些數組元素,並希望響應看起來像這樣:

{
   {"id": 1,
    "vehicle": "car",
    "equipment": [
       {"v_id": 11, "gps": false, "color": "yellow"}
    ]
   },

  {"id": 2,
   "vehicle": "bus",
   "equipment": [
       {"v_id": 99, "gps": false,"color": "yellow"}
   ]
  }
}

Elasticsearch 或一般字典可以做到這一點嗎? 如果答案是肯定的,那么查詢主體應該是什么樣子?

非常感謝,西科

您需要將嵌套查詢inner_hits一起使用

添加具有索引映射、搜索查詢和搜索結果的工作示例

索引映射:

PUT myidx
{
  "mappings": {
    "properties": {
      "equipment":{
        "type":"nested"
      }
    }
  }
}

搜索查詢:

POST myidx/_search
{
  "query": {
    "nested": {
      "path": "equipment",
      "query": {
        "match": {
          "equipment.color": "yellow"
        }
      },
      "inner_hits": {}
    }
  }
}

搜索結果:

{
  "took" : 432,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.87546873,
    "hits" : [
      {
        "_index" : "myidx",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.87546873,
        "_source" : {
          "id" : 1,
          "vehicle" : "car",
          "equipment" : [
            {
              "v_id" : 24,
              "gps" : true,
              "color" : "black"
            },
            {
              "v_id" : 11,
              "gps" : false,
              "color" : "yellow"
            }
          ]
        },
        "inner_hits" : {
          "equipment" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : 0.87546873,
              "hits" : [
                {
                  "_index" : "myidx",
                  "_type" : "_doc",
                  "_id" : "1",
                  "_nested" : {
                    "field" : "equipment",
                    "offset" : 1
                  },
                  "_score" : 0.87546873,
                  "_source" : {
                    "v_id" : 11,
                    "color" : "yellow",
                    "gps" : false                  // note this
                  }
                }
              ]
            }
          }
        }
      },
      {
        "_index" : "myidx",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.87546873,
        "_source" : {
          "id" : 2,
          "vehicle" : "bus",
          "equipment" : [
            {
              "v_id" : 34,
              "gps" : false,
              "color" : "red"
            },
            {
              "v_id" : 99,
              "gps" : false,
              "color" : "yellow"
            },
            {
              "v_id" : 10,
              "gps" : true,
              "color" : "red"
            }
          ]
        },
        "inner_hits" : {
          "equipment" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : 0.87546873,
              "hits" : [
                {
                  "_index" : "myidx",
                  "_type" : "_doc",
                  "_id" : "2",
                  "_nested" : {
                    "field" : "equipment",
                    "offset" : 1
                  },
                  "_score" : 0.87546873,
                  "_source" : {
                    "v_id" : 99,
                    "color" : "yellow",       // note this
                    "gps" : false
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM