【问题标题】:Comparison of two Solr queries两个 Solr 查询的比较
【发布时间】:2011-12-06 12:38:27
【问题描述】:
自行假设以下内容:
-
q=foo 返回 200 万个结果
-
q=type:SalesOrder 返回 300,000 个结果
-
q=refId:12345 返回 2,000 个结果
默认运算符是 OR。
如果用户会像我在下面列出的那样进行许多查询:
即,
-
查询 A: q=foo&fq=type:SalesOrder&fq=refId:12345
或
-
查询 B: q=(foo AND type:SalesOrder AND refId:12345)
我想使用哪个?我知道各个 fq 将被缓存,但我想知道 Solr 将在内存中执行的操作是否存在差异,或者当 Solr 进行此类大型计算时我可能不知道。最终结果都是一样的,但各有什么优缺点呢?
【问题讨论】:
标签:
java
performance
memory-management
lucene
solr
【解决方案1】:
查询 A:q=foo&fq=type:SalesOrder&fq=refId:12345
如果您想限制过滤器中的结果数量,而不是搜索您应该使用过滤器查询的字段。
fq - 提供可选的过滤查询。查询的结果仅限于搜索过滤查询返回的那些结果。 Filtered queries are cached by Solr。它们对于提高复杂查询的速度非常有用。
如果您的情况似乎要过滤掉类型为 SalesOrder 和 refid 12345 的结果,过滤查询似乎是正确的,而不是在查询 q 参数中使用它们。
【解决方案2】:
查询 A:您有一个正在过滤的“foo”的第一个结果集
查询 B:您有三个要计算交集的结果集。
因此,例如,如果“type:SalesOrder”给出了一个巨大的结果集,queryA 的效率会更高。
如果查询不是带有分析器的纯文本,而是一个 ID,例如 (shop:1234),最有效的方法是使用给出最小结果集的查询 (q=refId:12345也许?)并使用其他两个参数作为过滤器