[英]Elasticsearch: better to have more values or more fields?
假設索引中包含描述車輛的文件。
您的索引需要處理兩種不同類型的車輛:摩托車和汽車。
從性能角度來看,以下哪個映射更好? (出於我的目的,需要嵌套)
"vehicle": {
"type": "nested",
"properties": {
"car": {
"properties": {
"model": {
"type": "string"
},
"cost": {
"type": "integer"
}
}
},
"motorcycle": {
"properties": {
"model": {
"type": "string"
},
"cost": {
"type": "integer"
}
}
}
}
}
或這一個:
"vehicle": {
"type": "nested",
"properties": {
"model": {
"type": "string"
},
"cost": {
"type": "integer"
},
"vehicle_type": {
"type": "string" ### "car", "motorcycle"
}
}
}
第二個更易讀,更薄。
但是我的缺點是,當我進行查詢時,如果只想關注“汽車”,則需要將此條件作為查詢的一部分。
如果使用第一個映射,則只需要直接訪問存儲的字段,而不會增加查詢的開銷。
第一個映射是將汽車和摩托車隔離在不同的領域,這種映射更有可能更快。 原因是,您已經知道要應用的過濾器更少,並且由於查詢的選擇性增加(例如,給定的vehicle.car.model
值的文檔比vehicle.model
)
另一種選擇是創建兩個不同的索引car
和motorcycle
,可能具有相同的索引模板 。
在Elasticsearch中,每個分片由單線程處理查詢。 這意味着,如果將索引一分為二,並在單個請求中查詢兩個索引,它將並行執行。
因此,當僅需要查詢汽車或摩托車之一時,由於索引較小,因此速度更快。 當涉及到汽車和摩托車時,通過使用更多線程也可以更快。
編輯:您應該知道的后一種選擇的一個缺點是,內部lucene詞典將被復制,並且如果汽車和摩托車中的值完全相同,它會使索引項的列表加倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.