Solr中的多个查询

时间:2013-07-12 07:22:56

标签: search solr lucene solrj solr4

我的问题是我在Solr中有n个字段(比如大约10个)可搜索,它们都被编入索引并存储。我想首先在我的5000个文档的整个索引上运行一个查询,这个文档将平均达到500个文档。接下来,我想在这500个文档上使用不同的关键字集进行查询,而不是在整个索引上查询。

因此,当我第一次发送查询时,将生成一个分数,第二次运行查询时,生成的新分数应该基于上一个查询的500个文档,或者换句话说,Solr应该只考虑这500个docs作为整个索引。

总而言之,5000的索引将被过滤到500然后50(5000> 500> 50)。它基本上是过滤但我想在Solr中做到这一点。

我有合理的基础知识,仍在学习。

更新:如果以数学方式表示,它将如下所示:

results1=f(query1)
results2=f(query2, results1)
final_results=f(query3, results2)

我希望使用程序完成此操作,最终用户只能看到50个结果。因此,分面不是一种选择。

4 个答案:

答案 0 :(得分:5)

我可能会遇到两种可能的实施方式。最简单的方法是将第一个查询添加到第二个查询中;

+(first query) +(new query)

如果要筛选的第一个查询经常更改,这是一种很好的方法。如果第一个查询类似于文档类别,或类似的地方,您可以从重用相同的过滤器中受益,那么过滤查询是更好的方法,使用fq parameter,如:

q=field:query2&fq=categoryField:query1

过滤查询缓存一组文档ID以进行过滤,因此对于常用搜索(如类别,常见日期范围等),可以从中获得显着的性能优势(适用于不常见的搜索或用户输入的搜索)字符串,它可能只会产生不必要的开销来缓存结果,并使用无用的结果集污染缓存)

答案 1 :(得分:3)

Filter queries (fq)专门用于通过不进行任何分数计算来快速限制结果集。

因此,如果您将第一个查询放入fq参数并将第二个得分生成查询放入正常的“q”参数中,它应该按照您的要求执行。

另见a question discussing this issue from the opposite direction

答案 2 :(得分:2)

我相信你想使用这样的嵌套查询:

text:"roses are red" AND _query_:"type:poems"

您可以在此处详细了解嵌套查询:

http://searchhub.org/2009/03/31/nested-queries-in-solr/

答案 3 :(得分:0)

应该看看Solr的“分面搜索”:http://wiki.apache.org/solr/SolrFacetingOverview这将有助于您进行这种“迭代”搜索。