solr主查询vs fq

时间:2013-02-14 01:15:02

标签: solr

我阅读了同一个问题的所有答案,并且我不清楚哪个应该用于我的用例以及为什么。 两者都返回相同的结果。 我理解" FilterQuery将被缓存,使整个查询时间更快",就像有人正确回答一样。

我也理解"过滤还允许对构面进行标记,因此您可以标记构面以包含为查询返回的所有构面,就像其他人也正确回答一样。

我不明白读这个,这就是为什么任何人都会使用Q,因为基于我所见过的所有答案和书籍,FQ似乎好得多。

除此之外,我确定可能存在两者兼有的原因。

我想要的是找出对我的用例最好的东西 - 文档中非常缺乏有用的示例。

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

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

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

事实:我们认为这是一个缓慢而不是搜索的方面。

问题:

鉴于此搜索条件,以及这些编写查询的方法: 的

A)q =日期:20130214 AND客户:Joe& facet.field = date& facet.field =客户端...

B)q =日期:20130214& fq =客户:Joe& facet.field = date& facet.field =客户端...

C)q =客户:Joe& fq = date:20130214& facet.field = date& facet.field =客户端...

D)q = *:*& fq = date:20130214& fq =客户:Joe& facet.field = date& facet.field =客户端...

  • 您认为上述哪一项最好?为什么?请记住,大多数查询将针对20130214
  • 运行
  • 首先执行FQ过滤,然后应用Q条件,或者反过来?

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:19)

q查询是请求的主要查询 它允许您实际搜索多个字段 q查询将决定每个文档具有什么分数,因此将参与相关性计算。

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

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

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

Facets只是结果的一个插件,不会影响你的结果。

答案 1 :(得分:3)

回答你的问题:

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

  • 当用户第一次访问用户界面时,由于您只是显示方面,我建议您使用q=<id field>:*,其中<id field>是您在索引中的文档ID,并设置{{1 }}。再次使用fq值中的日期限制。指定rows=0将生成仅分面查询,引用Solr - Getting facet counts without returning results