1

我在使用 Solr 时遇到了提升问题。我们最近从 Lucene 切换到了 Solr。

我们有 4 个(主要)搜索字段供我们搜索:本质、关键字、allSearchable 和质量;其中,对于索引中的每个文档,essential 包含关键字中的前 3 个非停用词。“关键字”只是关键字列表。'allSearchable' 保存的数据只是给定文档的其他数据的集合。我们在 lucene 中所做的是对用户在搜索框中键入的任何给定搜索进行 3 次搜索(以便按相关性对搜索结果进行排名),如下所示:

在搜索框中输入的单词:tree

查询 1:( +essence:tree按“质量”排序)如果查询 1 返回的页面足够我们想要获取的页面,则返回。

查询 2:( +keywords:tree按“质量”排序)如果查询 1 和查询 2 的组合为我们所在的页面返回了足够的结果,则返回结果。

查询 3:( +allSearchable:tree按“质量”排序)返回结果。如果没有,那就倒霉了。

我的问题是分页。我以前不必将分页(startIndex,行)发送到 Lucene。我可以要求所有内容,然后翻转我返回的所有内容,收集足够的结果以返回,具体取决于我要求的页面。使用 Solr,我必须传递分页参数。我们的索引中有超过 800 万个文档,因此要获取与“树”之类的查询匹配的所有内容太昂贵了。问题是,如果我在查询 1 中请求第 3 页,但我没有得到足够的结果,那么我必须继续查询 2(关键字:树)。但这是不对的,因为我要求查询 2 的第 3 页结果(换句话说,给我与第 3 页的“关键字:树”匹配的所有文档)。但这并不是我真正想问的问题。如果本质不匹配任何内容,我只想询问关键字的第 1 页。等等。

我真正要找的是一个查询,这足以满足我之前所做的这三个查询,这样我首先得到本质匹配,其次是关键字匹配,最后是 allSearchable 匹配。

我尝试对这个查询使用提升: essence:tree^4.0 keywords:tree^2.0 allSearchable:tree^1.0

但这似乎不起作用,我不知道为什么?我拿出了各种东西,但事情仍然没有给我正确的结果。我正在使用默认的 StandardRequestHandler(它似乎使用 LuceneQueryParser(不是 dismax 或 edismax)。我可以看到提升正在发送到 URL 中的 solr(我通过在我的 requestHandler 的默认部分添加一个 qf 参数来使用提升) solrconfig.xml)。我当然知道 lucene 可以理解这些参数。谁能告诉我如何构造一个查询,让我得到我想要的结果,如上所述?enter code here

4

1 回答 1

0

我建议使用ExtendedDismax 查询解析器 (eDisMax),然后您可以指定跨字段的提升,如下例所示:

http://localhost:8983/solr/select/?q=tree
  &defType=edismax&qf=essence^4.0+keywords^2.0+allSearchable^1.0

您可能需要在字段中向上或向下调整提升值以获得所需的结果。此外,eDisMax 还有其他影响提升的参数以及您应该检查的查询执行方式。

于 2013-03-12T15:16:21.203 回答