gpt4 book ai didi

elasticsearch - elasticsearch-按百分比过滤

转载 作者:行者123 更新时间:2023-12-02 22:18:52 25 4
gpt4 key购买 nike

假设我要按10到20%范围内的某个字段过滤文档。我想知道是否可以通过一些简单的查询(例如{"fieldName":{"percentile": [0.1, 0.2]}})进行查询。

说我有这些文件:

[{"a":1,"b":101},{"a":2,"b":102},{"a":3,"b":103}, ..., {"a":100,"b":200}]

我需要按 a(按升序排列)过滤掉它们的前10位,即从1到10的 a。然后我需要按 b按降序对这些结果进行排序,然后进行分页结果(如第2页,每页10条)。

想到的一种解决方案是:
  • 获取文档的总数。
  • a对文档进行排序,取其相应的_id限制为0.1 * total_count
  • 编写最终查询,类似于id in (...) order by b

  • 但是缺点也很明显:

    如果我们谈论的是亚秒级延迟,则
  • 似乎并不有效
  • 如果我们在第一个查询中返回的_id太多(第二个查询默认情况下,ES只允许1000个。我当然可以更改配置,但是总会有一个限制),第二个查询可能无法工作。
  • 最佳答案

    我怀疑如果事先不知道a的确切值,是否可以在一个查询中执行此操作,尽管我认为一种非常有效的方法是可行的。

    我建议做一个 percentiles aggregation作为第一个查询, range query作为第二个查询。

    在我的样本索引中,我只有14个文档,因此出于解释的原因,我将尝试查找占a字段30%到60%的那​​些文档,并按相反的顺序按b字段对它们进行排序(以确保排序有效) 。

    这是我插入的文档:

    {"a":1,"b":101}
    {"a":5,"b":105}
    {"a":10,"b":110}
    {"a":2,"b":102}
    {"a":6,"b":106}
    {"a":7,"b":107}
    {"a":9,"b":109}
    {"a":4,"b":104}
    {"a":8,"b":108}
    {"a":12,"b":256}
    {"a":13,"b":230}
    {"a":14,"b":215}
    {"a":3,"b":103}
    {"a":11,"b":205}

    让我们找出在30%到60%百分位数之间 a字段的范围:
    POST my_percent/doc/_search
    {
    "size": 0,
    "aggs" : {
    "percentiles" : {
    "percentiles" : {
    "field" : "a",
    "percents": [ 30, 60, 90 ]
    }
    }
    }
    }

    用我的样本索引看起来像这样:
    {
    ...
    "hits": {
    "total": 14,
    "max_score": 0,
    "hits": []
    },
    "aggregations": {
    "percentiles": {
    "values": {
    "30.0": 4.9,
    "60.0": 8.8,
    "90.0": 12.700000000000001
    }
    }
    }
    }

    现在我们可以使用边界进行 range查询:
    POST my_percent/doc/_search
    {
    "query": {
    "range": {
    "a" : {
    "gte" : 4.9,
    "lte" : 8.8
    }
    }
    },
    "sort": {
    "b": "desc"
    }
    }

    结果是:
    {
    "took": 5,
    "timed_out": false,
    "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
    },
    "hits": {
    "total": 4,
    "max_score": null,
    "hits": [
    {
    "_index": "my_percent",
    "_type": "doc",
    "_id": "vkFvYGMB_zM1P5OLcYkS",
    "_score": null,
    "_source": {
    "a": 8,
    "b": 108
    },
    "sort": [
    108
    ]
    },
    {
    "_index": "my_percent",
    "_type": "doc",
    "_id": "vUFvYGMB_zM1P5OLWYkM",
    "_score": null,
    "_source": {
    "a": 7,
    "b": 107
    },
    "sort": [
    107
    ]
    },
    {
    "_index": "my_percent",
    "_type": "doc",
    "_id": "vEFvYGMB_zM1P5OLRok1",
    "_score": null,
    "_source": {
    "a": 6,
    "b": 106
    },
    "sort": [
    106
    ]
    },
    {
    "_index": "my_percent",
    "_type": "doc",
    "_id": "u0FvYGMB_zM1P5OLJImy",
    "_score": null,
    "_source": {
    "a": 5,
    "b": 105
    },
    "sort": [
    105
    ]
    }
    ]
    }
    }

    注意 percentiles聚合的结果是近似的。

    通常,这看起来像是可以通过 pandasSpark作业更好地解决的任务。

    希望有帮助!

    关于elasticsearch - elasticsearch-按百分比过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50166949/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com