假设我有一个lucene查询'id1或id2或id3 ... idN'。随着N的增加,这种规模有多好?
我所看到的情况与在购物车中对产品进行文本搜索的人类似,但他们的购物车可能有数百或数千种商品。用户想要在购物车中的所有产品上进行文本搜索。我可以针对所有可用产品进行文本查询,然后在购物车中使用产品ID的OR子句限制返回的商品吗?
答案 0 :(得分:4)
默认情况下,布尔查询中的最大子句数为1024。您可以增加此限制。但是会有性能损失。我想,如果你改用过滤器会很有效。
答案 1 :(得分:2)
有些人已经回答,但存在实际限制。但是,如果您对该理论感兴趣,那么在执行一系列OR'd术语与具有大量可能结果的单个术语之间实际上没有区别。如果p是与您的查询匹配的发布数(术语/ doc对),并且您想要找到k个最佳匹配项,则查询将在O(p log k)中运行。请参阅Doug的论文Space Optimizations for Total Ranking。
如果你有q个查询项或者在你的索引总数中有t个术语,它实际上就像O(q log t + p log k),但是对于大多数应用程序来说,p log k将占主导地位。 (这个公式来自这样一个事实:它需要记录时间来查找发布流,并且每个查询字词必须执行一次。)
答案 2 :(得分:1)
正如@Shashikant Kore所说,默认情况下限制为1024.
如果您有一个非常大的文本集合,您可能需要查看MoreLikeThis实现 - 它使用一些简洁的启发式方法从您拥有的内容生成代表性查询。
答案 3 :(得分:1)
在搜索时使用FilteredQuery。它的构造函数接受查询和过滤器。根据用户输入的内容创建查询(查看QueryParser)。从产品ID列表中创建过滤器(请查看TermsFilter)。
答案 4 :(得分:0)
查询中的布尔语句数量有限制。