[英]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.