我在使用Solr时遇到了一个问题。我们最近从Lucene切换到Solr。
我们有4个(主要)搜索字段:essence, keywords, allSearchable和quality;其中,对于索引中的每个文档,essence包含关键字中不间断的前3个单词。"keywords"只是一个关键词列表。而'allSearchable'保存的数据只是给定文档的其他数据的集合。我们在lucene中所做的是对用户在搜索框中输入的任何给定搜索进行3次搜索(以便根据相关性对搜索结果进行排序),如下所示:
输入搜索框的字:tree
查询1:+essence:tree
(sort by 'quality')如果查询1返回了我们想要获取的页面,那么返回。
查询2:+keywords:tree
(sort by 'quality')如果查询1和查询2的组合返回的结果足以匹配当前页面,则返回结果
查询3:+allSearchable:tree
(按'quality'排序)返回结果。如果没有,那你真倒霉。
我的问题是分页。我过去不需要发送分页(startIndex, rows)到Lucene。我可以请求所有内容,然后滚动返回的所有内容,收集足够的结果返回,这取决于我请求的页面。对于Solr,我必须传递分页参数。我们的索引中有超过800万个文档,所以要得到所有匹配查询的文档,比如"树",代价太大了。问题是,如果我在查询1中请求第3页,而我没有得到足够的结果,那么我必须继续查询2(关键字:树)。但这是不对的,因为我要求查询2的第3页的结果(换句话说,给我所有与第3页"keywords:tree"匹配的文档)。但这不是我真正想问的问题。我只想要求关键字的第一页,如果本质不匹配任何东西。等等......
我真正想要的是一个查询,这足以满足我之前所做的这三个查询,这样我就可以首先获得本质匹配,关键字匹配第二,以及allSearchable匹配最后。
我试着用这个查询使用boost: essence:tree^4.0 keywords:tree^2.0 allSearchable:tree^1.0
但这似乎不起作用,我不知道为什么?我把排序表拿出来了,结果还是不正确。我使用默认的标准请求处理程序(它似乎使用LuceneQueryParser(不是dismax或edismax))。我可以看到提升正在URL中被发送到solr(我通过向solrconfig.xml中的requestHandler的默认部分添加qf参数来使用提升)。我当然知道lucene可以理解这些参数。有没有人能告诉我,我如何能够构建一个查询,让我得到的结果,就像我想上面概述的?enter code here
我建议使用ExtendedDismax查询解析器(eDisMax),然后您可以指定跨字段的提升,如下面的示例所示:
http://localhost:8983/solr/select/?q=tree
&defType=edismax&qf=essence^4.0+keywords^2.0+allSearchable^1.0
您可能需要上下调整各个字段的增强值以获得所需的结果。此外,eDisMax还有一些额外的参数会影响提升以及如何执行查询,您应该检查这些参数。