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

时间:2018-10-09 15:13:21

标签: elasticsearch

假设索引中包含描述车辆的文件。

您的索引需要处理两种不同类型的车辆:摩托车和小汽车。

从性能角度来看,以下哪个映射更好? (出于我的目的需要嵌套)

    "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"
        }

    }
}

第二个更具可读性和精简性。

但是我的缺点是,当我进行查询时,如果只想关注“汽车”,则需要将此条件作为查询的一部分。

如果使用第一个映射,则只需要直接访问存储的字段,而不会增加查询的开销。

1 个答案:

答案 0 :(得分:1)

第一个映射是将汽车和摩托车隔离在不同的领域,这种映射更有可能更快。原因是,您所知道的要应用的过滤器更少,并且由于查询的选择性增加(例如,给定值vehicle.car.model的文档比vehicle.model少)

另一种选择是创建两个不同的索引carmotorcycle,可能使用相同的index template

在Elasticsearch中,每个分片由单线程处理查询。这意味着,如果将索引一分为二,然后query both in a single request,它将并行执行。

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

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