【问题标题】:Elasticsearch - Query to Determine All Unique IDs that are distance X away from a particular ID?Elasticsearch - 查询以确定与特定 ID 距离 X 的所有唯一 ID?
【发布时间】:2020-08-10 08:02:00
【问题描述】:

我有随机游走生成的这种格式的数据(模拟人们四处走动)。它以这种方式设置 { location : { lat: someLat, lon: someLong }, id: uniqueId, date:date }。我正在尝试编写一个给定用户唯一 ID 的查询,找出在特定时间范围内的给定 ID 的 X 距离内有多少其他唯一 ID。关于如何做到这一点的任何提示?

我的想法是拥有一个顶级过滤器聚合,以及某种嵌套的地理查询。我认为地理距离查询是要走的路,但我不知道如何将其包含到下面的查询中,以获取在我过滤的 ID X 距离内的所有唯一 ID。下面的查询是我开始的地方,我从现在过滤所有文档 - 1 天到现在,其中文档用户 ID 是提供的值。我将如何检查所有其他文档与匹配此查询的文档的距离?

{
    "aggs" : {
        "range": {
            "date_range": {
                "field": "date",
                "format": "MM-yyyy",
                "ranges": [
                    { "to": "now" }, 
                    { "from": "now-1d" } 
                ]
            }
        },
        "locations" : {
            "filter" : { 
              "term": { "id.keyword": "7a50ab18-886b-42a2-80ad-3d45112e3cfd" }
            }
        }
    }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    你的预感是正确的。所有这些都可以使用range & geo_distance 过滤和_geo_distance 排序来完成。您想在查询级别进行过滤,而不是在 aggs 中:

    GET walking/_search
    {
      "size": 0, 
      "query": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "now-1d"
                }
              }
            }
          ],
          "filter": [
            {
              "geo_distance": {
                "distance": "20m",
                "location": {
                  "lat": 48.20150179951008,
                  "lon": 16.39111876487732
                }
              }
            }
          ]
        }
      },
      "aggs": {
         "rings_around_loc": {
              "geo_distance": {
                "field": "location",
                "origin": {
                  "lat": 48.20150179951008,
                  "lon": 16.39111876487732
                },
                "unit": "m",
                "keyed": true,
                "ranges": [
                  {
                    "to": 10
                  },
                  {
                    "from": 10,
                    "to": 50
                  },
                  {
                    "from": 50
                  }
                ]
              }
        },
        "locations": {
          "value_count": {
            "field": "id.keyword"
          }
        }
      },
      "sort": [
        {
          "_geo_distance": {
            "location": {
              "lat": 48.20150179951008,
              "lon": 16.39111876487732
            },
            "order": "asc",
            "unit": "m",
            "mode": "min",
            "distance_type": "arc",
            "ignore_unmapped": true
          }
        }
      ]
    }
    

    不确定您需要范围桶来做什么,所以我将它们排除在外。


    复制的完整步骤:

    PUT walking
    {
      "mappings": {
        "properties": {
          "date": {
            "type": "date"
          },
          "id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
    

    然后POST _bulk 这个random walk data

    【讨论】:

    • 很棒的解决方案。但是,似乎需要提供特定位置才能进行查询。无论如何,是否可以不考虑一个特定位置,而只使用从查询返回的所有文档中的位置?因此,本质上是根据一个用户的总位置历史记录检查其他用户的位置
    • 我认为这不可能——尽管我可能弄错了!您提出问题的方式意味着您无论如何都会对每个用户感兴趣,因此我建议您多次运行上述脚本/对于步行的每个点。这有点麻烦,但同样,我不知道更优雅的方式。仅供参考,我用 geo_distance agg 更新我的答案,您可能也会感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2022-08-23
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多