我阅读了同一个问题的所有答案,并且我不清楚哪个应该用于我的用例以及为什么。 两者都返回相同的结果。 我理解" FilterQuery将被缓存,使整个查询时间更快",就像有人正确回答一样。
我也理解"过滤还允许对构面进行标记,因此您可以标记构面以包含为查询返回的所有构面,就像其他人也正确回答一样。
我不明白读这个,这就是为什么任何人都会使用Q,因为基于我所见过的所有答案和书籍,FQ似乎好得多。
除此之外,我确定可能存在两者兼有的原因。
我想要的是找出对我的用例最好的东西 - 文档中非常缺乏有用的示例。
业务规则#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 =客户端... 的
今天,我有D)在所有情况下使用,但我怀疑这是错误的并且在Solr(版本3.6)中导致OOM。
感谢您的帮助!
答案 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