如何在python中使用ElasticSearch DSL过滤包含N个以上文档的桶?

whhtz7ly  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(109)

我在ElasticSearch中有一个索引,包含每个文档中用户的信息,沿着他们在Facebook上发布的帖子(以非规范化的方式)。
每份文件包含:用户ID|用户名|发布_文本|发布_表情符号
我想检索的ID的用户有超过N个职位。
我刚开始使用ElasticSearch,特别是使用Python(https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html)搜索DSL
我正在使用User_ID字段上的术语聚合来创建存储桶,并希望根据每个存储桶中的文档数量来过滤存储桶。
这是我设法创建的函数,然而,由于我不知道正确的语法,并且仍然与文档混淆,我无法执行它并获得正确的响应。

def users_more_posts_than_query(search_object: Search, num_posts: int):
    search_object = search_object.aggs.bucket('posts_count', 'terms', field='user_id')\
        .pipeline("having_posts", "bucket_selector", buckets_path={"postsCount": "_count"}, script=f"params.postsCount > {num_posts}")

    response = search_object.execute()

    for hit in response.hits:
            hit.user_id

请指出我在这里做错了什么,以及我怎样才能达到我的预期目标。

sg2wtvxw

sg2wtvxw1#

不要重新分配search_object,聚合将与命中分开返回

def users_more_posts_than_query(search_object: Search, num_posts: int):
    search_object.aggs.bucket('posts_count', 'terms', field='user_id').pipeline(
        "having_posts", "bucket_selector",
        buckets_path={"postsCount": "_count"},
        script=f"params.postsCount > {num_posts}")
    
    response = search_object.execute()
    for bucket in response.aggregations.posts_count.buckets:
        print(bucket)

相关问题