减少内存占用

每一个 经纬度lat/lon)组合需要占用16个字节的内存。要知道内存可是供不应求的。
使用这种占用16字节内存的方式可以得到非常精确的结果。不过就像之前提到的一样,实际应用中几乎都不需要这么精确。

你可以通过这种方式来减少内存使用量:
设置一个压缩的compressed)数据字段格式并明确指定你的地理坐标点所需的精度。
即使只是将精度降低到1毫米1mm)级别,也可以减少1/3的内存使用。
更实际的,将精度设置到3米3m)内存占用可以减少62%,而设置到1公里1km)则节省75%之多。

这个设置项可以通过 update-mapping API 来对实时索引进行调整:

  1. POST /attractions/_mapping/restaurant
  2. {
  3. "location": {
  4. "type": "geo_point",
  5. "fielddata": {
  6. "format": "compressed",
  7. "precision": "1km" <1>
  8. }
  9. }
  10. }
  • <1> 每一个经纬度lat/lon)组合现在只需要4个字节,而不是16个。

另外,你还可以这样做来避免把所有地理坐标点全部同时加载到内存中:
使用在优化盒模型(optimize-bounding-box)中提到的技术,
或者把地理坐标点当作文档值(doc values)来存储。

  1. PUT /attractions
  2. {
  3. "mappings": {
  4. "restaurant": {
  5. "properties": {
  6. "name": {
  7. "type": "string"
  8. },
  9. "location": {
  10. "type": "geo_point",
  11. "doc_values": true <1>
  12. }
  13. }
  14. }
  15. }
  16. }
  • <1> 地理坐标点现在不会被加载到内存,而是保存在磁盘中。

将地理坐标点映射为文档值的方式只能是在这个字段第一次被创建时。
相比使用字段值,使用文档值会有一些小的性能代价,不过考虑到它对内存的节省,这种方式通常是还值得的。