【问题标题】:Multiple queries in SolrSolr 中的多个查询
【发布时间】:2013-07-12 07:22:55
【问题描述】:

我的问题是我在 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 个结果。所以刻面不是一种选择。

【问题讨论】:

    标签: search solr lucene solrj solr4


    【解决方案1】:

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

    +(first query) +(new query)
    

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

    q=field:query2&fq=categoryField:query1
    

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

    【讨论】:

      【解决方案2】:

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

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

      另见a question discussing this issue from the opposite direction

      【讨论】:

      • Thanx Alexandre,根据我的初步测试,我可以说它确实解决了我的问题。我还看到所花费的时间比 Gus 的解决方案要少得多。您和 Gus 的解决方案相结合应该可以全面解决我的问题。
      【解决方案3】:

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

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

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

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

      【讨论】:

      • Thanx Gus,我认为这是满足我要求的好方法,我正在对其进行更多探索,将进行一些测试,看看它是如何工作的。感谢您的帮助。
      【解决方案4】:

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

      【讨论】:

      • 嘿thanx,我知道方面,但我不想使用它。向下钻取部分,我想在程序中进行。最终用户只会看到最终的 50 个结果集,其他什么都看不到。在第一次查询之后,我想对使用完全不同的参数获得的结果进行第二次查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2017-10-12
      相关资源
      最近更新 更多