elasticsearch 弹性搜索将筛选器应用于聚合数据,elasticsearch,lucene,aggregation,elasticsearch,Lucene,Aggregation" /> elasticsearch 弹性搜索将筛选器应用于聚合数据,elasticsearch,lucene,aggregation,elasticsearch,Lucene,Aggregation" />

elasticsearch 弹性搜索将筛选器应用于聚合数据

elasticsearch 弹性搜索将筛选器应用于聚合数据,elasticsearch,lucene,aggregation,elasticsearch,Lucene,Aggregation,我有一个包含用户位置的索引,我想为每个用户选择最新位置,然后对最新位置应用一些复杂的过滤器。我设法使用聚合和排序来拾取最新的位置,但是我找不到一种方法在之后对其应用过滤器 筛选器或post_筛选器不会产生预期结果,因为它们应用于命中而不是聚合位置。我看到一些关于Bucket脚本聚合的评论,但可用的示例非常简单。 在弹性搜索中有什么办法吗?这是一个非常简单的SQL脚本。感谢您的帮助 对聚合位置的ES查询示例: 示例SQL查询(过于简化,不基于实际数据): 样本数据: 用户id位置位置源类型已创建活

我有一个包含用户位置的索引,我想为每个用户选择最新位置,然后对最新位置应用一些复杂的过滤器。我设法使用聚合和排序来拾取最新的位置,但是我找不到一种方法在之后对其应用过滤器

筛选器或post_筛选器不会产生预期结果,因为它们应用于命中而不是聚合位置。我看到一些关于Bucket脚本聚合的评论,但可用的示例非常简单。 在弹性搜索中有什么办法吗?这是一个非常简单的SQL脚本。感谢您的帮助

对聚合位置的ES查询示例:

示例SQL查询(过于简化,不基于实际数据):

样本数据:

用户id位置位置源类型已创建活动组织id

1(0,0)112020-01-01 1123

1(0,0)112020-02-01 1123

1(9,9)112020-03-01 1123

2(8,8)112020-04-01 1123

预期结果:

1(9,9)112020-03-01 1123

2(8,8)112020-04-01 1123

这是我要应用于聚合数据的过滤器示例:

"post_filter": {
        "bool": {
            "should": [{
                "bool": {
                    "must": [
                        {
                            { "term": { "location_source_type": 1 }},
                            { "term" : { "org_id" : "123" }}
                        },
                        {
                            "range": { "created": { "lte": "2020-01-01T00:00:00" } }
                        }
                    ],
                    "filter": [{
                        "geo_distance": {
                            "distance": "1000km",
                            "location": {
                                "lat": 9,
                                "lon": 9
                            }
                        }
                    }]
                }
            }]
        }
    }

您要应用什么筛选器?您可以分享您的索引映射、示例数据和预期的搜索结果吗?您可以分享您心目中的SQL查询吗?@Bhavya I更新了描述以回答您的问题。谢谢大家!@Val I更新了描述以回答您的问题。非常感谢。
SELECT subquery.* FROM
(
    SELECT 
        ROW_NUMBER() OVER(PARTITION BY UserId ORDER BY Created DESC) AS "RowNumber",  
        UserId,
        Latitute,
        Longitude,
        Active,
        OrganizationId
    FROM Locations
) subquery
WHERE subquery.RowNumber = 1 AND Latitude < 10 AND Longitude > 0 AND Active = 1 AND OrganizationId = 123
{
    "mappings": {
        "properties": {
            "user_id": {
                "type": "integer"
            },
            "location": {
                "type": "geo_point"
            },
            "location_source_type": {
                "type": "integer"
            },
            "created": {
                "type": "date"
            }
            "active": {
                "type": "integer"
            },
            "org_id": {
                "type": "integer"
            }
        }
    }
}
"post_filter": {
        "bool": {
            "should": [{
                "bool": {
                    "must": [
                        {
                            { "term": { "location_source_type": 1 }},
                            { "term" : { "org_id" : "123" }}
                        },
                        {
                            "range": { "created": { "lte": "2020-01-01T00:00:00" } }
                        }
                    ],
                    "filter": [{
                        "geo_distance": {
                            "distance": "1000km",
                            "location": {
                                "lat": 9,
                                "lon": 9
                            }
                        }
                    }]
                }
            }]
        }
    }