我希望我的用户的搜索结果包括某个给定搜索查询有多少个匹配项的想法。

但是,在对用户的搜索日志进行了一些研究和观察之后,我注意到记录的查询速度与总结果数之间存在直接关联,并确定这是因为我正在访问totalHits属性,该属性显然具有遍历整个结果集以返回值。

我很乐意简单地返回一个近似值,甚至只是一个数量级,就可以大致了解可用结果的数量,但是我看不出有什么好的方法可以在不显着影响性能的情况下进行计算。我真的不是只想在用户面前转储看似毫无底线的结果集,而不必提供他们搜索匹配多少结果的粗略想法。

有什么建议?

最佳答案

使用布尔查询,您可以尝试近似:

  • |A or B| / |D| = ((|A| / |D|) + (|B| / |D|)) / 2
  • |A and B| / |D| = (|A| / |D|) * (|B| / |D|)

  • 其中AB是两个术语,而|D|是文档总数。这基本上是在假设独立性。

    您可以使用rewrite方法将任何查询重写为布尔查询。

    确实没有更好的方法,但是我发现这种假设在实践中并不太糟糕。如果您的文档数量很少,则可能会给出错误的答案。

    编辑:正如jpountz指出的,我对OR的计算是错误的。应该:
    P(A U B) = 1 - P(~(AUB))
             = 1 - P((~A) & (~B))
             = 1 - P(~A)P(~B)
             = 1 - (1 - P(A))(1 - P(B))
             = 1 - (1 - P(A) - P(B) + P(A)P(B))
             = P(A) + P(B) - P(A)P(B)
    

    关于lucene - 在Lucene中,在不影响性能的情况下返回近似结果计数的公认方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10067017/

    10-12 16:38
    查看更多