solr主查询vs fq

Dmi*_*y z 12 solr

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

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

我不明白读这个,为什么然后任何人都会使用Q,因为基于我看到的所有答案和书籍,FQ似乎好得多.

除此之外,我确信可能存在这两个原因.

我想要的是弄清楚什么是最适合我的用例 - 文档中非常缺乏有用的示例.

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

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

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

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

问题:

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

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

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

C)q =客户: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.

谢谢您的帮助!

Jay*_*dra 19

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

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

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

所以,理想情况下,你应该检查的规定要求什么,如果你想搜索应该总是使用q,如果你想过滤器/限结果,你应该使用fq.

方面只是结果的插件,不会影响您的结果.


Pai*_*ook 3

回答您的问题:

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

  • 当用户第一次进入 UI 时,由于您只显示构面,我建议您使用q=<id field>:*索引<id field>中的文档 ID 并设置 rows=0. 再次在 fq 值中使用日期限制。指定rows=0将生成仅构面查询,参考Solr - 获取构面计数而不返回结果