获取整个索引中的总词频(Elasticsearch)

Posted

技术标签:

【中文标题】获取整个索引中的总词频(Elasticsearch)【英文标题】:Getting total term frequency throughout entire index (Elasticsearch) 【发布时间】:2017-06-02 08:27:43 【问题描述】:

我正在尝试计算特定术语在整个索引中出现的总次数(术语收集频率)。我试图通过使用术语向量来做到这一点,但这仅限于单个文档。即使在指定文档中存在术语的情况下,响应似乎也会在某个 doc_count(在 field_statistics 内)达到最大值,这让我怀疑它的准确性。

请求:

http://myip:9200/clinicaltrials/trial/AVmk-ky6XMskTDwIwpih/_termvectors?term_statistics=true

此处使用的文档 ID 是“AVmk-ky6XMskTDwIwpih”,尽管术语统计信息不应特定于文档。

回复:

这是我对其中一个领域的“癌症”一词的理解:

 "cancer" : 
      "doc_freq" : 5297,
      "ttf" : 10587,
      "term_freq" : 1,
      "tokens" : [
        
          "position" : 15,
          "start_offset" : 115,
          "end_offset" : 121
        
      ]
    ,

如果我合计所有字段的 ttf,我得到 18915。但是,“癌症”的实际总词频实际上是 542829。这让我相信它将 term_vector 统计信息限制在其中的文档子集索引。

这里的任何建议将不胜感激。

【问题讨论】:

你用的是什么elasticsearch版本? 【参考方案1】:

计数不同的原因是术语向量不准确,除非相关索引具有单个分片。对于具有多个分片的索引,文档分布在所有分片上,因此返回的频率不是总数,而是来自随机选择的分片。

因此,返回的频率只是一个相对度量,而不是您期望的绝对值。 see the Behaviour section。 要对此进行测试,您可以创建一个分片索引并请求频率(它应该为您提供实际总数)。

【讨论】:

【参考方案2】:

我相信您需要根据elasticsearch documentation 将 term_statistics 设置为 true:

词条统计 将 term_statistics 设置为 true(默认为 false)将返回

总词频(一个词在所有文档中出现的频率)

文档频率(包含当前词条的文档数量)

默认情况下不会返回这些值,因为术语统计信息会对性能产生严重影响。

【讨论】:

这可能没有明确回答这个问题,但它确实带来了我错过的文档,谢谢你的回答!【参考方案3】:

您是否尝试过简单地使用 COUNT API? https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-count.html

它可以返回查询的匹配数。所以这样的事情可能会奏效。

GET /my_index/_count

    "query" : "match": "my_field": "my_keyword"

【讨论】:

以上是关于获取整个索引中的总词频(Elasticsearch)的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch中如何获取全文搜索的词频

elasticSearch - 原理

Elasticsearch:获取 nested 类型数组中的所有元素

Elasticsearch:获取 nested 类型数组中的所有元素

如何使用 NEST 更新 ElasticSearch 索引中的现有文档?

Elasticsearch 快照和恢复