Solr查询(q)或过滤查询(fq)

Tom*_*ord 28 solr

我有一个~1 mil产品文档Solr索引.我还有一大堆UI过滤器,如类别,标签,价格范围,尺寸,颜色和其他一些过滤器.

(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中放一些查询,哪些?

谢谢,

Jay*_*dra 47

在任何可能的情况下,最好使用普通查询过滤查询.

FilterQuery能够利用FilterCache,与查询相比,这将是一个巨大的性能提升.

  • 在清晰的SOLR训练中,他们建议你做多个fq参数,而不是出于性能原因加入AND的单个参数.所以在样本中它将是q =*:*&fq =(catid:90 OR catid:81)&fq = priceEng:[38 to 40]&fq = ....等 (14认同)
  • 好吧,看起来几乎任何东西都可以在 fq xD 中。将 q 只是 * 和 fq 作为长 azz 查询真的可以吗? (2认同)

Yur*_* K. 9

为了做出决定,我会看一下有关字段的以下几点:

  1. 你的领域是否有固定的助推分数,或者你是否需要对这个领域进行评分?如果是,请将其置于查询中,因为如上所述,过滤查询不使用分数.
  2. 该字段的条件是否经常使用?如果是 - 再次,如前所述,过滤器缓存可能会带来巨大的优势,但如果没有 - 它可能会更慢.
  3. 你的指数是否恒定?这有点类似于#2.如果您的索引经常更新,过滤查询的使用可能会成为瓶颈,而不是提高性能.

关于#3的一些注意事项:根据我的经验,我有一个大的索引,每隔几秒就会填充新的文档,而autoSoftCommit也设置为几秒钟.在软提交期间,打开了新的搜索器,这使得缓存无效.所以真正发生了什么,过滤器命中率几乎总是0.我可以说更多:我已经发现第一次过滤查询运行比查询运行更昂贵,所有这些过滤条件都移到"q"而不是" FQ".例如,当我使用"AND"将所有"fq"条件移动到主查询中时,我的查询花了1秒钟进行了5次筛选查询(没有缓存命中)和147ms.但当然,当我停止索引更新时,相同的过滤器查询花了0毫秒,因为使用了缓存.所以这是需要考虑的事情.

您的问题还有其他几点:

  • 尽量不要在查询中使用通配符.它会显着影响性能..因此,而不是" : "我会建议使用一个条件是不太恒每个请求(最恒定每个请求它不需要分数要投入到"FQ")
  • 还可以更好地避免范围搜索(如果可能).并使用通配符搜索范围甚至更多.这是关于你的"endShipDays:[*TO 7]".例如,使用"endShipDays:(1 2 3 4 5 6 7)"会更有效,但这只是一个例子,有很多方法.

希望能帮助到你.


Man*_*ddy 5

我使用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"/>
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像

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

/select?q=jeans&fq=category:fashion&fq=location:nyc
Run Code Online (Sandbox Code Playgroud)

正如digitaljoel建议的那样,如果你需要查询多个字段,那么最好使用多个fq(参考上面的查询)而不是使用AND和OR与q

注意:在我的情况下,q default指的是solrconfig.xml中定义的field 关键字

<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>
Run Code Online (Sandbox Code Playgroud)