javascript - 有没有办法从弹性搜索索引中获取最近的位置值?
问题描述
我有 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。
解决方案
您似乎更愿意提取报告而不是单个 Elasticsearch 查询的结果。单个查询无法实现您想要实现的目标。您需要编写一个客户端应用程序,首先查询所有现有的“用户位置”,然后将每个“用户位置”的查询提交到位置值索引。
Elasticsearch 可以计算地理位置之间的距离,还可以根据地理距离对结果进行因子排序。Elasticsearch 还支持 data-math 轻松查询日期范围,例如“10 分钟内”等。
但 Elasticsearch 只能在数据以正确格式存储的情况下才能做到这一点。独立于谁创建了 Elasticsearch 索引,映射看起来并不理想。经度和纬度信息不应存储为 2 个浮点字段,而应存储为geo_point字段。
为了支持 date_range 查询,您需要将时间戳存储为正确的时间戳(而不是那么长)。通过format参数,您可以控制您计划发送到 Elasticsearch 的有效日期/时间格式(可以是多个格式字符串!)。然后,Elasticsearch 不仅会使用这些信息来验证时间戳,还会将它们正确地转换为内部使用的 epoch_millis 表示进行存储。
即使您无法更改任何现有映射以保持向后兼容性,您也可以考虑将新的“多字段”添加到您的映射中,以确保您的数据以正确的格式存储。但是您需要获得写入权限(以及执行 _update_by_query-request 的权限)才能首先修复索引映射。
推荐阅读
- c++ - 带数组参数的构造函数
- java - 是否可以在 Mersenne Twister RNG (Java) 中为 nextInt 指定上限和下限
- jquery - jQuery HTML5 上传器复选框过滤器
- scala - 从原始数据构建图表的最有效“火花”方式是什么?
- c++ - 如何使用 QList 获取列中的所有项目
? - c# - 使用异步扩展方法时订阅 observable 未触发
- angular - 用户执行操作或空闲状态时自动注销 - Angular
- c++ - CLion 中的 Boost 安装
- reactjs - 如何在颜色选择器中使用所选颜色制作 div
- spring-boot - 带有 Spring-boot 后端的 Flutter websocket