solr实现竞价排行

需求背景

有时候我们查询一个分页数据列表时,往往需要根据特定的查询条件将部分数据置顶

举例

查询一个带分页的活动车系列列表接口,需要按照用户画像车系置顶推荐三个车系
第一页:S1、S2、S3、S4、S5、S6、S7、S8、S9、S10
第二页:S11、S12、S13、S14、S15、S16、S17、S18、S19、S20
用户画像车系为S14、S10、S18,现在需要将S14、S10、S18置顶,提高优先级
第一页:S14、S10、S18、S1、S2、S3、S4、S5、S6、S7
第二页:S8、S9、S11、S12、S13、S15、S16、S17、S19、S20

实现方式

solrconfig.xml添加elevator

<searchComponent name="elevator" class="solr.QueryElevationComponent">
    <str name="queryFieldType">string</str>
    <str name="config-file">elevator.xml</str>
  </searchComponent>

  <requestHandler name="/elevate" class="solr.SearchHandler">
    <lst name="defaults">
    </lst>
    <arr name="last-components">
      <str>elevator</str>
    </arr>
  </requestHandler>

创建elevator.xml文件,由于一般都是从solr中查询出需要置顶的索引id,动态查询,所以我这边elevator.xml设置为null

<elevate>
</elevate>

配置完成后重启服务(注:主从文件都要修改),这样solr服务就支持/elevate查询

具体使用

  • 首先我们需要根据需求把用户画像车系对应solr的主键id查出来,用英文逗号连接(elevateIds = S14,S10,S18)
  • 查询solr时用/elevator
solrQuery.set("qt", "/elevate");

SolrQuery solrQuery = new SolrQuery(SolrConst.Q_DEFALUT_VALUE);
// 将查出来的elevateIds传入参数并开启
solrQuery.setParam("elevateIds", elevateIds)
                    .setParam("forceElevation", "on");
  • solr中查询语句

http://127.0.0.1:9090/solr/test/elevate?q=%3A&group=true&group.field=SeriesId&group.limit=1&group.sort=VersionSort+DESC%2Crand_39861+ASC&group.ngroups=true&elevateIds=152137_110100_3248%2C152229_110100_692%2C152368_110100_3158&forceElevation=on&fl=SeriesId%2CActivityId&fq=CityId%3A110100+AND+SubjectId%3A82&start=0&rows=6&sort=HistorySeriesLeadsCount+desc&qt=%2Felevate