更新時(shí)間:2020-04-07 來(lái)源:黑馬程序員 瀏覽量:
1.功能介紹本
文將使用solr完成vip等級(jí)排名,這里并不是簡(jiǎn)單的按照vip等級(jí)排序。而是在使用solr條件查詢(xún)(不使用排序)的時(shí)候?qū)⒎蠗l件并且具有vip等級(jí)的數(shù)據(jù)顯示在前面,這個(gè)時(shí)候咱們就要使用solr底層提供的自定義評(píng)分機(jī)制來(lái)完成。推薦了解黑馬程序員java培訓(xùn)課程。
2.環(huán)境介紹
開(kāi)發(fā)環(huán)境:IDEA + SpringBoot
solr環(huán)境:solr4.10 + tomcat7
備注:solr環(huán)境+tomcat環(huán)境+IK中文分詞配置自行安裝
3.準(zhǔn)備工作
(1) solr環(huán)境安裝+tomcat環(huán)境+IK分詞配置(自行完成) 檢查solr環(huán)境:瀏覽器地址欄輸入ttp:localhost:8080/solr出現(xiàn)如下頁(yè)面即可:
檢查IK中文分詞器,有如下中文分詞效果即可。
(2) 在solr的collection目錄下的schema.xml中添加如下業(yè)務(wù)域。一下業(yè)務(wù)域中包含:商品標(biāo)題、商品介紹、商品價(jià)格、商品創(chuàng)建時(shí)間、商品點(diǎn)擊次數(shù)、商品所屬商家vip等級(jí)、商品評(píng)價(jià)。
<!-- general -->
<!-- 商品標(biāo)題 -->
<field name="t_title" type="text_ik" indexed="true" stored="true" />
<!-- 商品介紹 -->
<field name="t_intr" type="text_ik" indexed="true" stored="true" />
<!-- 商品價(jià)格 -->
<field name="t_price" type="float" indexed="true" stored="true" />
<!-- 商品創(chuàng)建時(shí)間 -->
<field name="t_createTime" type="tdate" indexed="true" stored="true" />
<!-- 商品點(diǎn)擊次數(shù)-->
<field name="t_point" type="long" indexed="true" stored="true" />
<!-- 商品所屬商家vip等級(jí)[1-5級(jí)] -->
<field name="t_vip" type="long" indexed="true" stored="true" />
<!-- 商品評(píng)價(jià)-->
<field name="t_assess" type="long" indexed="true" stored="true" />
<!-- 設(shè)置關(guān)鍵字搜索域-->
<field name="t_searchText" type="text_ik" indexed="true" stored="false" multiValued="true" />
<!-- 設(shè)置關(guān)鍵字域復(fù)制標(biāo)題和介紹 -->
<copyField source="t_title" dest="t_searchText" />
<copyField source="t_intr" dest="t_searchText" />
<!-- 將關(guān)鍵字搜索域設(shè)置默認(rèn)搜索域-->
<defaultSearchField>t_searchText</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
4.工程搭建
(1) 使用IDEA搭建maven工程
(2) 在pom.xml中加入以下jar依賴(lài)
<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) 編寫(xiě)springBoot啟動(dòng)類(lèi)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目錄下創(chuàng)建application.properties加入一下內(nèi)容:
spring.data.solr.host=http://localhost:8080/solr/
(5) 編寫(xiě)CustomSortTest.java初始化查詢(xún)數(shù)據(jù):
@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomSortTest {
@Autowired
private SolrClient client;
/**
* 初始化solr索引數(shù)據(jù)
* */
@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);
//商品標(biāo)題
document.setField("t_title","new"+i+"- 三星 W"+i*100+" 黑色 電信3G手機(jī) 雙卡雙待雙通");
//商品介紹
document.setField("t_intr","下單送12000毫安移動(dòng)電源!雙3.5英寸魔煥炫屏,以非凡視野縱觀天下時(shí)局,尊崇翻蓋設(shè)計(jì),張弛中,盡顯從容氣度!");
//價(jià)格
document.setField("t_price","8000");
//創(chuàng)建日期
document.setField("t_createTime",new Date());
//點(diǎn)擊率
document.setField("t_point",i%9+9);
//評(píng)價(jià)分?jǐn)?shù)
document.setField("t_assess",i%11+5);
//vip等級(jí)[1-5]
document.setField("t_vip",i%5);
docs.add(document);
}
client.add(docs);
client.commit();
}
}
(6) 編寫(xiě)一下方法看一下默認(rèn)條件查詢(xún):三星的效果:
@Test
public void defualtQuerySort() throws Exception{
SolrQuery solrQuery = new SolrQuery();
//關(guān)鍵詞
solrQuery.set("q","t_searchText:*三星*");
//分頁(yè),0開(kāi)始,每頁(yè)10條,setStart設(shè)置的就是顯示第幾頁(yè)
solrQuery.setStart(0);
solrQuery.setRows(10);
//執(zhí)行查詢(xún)
QueryResponse response = client.query(solrQuery);
//文檔結(jié)果集
SolrDocumentList results = response.getResults();
System.out.println("查詢(xún)到的總條數(shù):"+ results.getNumFound());
//遍歷查詢(xún)的結(jié)果
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+" 標(biāo)題:"+title+" 評(píng)價(jià):"+assess+ "點(diǎn)擊率:"+point+" vip等
級(jí):"+vip+" " );
}
}
結(jié)果如下:
查詢(xún)到的總條數(shù):100
id:0 標(biāo)題:new0- 三星 W0 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):5點(diǎn)擊率:9.0 vip等級(jí):0.0
id:1 標(biāo)題:new1- 三星 W100 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):6點(diǎn)擊率:10.0 vip等級(jí):1.0
id:2 標(biāo)題:new2- 三星 W200 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):7點(diǎn)擊率:11.0 vip等級(jí):2.0
id:3 標(biāo)題:new3- 三星 W300 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):8點(diǎn)擊率:12.0 vip等級(jí):3.0
id:4 標(biāo)題:new4- 三星 W400 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):9點(diǎn)擊率:13.0 vip等級(jí):4.0
id:5 標(biāo)題:new5- 三星 W500 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):10點(diǎn)擊率:14.0 vip等級(jí):0.0
id:6 標(biāo)題:new6- 三星 W600 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):11點(diǎn)擊率:15.0 vip等級(jí):1.0
id:7 標(biāo)題:new7- 三星 W700 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):12點(diǎn)擊率:16.0 vip等級(jí):2.0
id:8 標(biāo)題:new8- 三星 W800 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):13點(diǎn)擊率:17.0 vip等級(jí):3.0
id:9 標(biāo)題:new9- 三星 W900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):14點(diǎn)擊率:9.0 vip等級(jí):4.0
id:10 標(biāo)題:new10- 三星 W1000 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):15點(diǎn)擊率:10.0 vip等級(jí):0.0
從結(jié)果可以看出默認(rèn)排序是根據(jù)id進(jìn)行排序。
(7) 完成自定義評(píng)分,在默認(rèn)排序以三星為條件作同時(shí)以vip等級(jí)排序。
@Test
public void testVipPageQuery()throws Exception{
SolrQuery solrQuery = new SolrQuery();
//關(guān)鍵詞
solrQuery.set("q","t_searchText:*三星*");
//分頁(yè),0開(kāi)始,每頁(yè)20條,setStart設(shè)置的就是顯示第幾頁(yè)
solrQuery.setStart(0);
solrQuery.setRows(20);
//設(shè)置權(quán)重方式為edismax
solrQuery.set("defType","edismax");
//scoreMethod為自定義評(píng)分規(guī)則,這里就是以t_vip+0的和來(lái)得到評(píng)分,然后以該評(píng)分進(jìn)行排序
String scoreMethod = "sum(t_vip,0)";
solrQuery.set("bf", scoreMethod);
//執(zhí)行查詢(xún)
QueryResponse response = client.query(solrQuery);
//文檔結(jié)果集
SolrDocumentList results = response.getResults();
System.out.println("查詢(xún)到的總條數(shù):"+ results.getNumFound());
//遍歷查詢(xún)的結(jié)果
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+" 標(biāo)題:"+title+" 評(píng)價(jià):"+assess+ "點(diǎn)擊率:"+point+" vip等
級(jí):"+vip+" " );
}
}
結(jié)果如下:
查詢(xún)到的總條數(shù):100
id:4 標(biāo)題:new4- 三星 W400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):9點(diǎn)擊率:13 vip等級(jí):4
id:9 標(biāo)題:new9- 三星 W900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):14點(diǎn)擊率:9 vip等級(jí):4
id:14 標(biāo)題:new14- 三星 W1400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):8點(diǎn)擊率:14 vip等級(jí):4
id:19 標(biāo)題:new19- 三星 W1900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):13點(diǎn)擊率:10 vip等級(jí):4
id:24 標(biāo)題:new24- 三星 W2400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):7點(diǎn)擊率:15 vip等級(jí):4
id:29 標(biāo)題:new29- 三星 W2900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):12點(diǎn)擊率:11 vip等級(jí):4
id:34 標(biāo)題:new34- 三星 W3400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):6點(diǎn)擊率:16 vip等級(jí):4
id:39 標(biāo)題:new39- 三星 W3900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):11點(diǎn)擊率:12 vip等級(jí):4
id:44 標(biāo)題:new44- 三星 W4400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):5點(diǎn)擊率:17 vip等級(jí):4
id:49 標(biāo)題:new49- 三星 W4900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):10點(diǎn)擊率:13 vip等級(jí):4
id:54 標(biāo)題:new54- 三星 W5400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):15點(diǎn)擊率:9 vip等級(jí):4
id:59 標(biāo)題:new59- 三星 W5900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):9點(diǎn)擊率:14 vip等級(jí):4
id:64 標(biāo)題:new64- 三星 W6400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):14點(diǎn)擊率:10 vip等級(jí):4
id:69 標(biāo)題:new69- 三星 W6900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):8點(diǎn)擊率:15 vip等級(jí):4
id:74 標(biāo)題:new74- 三星 W7400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):13點(diǎn)擊率:11 vip等級(jí):4
id:79 標(biāo)題:new79- 三星 W7900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):7點(diǎn)擊率:16 vip等級(jí):4
id:84 標(biāo)題:new84- 三星 W8400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):12點(diǎn)擊率:12 vip等級(jí):4
id:89 標(biāo)題:new89- 三星 W8900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):6點(diǎn)擊率:17 vip等級(jí):4
id:94 標(biāo)題:new94- 三星 W9400 黑色 電信3G手機(jī) 雙卡雙待雙通 三星 評(píng)價(jià):11點(diǎn)擊率:13 vip等級(jí):4
id:99 標(biāo)題:new99- 三星 W9900 黑色 電信3G手機(jī) 雙卡雙待雙通 評(píng)價(jià):5點(diǎn)擊率:9 vip等級(jí):4
可以看出我們以自定義評(píng)分的方式,該結(jié)果就以vip等級(jí)最高的進(jìn)行排序。
備注:關(guān)于solr更多的自定義排序都是利用solr的Function Query函數(shù)進(jìn)行的??梢宰孕胁榭磗olr的api進(jìn)行學(xué)習(xí)。
猜你喜歡
Netty快速入門(mén)教程[java培訓(xùn)]
2020-04-07疫情期間黑馬程序員如何抓學(xué)生的學(xué)習(xí)質(zhì)量?
2020-04-03如何使用Neo4j構(gòu)建人物關(guān)系圖?[Javaee培訓(xùn)]
2020-04-03黑馬程序員疫情期間如何保證項(xiàng)目實(shí)戰(zhàn)課程效果?
2020-04-03Docker教程:企業(yè)級(jí)應(yīng)用容器化實(shí)踐之容器鏡像倉(cāng)庫(kù)
2020-03-262小時(shí)實(shí)現(xiàn)黑馬AI機(jī)器人實(shí)戰(zhàn)教程[Java培訓(xùn)]
2020-03-26