假设索引中包含描述车辆的文件。
您的索引需要处理两种不同类型的车辆:摩托车和小汽车。
从性能角度来看,以下哪个映射更好? (出于我的目的需要嵌套)
"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"
}
}
}
第二个更具可读性和精简性。
但是我的缺点是,当我进行查询时,如果只想关注“汽车”,则需要将此条件作为查询的一部分。
如果使用第一个映射,则只需要直接访问存储的字段,而不会增加查询的开销。
答案 0 :(得分:1)
第一个映射是将汽车和摩托车隔离在不同的领域,这种映射更有可能更快。原因是,您所知道的要应用的过滤器更少,并且由于查询的选择性增加(例如,给定值vehicle.car.model
的文档比vehicle.model
少)
另一种选择是创建两个不同的索引car
和motorcycle
,可能使用相同的index template。
在Elasticsearch中,每个分片由单线程处理查询。这意味着,如果将索引一分为二,然后query both in a single request,它将并行执行。
因此,当仅需要查询汽车或摩托车之一时,由于索引较小,因此速度更快。当涉及到汽车和摩托车时,通过使用更多线程也可以更快。
编辑:您应该知道的后一种选择的一个缺点是,内部lucene词典将被复制,并且如果汽车和摩托车中的值完全相同,则会使索引项的列表加倍。