了解Elastic Search的解释功能

时间:2015-06-09 00:30:59

标签: elasticsearch

我正在进行弹性搜索1.5.2查询并打开“explain”标志。反文档频率的输出为

{
    "description": "idf(docFreq=2, maxDocs=56)", 
    "value": 3.9267395
}

我理解inverse document frequency背后的想法。如果我有100个文档,其中一个包含“杜鹃花”一词,那么idf = num docs / num docs with term "rhododendron" = 100 / 1

但是弹性搜索中的最大文档编号在哪里?我在documentation中没有看到任何内容。

2 个答案:

答案 0 :(得分:3)

默认搜索类型为query_then_fetch,其中术语和文档频率计算本地指向索引中的每个分片。这就是您看到maxDocs=56的原因,可能是 分片中的文档数量,而不是100 - 这是索引中文档的总数。

在查询中按_search替换_search?search_type=dfs_query_then_fetch可以更准确地计算术语/文档频率。更多详情可在this elastic blog

中找到

答案 1 :(得分:1)

12Lucene's IndexReader计算,API文档说明如下:

  

"HH:mm" -> 13:30 is "hh:mm a" -> 01:30 PM

     

返回大于最大可能文档编号的文件。这可以用于,例如,确定分配一个数组的大小,该数组将为索引中的每个文档编号提供一个元素。

换句话说,maxDocs是索引中的文档总数(+1),包括已删除的文档。

我们可以通过查看source code for IndexReader来确认这一点,这基本上表明以下公式成立:public abstract int maxDoc(),其中

  • maxDocs返回索引
  • 中已删除文档的总数
  • numDeletedDocs() = maxDoc() - numDocs()返回索引中可见文档的数量

但值得注意的是,根据您的查询所针对的分片(主要或副本),numDeletedDocs()可能会有所不同(因此您的分数也会不同)。有关完整说明,请参阅this thread。要减轻此问题(称为“弹跳结果”),您可以在查询中指定preference parameter