5

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

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

总而言之,5000 的索引将被过滤为 500,然后是 50(5000>500>50)。它基本上是过滤,但我想在 Solr 中执行此操作。

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

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

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

我希望使用程序来完成此操作,最终用户只会看到 50 个结果。所以刻面不是一种选择。

4

4 回答 4

5

我想到了两种可能的实现。最简单的方法是将第一个查询添加到第二个查询;

+(first query) +(new query)

如果您要过滤的第一个查询经常更改,这是一个很好的方法。如果第一个查询类似于文档类别,或者类似的东西,您可以从重复使用相同的过滤器中受益,那么过滤器查询是更好的方法,使用fq参数,例如:

q=field:query2&fq=categoryField:query1

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

于 2013-07-12T16:14:21.197 回答
3

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

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

您可以在此处阅读有关嵌套查询的更多信息:

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

于 2013-07-12T15:34:50.003 回答
3

过滤器查询 (fq)专门设计用于通过不进行任何分数计算来快速限制结果集。

因此,如果您将第一个查询放入 fq 参数,并将第二个生成分数的查询放入普通的 'q' 参数中,它应该满足您的要求。

另请参阅从相反方向讨论此问题的问题

于 2013-07-14T14:34:07.740 回答
0

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

于 2013-07-12T07:47:26.257 回答