获取整个索引的总术语频率(Elasticsearch)

时间:2017-01-18 04:22:32

标签: elasticsearch information-retrieval

我试图计算整个索引(术语收集频率)中特定术语出现的总次数。我试图通过使用术语向量来实现这一点,但是这仅限于单个文档。即使在指定文档中存在术语的情况下,响应似乎最大化了某个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统计数据限制为索引中的文档子集。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:4)

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

  

术语统计   将term_statistics设置为true(默认为false)将返回

     

总学期频率(术语在所有文件中出现的频率)

     

文件频率(包含当前术语的文件数量)

     

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

您是否尝试过仅使用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"}
}