Solr vip竞价排名

【传智播客.黑马程序员训练营成都中心】

  • 转载请注明出处

作者: 成都校区.强哥

1.功能介绍

本文将使用solr完成vip等级排名,这里并不是简单的按照vip等级排序。而是在使用solr条件查询(不使用排序)的时候将符合条件并且具有vip等级的数据显示在前面,这个时候咱们就要使用solr底层提供的自定义评分机制来完成。

2.环境介绍

开发环境:IDEA + SpringBoot

solr环境:solr4.10 + tomcat7

备注:solr环境+tomcat环境+IK中文分词配置自行安装

3.准备工作

(1) solr环境安装+tomcat环境+IK分词配置(自行完成)
检查solr环境:浏览器地址栏输入http:localhost:8080/solr出现如下页面即可:

image

检查IK中文分词器,有如下中文分词效果即可
image

(2) 在solr的collection目录下的<span style="color:red">schema.xml</span>中添加如下业务域.
一下业务域中包含:商品标题、商品介绍、商品价格、商品创建时间、商品点击次数、商品所属商家vip等级、商品评价。

 <!-- general -->  
<!-- 商品标题 -->   
<field name="t_title" type="text_ik" indexed="true" stored="true" />
<!-- 商品介绍 -->   
<field name="t_intr" type="text_ik" indexed="true" stored="true" />
<!-- 商品价格 -->   
<field name="t_price" type="float" indexed="true" stored="true" />
<!-- 商品创建时间 -->   
<field name="t_createTime" type="tdate" indexed="true" stored="true" />
<!-- 商品点击次数-->   
<field name="t_point" type="long" indexed="true" stored="true" />
<!-- 商品所属商家vip等级[1-5级] -->   
<field name="t_vip" type="long" indexed="true" stored="true" />
<!-- 商品评价-->   
<field name="t_assess" type="long" indexed="true" stored="true" />

<!-- 设置关键字搜索域-->   
<field name="t_searchText" type="text_ik" indexed="true" stored="false" multiValued="true" />

<!-- 设置关键字域复制标题和介绍 -->   
<copyField source="t_title" dest="t_searchText" />
<copyField source="t_intr" dest="t_searchText" />
<!-- 将关键字搜索域设置默认搜索域-->   
<defaultSearchField>t_searchText</defaultSearchField>

<solrQueryParser defaultOperator="AND"/>

4.工程搭建

(1) 使用IDEA搭建maven工程

(2) 在pom.xml中加入以下jar依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-solr</artifactId>
    </dependency>
</dependencies>

(3) 编写springBoot启动类SpringbootSolr5Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootSolr5Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootSolr5Application.class, args);
    }
}

(4) 在resources目录下创建application.properties加入一下内容:

spring.data.solr.host=http://localhost:8080/solr/

(5) 编写CustomSortTest.java初始化查询数据:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomSortTest {

    @Autowired
    private SolrClient client;

    /**
     * 初始化solr索引数据
     * */
    @Test
    public void initSolrData() throws Exception{
        List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
        for(int i=0;i<100;i++){
            SolrInputDocument document = new SolrInputDocument();
            //文档id
            document.setField("id",i);
            //商品标题
            document.setField("t_title","new"+i+"- 三星 W"+i*100+" 黑色 电信3G手机 双卡双待双通");
            //商品介绍
            document.setField("t_intr","下单送12000毫安移动电源!双3.5英寸魔焕炫屏,以非凡视野纵观天下时局,尊崇翻盖设计,张弛中,尽显从容气度!");
            //价格
            document.setField("t_price","8000");
            //创建日期
            document.setField("t_createTime",new Date());
            //点击率
            document.setField("t_point",i%9+9);
            //评价分数
            document.setField("t_assess",i%11+5);
            //vip等级[1-5]
            document.setField("t_vip",i%5);
            docs.add(document);
        }
        client.add(docs);
        client.commit();
    }
}

(5) 编写一下方法看一下默认条件查询:<span style='color:red'>三星</span>的效果:

@Test
public void defualtQuerySort() throws Exception{
    SolrQuery solrQuery = new SolrQuery();
    //关键词
    solrQuery.set("q","t_searchText:*三星*");
    //分页,0开始,每页10条,setStart设置的就是显示第几页
    solrQuery.setStart(0);
    solrQuery.setRows(10);
    //执行查询
    QueryResponse response = client.query(solrQuery);
    //文档结果集
    SolrDocumentList results = response.getResults();
    System.out.println("查询到的总条数:"+ results.getNumFound());
    //遍历查询的结果
    for (SolrDocument solrDocument : results) {
        String id = solrDocument.get("id").toString();
        String title = solrDocument.get("t_title").toString();
        String assess = solrDocument.get("t_assess").toString();
        double point = Double.valueOf(solrDocument.get("t_point").toString());
        double vip = Double.valueOf(solrDocument.get("t_vip").toString());
        System.out.println("id:"+id+"  标题:"+title+"  评价:"+assess+ "点击率:"+point+"  vip等级:"+vip+"  " );
    }

}

结果如下:

查询到的总条数:100

id:0 标题:new0- 三星 W0 黑色 电信3G手机 双卡双待双通 评价:5点击率:9.0 vip等级:0.0
id:1 标题:new1- 三星 W100 黑色 电信3G手机 双卡双待双通 评价:6点击率:10.0 vip等级:1.0
id:2 标题:new2- 三星 W200 黑色 电信3G手机 双卡双待双通 评价:7点击率:11.0 vip等级:2.0
id:3 标题:new3- 三星 W300 黑色 电信3G手机 双卡双待双通 评价:8点击率:12.0 vip等级:3.0
id:4 标题:new4- 三星 W400 黑色 电信3G手机 双卡双待双通 评价:9点击率:13.0 vip等级:4.0
id:5 标题:new5- 三星 W500 黑色 电信3G手机 双卡双待双通 评价:10点击率:14.0 vip等级:0.0
id:6 标题:new6- 三星 W600 黑色 电信3G手机 双卡双待双通 评价:11点击率:15.0 vip等级:1.0
id:7 标题:new7- 三星 W700 黑色 电信3G手机 双卡双待双通 评价:12点击率:16.0 vip等级:2.0
id:8 标题:new8- 三星 W800 黑色 电信3G手机 双卡双待双通 评价:13点击率:17.0 vip等级:3.0
id:9 标题:new9- 三星 W900 黑色 电信3G手机 双卡双待双通 评价:14点击率:9.0 vip等级:4.0
id:10 标题:new10- 三星 W1000 黑色 电信3G手机 双卡双待双通 评价:15点击率:10.0 vip等级:0.0

从结果可以看出默认排序是根据id进行排序。

(6) 完成自定义评分,在默认排序以<span style='color:red'>三星</span>为条件作同时以vip等级排序

 @Test
public void testVipPageQuery()throws Exception{
    SolrQuery solrQuery = new SolrQuery();
    //关键词
    solrQuery.set("q","t_searchText:*三星*");
    //分页,0开始,每页20条,setStart设置的就是显示第几页
    solrQuery.setStart(0);
    solrQuery.setRows(20);
     //设置权重方式为edismax
    solrQuery.set("defType","edismax");
    //scoreMethod为自定义评分规则,这里就是以t_vip+0的和来得到评分,然后以该评分进行排序
    String scoreMethod = "sum(t_vip,0)";
    solrQuery.set("bf", scoreMethod);
    //执行查询
    QueryResponse response = client.query(solrQuery);
    //文档结果集
    SolrDocumentList results = response.getResults();
    System.out.println("查询到的总条数:"+ results.getNumFound());
    //遍历查询的结果
    for (SolrDocument solrDocument : results) {
        String id = solrDocument.get("id").toString();
        String title = solrDocument.get("t_title").toString();
        String assess = solrDocument.get("t_assess").toString();
        String point = solrDocument.get("t_point").toString();
        String vip = solrDocument.get("t_vip").toString();
       //double point = Double.valueOf(solrDocument.get("t_point").toString());
       //double vip = Double.valueOf(solrDocument.get("t_vip").toString());
        System.out.println("id:"+id+"  标题:"+title+"  评价:"+assess+ "点击率:"+point+"  vip等级:"+vip+"  " );
    }
}

结果如下:

查询到的总条数:100

id:4 标题:new4- 三星 W400 黑色 电信3G手机 双卡双待双通 三星 评价:9点击率:13 vip等级:4
id:9 标题:new9- 三星 W900 黑色 电信3G手机 双卡双待双通 评价:14点击率:9 vip等级:4
id:14 标题:new14- 三星 W1400 黑色 电信3G手机 双卡双待双通 三星 评价:8点击率:14 vip等级:4
id:19 标题:new19- 三星 W1900 黑色 电信3G手机 双卡双待双通 评价:13点击率:10 vip等级:4
id:24 标题:new24- 三星 W2400 黑色 电信3G手机 双卡双待双通 三星 评价:7点击率:15 vip等级:4
id:29 标题:new29- 三星 W2900 黑色 电信3G手机 双卡双待双通 评价:12点击率:11 vip等级:4
id:34 标题:new34- 三星 W3400 黑色 电信3G手机 双卡双待双通 三星 评价:6点击率:16 vip等级:4
id:39 标题:new39- 三星 W3900 黑色 电信3G手机 双卡双待双通 评价:11点击率:12 vip等级:4
id:44 标题:new44- 三星 W4400 黑色 电信3G手机 双卡双待双通 三星 评价:5点击率:17 vip等级:4
id:49 标题:new49- 三星 W4900 黑色 电信3G手机 双卡双待双通 评价:10点击率:13 vip等级:4
id:54 标题:new54- 三星 W5400 黑色 电信3G手机 双卡双待双通 三星 评价:15点击率:9 vip等级:4
id:59 标题:new59- 三星 W5900 黑色 电信3G手机 双卡双待双通 评价:9点击率:14 vip等级:4
id:64 标题:new64- 三星 W6400 黑色 电信3G手机 双卡双待双通 三星 评价:14点击率:10 vip等级:4
id:69 标题:new69- 三星 W6900 黑色 电信3G手机 双卡双待双通 评价:8点击率:15 vip等级:4
id:74 标题:new74- 三星 W7400 黑色 电信3G手机 双卡双待双通 三星 评价:13点击率:11 vip等级:4
id:79 标题:new79- 三星 W7900 黑色 电信3G手机 双卡双待双通 评价:7点击率:16 vip等级:4
id:84 标题:new84- 三星 W8400 黑色 电信3G手机 双卡双待双通 三星 评价:12点击率:12 vip等级:4
id:89 标题:new89- 三星 W8900 黑色 电信3G手机 双卡双待双通 评价:6点击率:17 vip等级:4
id:94 标题:new94- 三星 W9400 黑色 电信3G手机 双卡双待双通 三星 评价:11点击率:13 vip等级:4
id:99 标题:new99- 三星 W9900 黑色 电信3G手机 双卡双待双通 评价:5点击率:9 vip等级:4

可以看出我们以自定义评分的方式,该结果就以vip等级最高的进行排序

备注:关于solr更多的自定义排序都是利用solr的Function Query函数进行的。可以自行查看solr的api进行学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容