【问题标题】:Is there any way to take nearest location value from an elasticsearch index?有没有办法从弹性搜索索引中获取最近的位置值?
【发布时间】:2021-08-03 21:10:42
【问题描述】:

我有 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 个。

【问题讨论】:

  • 您能否详细说明您的问题?您打算如何查询,每个用户位置一个查询?您使用的是哪个版本的 Elasticstack?你如何索引你的数据? (您当前的映射不允许按预期进行查询。需要更改地理坐标和时间戳)。我正在等待您的意见,然后回答您的问题
  • 我需要根据用户位置来近似污染数据。在“locationvalues”中,我有污染数据,对于“userlocation”中的每个值,我需要从“userlocation”中获取最接近的值。我使用 Elasticstack 7.10.1,我无法修改地理坐标和时间戳,因为我只是读取数据。谢谢@DanielSchneiter!

标签: javascript java spring-boot elasticsearch elastic-stack


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2018-08-20
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多