gpt4 book ai didi

elasticsearch - 使用聚合检索查询结果中术语的文档频率

转载 作者:行者123 更新时间:2023-11-29 02:53:10 26 4
gpt4 key购买 nike

对于我对 ElasticSearch 的一些查询,我需要返回三条信息:

  • 结果文档集中出现了哪些词 T?
  • T 的每个元素在结果文档集中出现的频率如何?
  • T 的每个元素在整个索引中出现的频率(--> 文档频率)?

  • 第一个点可以使用默认的术语方面轻松确定,或者现在通过术语聚合方法确定。
    所以我的问题实际上是关于第三点。
    在 ElasticSearch 1.x 之前,即在切换到“聚合”范式之前,我可以使用术语 facet,并将“global”选项设置为 true和一个 QueryFilter获取 QueryFilter 指定的文档集中出现的确切术语的文档频率(“全局计数”) .
    起初我以为我可以用 global aggregation 做同样的事情,但似乎我不能。原因是 - 如果我理解正确的话 - 原来的 facet机制以术语为中心,而聚合桶由属于每个桶的文档集定义。
    IE。指定 global term facet 的选项与 QueryFilter首先确定过滤器命中的术语,然后计算构面值。由于刻面是 global我会收到文件计数。

    有了聚合,情况就不同了。 global聚合只能用作顶级聚合,导致聚合忽略当前查询结果并计算聚合 - 例如 terms aggregation - 在索引中的所有文档上。所以对我来说,这太多了,因为我想将返回的术语('buckets')限制为文档结果集中的术语。但是,如果我使用带有术语子聚合的过滤器子聚合,我会再次将术语桶限制为过滤器,从而不会检索文档频率,而是检索正常的构面计数。原因是桶是在过滤器之后确定的,所以它们“太小”了。但是我不想限制存储桶大小,我想将存储桶限制为查询结果集中的术语。

    如何使用聚合获取查询结果集中这些术语的文档频率(因为 facet 已被弃用并将被删除)?

    谢谢你的时间!

    编辑 :这是我如何尝试实现所需行为的示例。
    我将定义两个聚合:
  • global_agg_with_filter_and_terms
  • global_agg_with_terms_and_filter

  • 两者都有一个 global聚合在他们的顶部,因为它是唯一有效的位置。然后,在第一次聚合中,我首先将结果过滤到原始查询,然后应用 term-sub-aggregation。
    在第二个聚合中,我做的大致相同,只是这里的过滤器聚合是术语聚合的子聚合。因此名称相似,只是聚合的顺序不同。
    {
    "query": {
    "query_string": {
    "query": "text: my query string"
    }
    },
    "aggs": {
    "global_agg_with_filter_and_terms": {
    "global": {},
    "aggs": {
    "filter_agg": {
    "filter": {
    "query": {
    "query_string": {
    "query": "text: my query string"
    }
    }
    },
    "aggs": {
    "terms_agg": {
    "terms": {
    "field": "facets"
    }
    }
    }
    }
    }
    },
    "global_agg_with_terms_and_filter": {
    "global": {},
    "aggs": {
    "document_frequency": {
    "terms": {
    "field": "facets"
    },
    "aggs": {
    "term_count": {
    "filter": {
    "query": {
    "query_string": {
    "query": "text: my query string"
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    回复:
    {
    "took": 18,
    "timed_out": false,
    "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
    },
    "hits": {
    "total": 221,
    "max_score": 0.9839197,
    "hits": <omitted>
    },
    "aggregations": {
    "global_agg_with_filter_and_terms": {
    "doc_count": 1978,
    "filter_agg": {
    "doc_count": 221,
    "terms_agg": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
    "key": "fid8",
    "doc_count": 155
    },
    {
    "key": "fid6",
    "doc_count": 40
    },
    {
    "key": "fid9",
    "doc_count": 10
    },
    {
    "key": "fid5",
    "doc_count": 9
    },
    {
    "key": "fid13",
    "doc_count": 5
    },
    {
    "key": "fid7",
    "doc_count": 2
    }
    ]
    }
    }
    },
    "global_agg_with_terms_and_filter": {
    "doc_count": 1978,
    "document_frequency": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
    "key": "fid8",
    "doc_count": 1050,
    "term_count": {
    "doc_count": 155
    }
    },
    {
    "key": "fid6",
    "doc_count": 668,
    "term_count": {
    "doc_count": 40
    }
    },
    {
    "key": "fid9",
    "doc_count": 67,
    "term_count": {
    "doc_count": 10
    }
    },
    {
    "key": "fid5",
    "doc_count": 65,
    "term_count": {
    "doc_count": 9
    }
    },
    {
    "key": "fid7",
    "doc_count": 63,
    "term_count": {
    "doc_count": 2
    }
    },
    {
    "key": "fid13",
    "doc_count": 55,
    "term_count": {
    "doc_count": 5
    }
    },
    {
    "key": "fid10",
    "doc_count": 11,
    "term_count": {
    "doc_count": 0
    }
    },
    {
    "key": "fid11",
    "doc_count": 9,
    "term_count": {
    "doc_count": 0
    }
    },
    {
    "key": "fid12",
    "doc_count": 5,
    "term_count": {
    "doc_count": 0
    }
    }
    ]
    }
    }
    }
    }

    首先,请查看两个聚合返回的前两个 term-buckets,键为 fid8fid6 .我们可以很容易地看到,这些术语分别在结果集中出现了 155 次和 40 次。现在请看第二个聚合, global_agg_with_terms_and_filter . term-aggregation 在全局聚合的范围内,所以这里我们实际上可以看到文档频率,分别是 1050 和 668。所以这部分看起来不错。当您将术语桶列表进一步向下扫描到带有键 fid10 的桶时,就会出现问题。至 fid12 .在我们收到他们的文档频率的同时,我们也可以看到他们的 term_count是 0。这是因为这些术语没有出现在我们的查询中,我们也用于过滤器子聚合。所以问题是,对于所有术语(全局范围!),它们的文档频率和它们相对于实际查询结果的方面计数被返回。但是我需要完全针对查询结果中出现的术语进行此操作,即对于第一个聚合 global_agg_with_filter_and_terms 返回的那些确切术语.

    也许有可能定义某种过滤器,以删除其子过滤器聚合 term_count 的所有桶。有一个零 doc_count ?

    最佳答案

    如果回答晚了,您好,抱歉。

    你应该看看 Significant Terms聚合,就像术语聚合一样,它为结果集中出现的每个术语返回一个桶,其出现次数可通过 doc_count 获得。 ,但您还可以通过 bg_count 获得背景设置中的出现次数.这意味着它只为出现在查询结果集文档中的术语创建存储桶。

    默认背景集包含查询范围内的所有文档,但可以使用 background_filter 过滤到您想要的任何子集。 .

    您可以使用脚本化的存储桶评分函数,通过组合多个指标,按照您想要的方式对存储桶进行排名:

  • _subset_freq :该词出现在结果集中的文档数,
  • _superset_freq :词条出现在背景集中的文档数,
  • _subset_size :结果集中的文档数,
  • _superset_size :背景集中的文档数。

  • 请求:
    {
    "query": {
    "query_string": {
    "query": "text: my query string"
    }
    },
    "aggs": {
    "terms": {
    "significant_terms": {
    "script": "_subset_freq",
    "size": 100
    }
    }
    }
    }

    关于elasticsearch - 使用聚合检索查询结果中术语的文档频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782234/

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