Elasticsearch Nested datatype 嵌套數據類型

nested 嵌套數據類型

nested類型是object數據類型的專用版本,它允許可以彼此獨立地查詢對象地方式,對對象數組進行索引。

在使用大量地嵌套鍵值對進行存取時,可以考慮使用flattened數據類型(允許將整個JSON對象索引爲單個字段)替代,該數據類型將整個對象映射爲單個字段,並允許對其內容進行簡單搜索。嵌套文檔,存儲和查詢通常很昂貴,因此此用例中使用flattened數據類型是更好的選擇。

Flattened 是付費使用功能

使用嵌套數據類型

如果需要索引對象數組並保持數組中每個對象地獨立性,使用nested數據類型而不是object數據類型。在內部,嵌套數據類型陣列作爲一個單獨地隱藏文檔中。這就意味着,嵌套對象在搜索時,可以獨立於其他嵌套搜索之外。

使用示例

PUT my_index
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      }
    }
  }
}

PUT my_index/_doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "Smith" }} 
          ]
        }
      }
    }
  }
}

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "White" }} 
          ]
        }
      },
      "inner_hits": { 
        "highlight": {
          "fields": {
            "user.first": {}
          }
        }
      }
    }
  }
}

說明

  1. user字段爲嵌套字段
  2. 第一個查詢,沒有匹配結果, 是因爲 Alice, Smith沒在一個嵌套對象內部
  3. 第二個查詢,有匹配結果

嵌套查詢

詳情請看

限制條件

如上所述,每個嵌套對象都被索引爲一個單獨地Lucene文檔。就上面地示例而言,如果我們爲包含100個user對象的單個文檔建立索引,則將創建101個Lucene文檔:一個用於父文檔,一個用於每個嵌套對象。由於與nested映射相關的開銷,Elasticsearch放置了適當的設置來防範性能問題:
index.mapping.nested_fields.limit,在索引中,嵌套對象地最大數量。建議,僅在需要的地方使用嵌套數據類型。默認爲50
index.mapping.nested_objects.limit,單個文檔所有嵌套類型包含的最大JSON對象地量,當包含大量的嵌套對象時,此限制有助於防止出現內存不足的異常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章