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": {}
}
}
}
}
}
}
說明
- user字段爲嵌套字段
- 第一個查詢,沒有匹配結果, 是因爲 Alice, Smith沒在一個嵌套對象內部
- 第二個查詢,有匹配結果
嵌套查詢
限制條件
如上所述,每個嵌套對象都被索引爲一個單獨地Lucene文檔。就上面地示例而言,如果我們爲包含100個user對象的單個文檔建立索引,則將創建101個Lucene文檔:一個用於父文檔,一個用於每個嵌套對象。由於與nested映射相關的開銷,Elasticsearch放置了適當的設置來防範性能問題:
index.mapping.nested_fields.limit
,在索引中,嵌套對象地最大數量。建議,僅在需要的地方使用嵌套數據類型。默認爲50
index.mapping.nested_objects.limit
,單個文檔所有嵌套類型包含的最大JSON對象地量,當包含大量的嵌套對象時,此限制有助於防止出現內存不足的異常