2012-07-24 58 views
25

我有一个〜1密耳的产品文档Solr索引。我还有一大堆UI过滤器,例如类别,选项卡,价格范围,大小,颜色和其他一些过滤器。Solr查询(q)或过滤器查询(fq)

是否有正确的方式让q选择所有的东西(q=\*:\*)而fq中的所有其他过滤器?例如:

fq=(catid:90 OR catid:81) AND priceEng:[38 TO 40] AND (size:39 OR size:40 OR size:41 OR size:50 OR size:72) AND (colorGroup:Yellow OR colorGroup:Violet OR colorGroup:Orange ... AND (companyId:81 OR companyId:691 OR companyId:671 OR companyId:628 OR companyId:185 OR companyId:602 OR ... AND endShipDays:[* TO 7])

对我来说,一切从类别companyIds,从颜色和尺寸等仅仅是过滤器。这种方法在未来增长中的表现会出现什么问题?我应该在q中加入一些查询,哪些?

谢谢

回答

40

只要有可能,最好在普通查询上使用过滤器查询。

FilterQuery能够利用FilterCache,与您的查询相比,这将大大提升性能。

+0

好吧,它看起来几乎任何东西都可以在fq xD。 q只是*和fq作为一个长期的azz查询真的可以吗? – 2012-07-24 09:30:27

+0

y .....因为这将能够利用过滤器缓存并提供性能提升。 – Jayendra 2012-07-24 09:51:13

+0

此外,过滤器查询不会影响Solr分数。 – javanna 2012-07-25 07:42:46

4

我使用的方式qfq。 我在qfq上应用全文搜索。 比方说你有场关键字,你要和领域的全文搜索为架构中的定义与copyField

<copyField source="id" dest="keyword"/> 
<copyField source="category" dest="keyword"/> 
<copyField source="product_name" dest="keyword"/> 
<copyField source="color" dest="keyword"/> 
<copyField source="location" dest="keyword"/> 
<copyField source="price" dest="keyword"/> 
<copyField source="title" dest="keyword"/> 
<copyField source="description" dest="keyword"/> 

我的查询看起来像

/select?q={keyword}&fq=category:fashion&fq=location:nyc 

/select?q=jeans&fq=category:fashion&fq=location:nyc 

由于digitaljoel建议,如果您必须查询多个字段,那么使用多个fq(参考上面的查询)而不是使用AND和OR可能更好q

注:在我的情况q默认是指现场关键字在solrconfig.xml中定义

<requestHandler name="/select" class="solr.SearchHandler"> 
<!-- default values for query parameters can be specified, these 
    will be overridden by parameters in the request 
    --> 
<lst name="defaults"> 
    <str name="echoParams">explicit</str> 
    <int name="rows">10</int> 
    <str name="df">keyword</str> 
</lst> 
6

我想看看有关字段以下几点,以便决定:

  1. 你的领域是否有固定的提升分数,或者你是否需要为这个领域得分?如果是,则将其置于查询中,因为如上所述,过滤器查询不使用分数。
  2. 经常使用该字段的条件吗?如果是的话 - 同样如前所述,过滤器缓存可能会带来巨大的优势,但如果没有 - 它可能会更慢。
  3. 您的索引是否不变?这有点类似于#2。如果您的索引频繁更新,过滤器查询的使用可能会成为瓶颈,而不是提高性能。

关于#3的一些注意事项:根据我的经验,我有一个大的索引,每隔几秒就会填充新的文档,autoSoftCommit也设置为几秒钟。在软提交期间,新的搜索者被打开,导致缓存失效。那么究竟发生了什么,滤波器命中率几乎总是为0。 我可以告诉更多:我发现第一个过滤器查询运行比查询运行更加昂贵,所有这些过滤条件都移动到“q”而不是“fq”。例如,当我使用“AND”将所有“fq”条件移动到主查询中时,我的查询花费了1秒时间处理5个筛选查询(无缓存命中)和147毫秒。但是当然,当我停止索引更新时,由于使用了缓存,相同的筛选查询花费了0毫秒。所以这是要考虑的事情。

另外一些其他问题的提问:

  • 尝试从来没有在查询中使用通配符。它显着影响性能。因此,而不是“”我会建议使用一个条件是不太恒定的每个请求(最不变的每个请求,它不需要你想要放到“fq”的分数)
  • 范围搜索也更好地避免(如果可能的话)。并且使用通配符进行范围搜索。这是关于你的“endShipDays:[* TO 7]”。例如,使用“endShipDays:(1 2 3 4 5 6 7)”会更有效,但这只是一个例子,有很多方法。

希望它有帮助。