如何让Solr查询结果保持查询术语的原始顺序?
解决Solr按查询术语原始顺序返回结果的问题
我之前也碰到过一模一样的需求!要让Solr严格按照你查询时指定的名称顺序返回结果,核心就是绕过它默认的得分排序逻辑,这里有几个靠谱的实战方案:
方案一:使用ord()函数配合sort参数(最推荐)
Solr内置的ord()函数可以帮你给匹配指定术语的文档分配自定义排序权重,完全忽略默认的得分计算。具体操作很直接:
- 在查询中指定要匹配的名称集合
- 通过
sort参数调用ord()函数,按照你想要的顺序传入术语,让Solr按这个规则排序
示例查询
http://your-solr-instance/solr/your-core/select ?q=name:(Alice Bob Charlie) &sort=ord(name, "Alice", "Bob", "Charlie") asc &fl=name,id,other_required_fields &fq=name in ("Alice","Bob","Charlie") # 可选:过滤掉不匹配的文档
原理说明
ord(name, "Alice", "Bob", "Charlie")会给匹配Alice的文档赋值1,匹配Bob的赋值2,匹配Charlie的赋值3- 加上
asc升序排序后,结果就会严格按照你查询时的术语顺序返回 - 可选的
fq参数可以确保只返回你指定的名称对应的文档,避免无关结果混入
方案二:使用edismax查询配合自定义boost排序
如果你习惯用edismax查询解析器,也可以通过调整参数实现,但这个方案的稳定性稍逊于方案一:
- 设置
tie=0,让Solr只保留完全匹配最高权重术语的排序逻辑 - 给每个术语分配不同的boost值,然后按得分降序排序,比如给第一个术语boost 3,第二个2,第三个1
示例查询
http://your-solr-instance/solr/your-core/select ?q=name:Alice^3 name:Bob^2 name:Charlie^1 &defType=edismax &tie=0 &sort=score desc
注意:如果有文档匹配多个术语,这个方案可能会出现顺序错乱,所以更推荐方案一。
额外注意事项
- 如果你的术语里包含空格、特殊字符,记得用引号包裹并做适当转义
- 如果某个术语没有匹配到任何文档,它不会出现在结果里(如果用了
fq的话),或者会被排到最后 ord()函数从Solr 4.0版本开始支持,如果你用的是更老的版本,可能需要升级或者用客户端二次排序的方案
内容的提问来源于stack exchange,提问作者viren
相关产品推荐
相关产品推荐

