14

我阅读了同一问题的所有答案,但对于我的用例应该使用哪一个以及为什么使用这一点并不清楚。两者都返回相同的结果。我知道“FilterQuery 将被缓存,从而使整体查询时间更快”,就像有人正确回答一样。

我也明白“过滤还允许标记方面,因此您可以标记方面以包括为您的查询返回的所有方面”,就像其他人也正确回答一样。

我不明白阅读这篇文章的原因是为什么有人会使用 Q,因为根据我看过的所有答案和书籍,FQ 似乎要好得多。

除了,我敢肯定两者都存在可能是有原因的。

我想要找出最适合我的用例的方法——文档中非常缺乏有用的示例。

  • 我的文档有:日期、客户、报告和其他一些字段
  • 1 个营业日期 = 350 万份文件。
  • 文档总数为 2.5 亿并且还在增加(60 个日期 * 8000 个客户 * 1000 个报告)
  • 我对日期、客户、报告进行分面,并且我确实使用分面标记。
  • UI 整体看起来像任何电子商务网站,例如:亚马逊,左侧有多个方面。
  • 不使用评分。

业务规则 #1:日期必须始终出现在每个查询中。

业务规则 #2:99% 的查询将使用最新日期,但随机客户端和随机报告。

事实:我们确定是分面速度较慢,而不是搜索。

问题:

给定这个搜索条件,以及编写查询的这些方法:

A) q=date:20130214 AND client:Joe & facet.field=date & facet.field=client...

B) q=date:20130214 & fq=client:Joe & facet.field=date & facet.field=client...

C) q=client:Joe & fq= date:20130214 & facet.field=date & facet.field=client...

D) q=*:* & fq=date:20130214 & fq=client:Joe & facet.field=date & facet.field=client...

  • 您认为以上哪一项是最好的,为什么?请记住,大多数查询将针对 20130214 运行
  • 在 FQ 过滤中首先完成,然后应用 Q 条件,还是相反?

今天,我在所有情况下都使用了 D),但我怀疑这是错误的,并导致 Solr(版本 3.6)中的 OOM。

谢谢您的帮助!

4

2 回答 2

25

qquery 是 Request 的主要查询。
它可以让您实际搜索多个字段。
q查询将决定每个文档的分数,因此将参与相关性计算。

q=*:*只会返回具有相同分数的所有文档。

fq是用于过滤文档的过滤查询,与搜索无关。
因此,如果您有任何要过滤的固定值,您应该使用过滤器来限制您的结果。
fq不影响结果的评分。
在过滤时,Solr 使用过滤器缓存来增强后续过滤器查询的性能。

因此,理想情况下,您应该检查需求的要求。如果要搜索,则应始终使用q,如果要过滤/限制结果,则应使用fq.

构面只是结果的附加组件,不会影响您的结果。

于 2013-02-14T02:13:12.237 回答
3

要回答您的问题:

  • 根据您的业务规则,我建议您将日期放在 fq 值中,因为您总是按日期值限制(过滤)结果,并且听起来日期值可以被 Solr 重用。并且 Q 可以包含对随机客户端的搜索并根据需要报告值。

  • 当用户第一次来到 UI 时,由于您只显示方面,我建议您使用q=<id field>:*where <id field>is your document id in index 并设置 rows=0. 再次使用 fq 值中的日期限制。指定rows=0将生成仅方面的查询,参考Solr - 获取方面计数而不返回结果

于 2013-02-14T02:08:22.127 回答