elasticsearch 內部對象結構數據索引

內部對象 常常用於 嵌入一個實體或對象到其它對象中。例如,與其在 tweet 文檔中包含 user_name 和 user_id 域,咱們也能夠這樣寫:elasticsearch

{
    "tweet":            "Elasticsearch is very flexible",
    "user": {
        "id":           "@johnsmith",
        "gender":       "male",
        "age":          26,
        "name": {
            "full":     "John Smith",
            "first":    "John",
            "last":     "Smith"
        }
    }
}

Elasticsearch 會動態 監測新的對象域並映射它們爲 對象 ,在 properties 屬性下列出內部域:flex

{
  "gb": {
    "tweet": { 
      "properties": {
        "tweet":            { "type": "string" },
        "user": { 
          "type":             "object",
          "properties": {
            "id":           { "type": "string" },
            "gender":       { "type": "string" },
            "age":          { "type": "long"   },
            "name":   { 
              "type":         "object",
              "properties": {
                "full":     { "type": "string" },
                "first":    { "type": "string" },
                "last":     { "type": "string" }
              }
            }
          }
        }
      }
    }
  }
}

user 和 name 域的映射結構與 tweet 類型的相同。事實上, type 映射只是一種特殊的 對象 映射,咱們稱之爲 根對象 。除了它有一些文檔元數據的特殊頂級域,例如 _source 和 _all 域,它和其餘對象同樣。
Lucene 不理解內部對象。 Lucene 文檔是由一組鍵值對列表組成的。爲了能讓 Elasticsearch 有效地索引內部類,它把咱們的文檔轉化成這樣:spa

{
    "tweet":            [elasticsearch, flexible, very],
    "user.id":          [@johnsmith],
    "user.gender":      [male],
    "user.age":         [26],
    "user.name.full":   [john, smith],
    "user.name.first":  [john],
    "user.name.last":   [smith]
}

內部域 能夠經過名稱引用(例如, first )。爲了區分同名的兩個域,咱們可使用全 路徑 (例如, user.name.first ) 或 type 名加路徑( tweet.user.name.first )。code

相關文章
相關標籤/搜索