首页 > 解决方案 > 有没有办法从弹性搜索索引中获取最近的位置值?

问题描述

我有 2 个弹性搜索索引,一个带有用户位置,另一个带有“位置值”

"userlocation" : {
"aliases" : { },
"mappings" : {
  "properties" : {
    "_class" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "email" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "latitude" : {
      "type" : "float"
    },
    "longitude" : {
      "type" : "float"
    },
    "timestamp" : {
      "type" : "long"
    }
  }
},

    {
  "locationvalues" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "LocationLat" : {
          "type" : "double"
        },
        "LocationLong" : {
          "type" : "double"
        },
        "Source" : {
          "type" : "text"
        },
        "TimeStamp" : {
          "type" : "date",
          "format" : "epoch_millis"
        },
        "Value" : {
          "type" : "double"
        }
      }
    },

无论如何,在对应的时间戳(+- 10 分钟)上,是否可以从位置值中获取距离用户位置最近的位置?我必须指定 userlocation 中的时间戳与 locationvalue 中的时间戳具有不同的值。

时间戳的格式为纪元 UNIX 毫秒!locationvalues 有超过 100k 个元素/月和 userlocation 超过 5000。

标签: javascriptjavaspring-bootelasticsearchelastic-stack

解决方案


您似乎更愿意提取报告而不是单个 Elasticsearch 查询的结果。单个查询无法实现您想要实现的目标。您需要编写一个客户端应用程序,首先查询所有现有的“用户位置”,然后将每个“用户位置”的查询提交到位置值索引。

Elasticsearch 可以计算地理位置之间的距离,还可以根据地理距离对结果进行因子排序。Elasticsearch 还支持 data-math 轻松查询日期范围,例如“10 分钟内”等。

但 Elasticsearch 只能在数据以正确格式存储的情况下才能做到这一点。独立于谁创建了 Elasticsearch 索引,映射看起来并不理想。经度和纬度信息不应存储为 2 个浮点字段,而应存储为geo_point字段。

为了支持 date_range 查询,您需要将时间戳存储为正确的时间戳(而不是那么长)。通过format参数,您可以控制您计划发送到 Elasticsearch 的有效日期/时间格式(可以是多个格式字符串!)。然后,Elasticsearch 不仅会使用这些信息来验证时间戳,还会将它们正确地转换为内部使用的 epoch_millis 表示进行存储。

即使您无法更改任何现有映射以保持向后兼容性,您也可以考虑将新的“多字段”添加到您的映射中,以确保您的数据以正确的格式存储。但是您需要获得写入权限(以及执行 _update_by_query-request 的权限)才能首先修复索引映射。


推荐阅读