我正在进行弹性搜索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中没有看到任何内容。
答案 0 :(得分:3)
默认搜索类型为query_then_fetch
,其中术语和文档频率计算本地指向索引中的每个分片。这就是您看到maxDocs=56
的原因,可能是 分片中的文档数量,而不是100
- 这是索引中文档的总数。
在查询中按_search
替换_search?search_type=dfs_query_then_fetch
可以更准确地计算术语/文档频率。更多详情可在this elastic blog
答案 1 :(得分:1)
12
由Lucene'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。