【问题标题】:IDF recaculation for existing documents in index?索引中现有文档的 IDF 重新计算?
【发布时间】:2019-10-05 08:16:00
【问题描述】:

我已经浏览了[相关性评分背后的理论][1],并得到了两个相关问题

Q1 :- 因为 IDF 公式是 idf(t) = 1 + log ( numDocs / (docFreq + 1)),其中 numDocs 是索引中的文档总数。是否意味着每次在索引中添加新文档时,我们需要重新计算索引中所有现有文档的每个单词的IDF?

Q2 :- 下面提到的链接。我的问题是,为什么要针对每个字段而不是完整文档计算 TF/IDF 分数?

当我们在前面的公式中引用文档时,我们实际上是 谈论文档中的一个字段。每个领域都有自己的 倒排索引,因此,出于 TF/IDF 的目的,字段的值 是文档的价值。

【问题讨论】:

    标签: elasticsearch tf-idf


    【解决方案1】:
    1. 您只在查询时而不是在插入时计算分数。 Lucene 具有正确的统计数据,可以快速计算,并且值始终是最新的。
    2. 频率仅对单个字段才真正有意义,因为您对特定字段的值感兴趣。假设我们有多个字段并且我们搜索一个字段,那么我们只对那个字段的频率感兴趣。搜索多个您仍然希望控制单个字段(例如将“标题”提升到“正文”)或想要定义如何组合它们的多个字段。如果您有一个没有意义的用例(不确定我现在是否有一个很好的例子——这在 IMO 中远不常见),那么您可以使用 copy_to 将多个字段合并为一个并进行搜索。李>

    【讨论】:

    • 谢谢。关于第 1 点,您的意思是 Es 只是在存储/插入时创建倒排索引,而像 TF/IDF 这样的分数仅在查询时计算?
    • 是的。对索引的每一次更改都会影响分数,因此无法为每个可能的查询预先计算分数。
    • google 在查询时也会计算吗?考虑到数十亿个文档,在查询时找到分数是一项艰巨的任务。不是吗?
    • 但是您的用例是否有数十亿份文档?我会假设您正在尝试解决与 Google 不同类型的问题。
    • 是的,我只是问谷歌。我没有那个用例
    猜你喜欢
    • 2016-01-23
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2015-02-14
    • 2023-03-04
    • 2018-09-16
    • 2011-05-27
    相关资源
    最近更新 更多