2012-01-04 93 views

回答

48

FilterQuery只存储文档IDS。这使得应用过滤器包含/排除文档的速度非常快。这方面的好例子是根据国家,产品类型,可用性等搜索过滤产品。

正常查询可以执行完全相同的功能,但它有一个非常复杂的评分系统来确定“相关性”。我相信该文档指出评分只在主查询上完成,而不是在过滤器查询上完成。这也应该增加查询速度。

所以,我可以查询:

description:Kohler AND productType:Toilet 

或者,我可以查询:

description:Kohler 
with a FQ of productType:Toilet 

结果将是相同的,但分数会有所不同。另外,如果在productType:Toilet的整个一天中收到许多不同的查询,FilterQuery将被缓存,从而使整个查询时间更快。

+1

因此,如果例如在索引处对“productType”有术语提升,则如果在FilterQuery而不是主Query中设置productType,则可以对结果进行不同的排序,例如如果它位于Query中,那些带有较高的productType分数将位于顶部,而如果它位于FilterQuery中,则具有较高productType分数的那些文档可能位于底部,因为由于分数位于FilterQuery中,所以未应用分数。我理解你吗? – mrd3650 2012-01-05 08:15:55

+0

正确。但是,如果您将productType作为AND子句放在主Query中,则无论如何您都不会返回任何其他productType。所以这可能是有限的价值。但是,你所说的话意味着你明白它是如何工作的。 – rfeak 2012-01-05 15:49:29

+0

是的,你有一个观点,因为我错误地假设productType上有一个FTS(因此可能会返回多个productType,但通常在* Type上没有FTS)。谢谢。 – mrd3650 2012-01-06 09:02:08

3

fq适用于固定的值列表。如果在q =天窗+立体声上搜索,并且fq = Mustang solr将对q参数进行文本分析,因为q =天窗+立体声和q =立体声+天窗将返回相同的结果集。但是,当通过fq过滤搜索时,没有对fq参数应用分析,并且假设所有返回的文档都将与fq匹配,因此不需要修改匹配的文档的分数。