繁体   English   中英

Elasticsearch:拥有更多值或更多字段更好吗?

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

另一种选择是创建两个不同的索引carmotorcycle ,可能具有相同的索引模板

在Elasticsearch中,每个分片由单线程处理查询。 这意味着,如果将索引一分为二,并在单个请求中查询两个索引,它将并行执行。

因此,当仅需要查询汽车或摩托车之一时,由于索引较小,因此速度更快。 当涉及到汽车和摩托车时,通过使用更多线程也可以更快。

编辑:您应该知道的后一种选择的一个缺点是,内部lucene词典将被复制,并且如果汽车和摩托车中的值完全相同,它会使索引项的列表加倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM