Java程式設計師必看:Solr vip競價排名

2021-01-09 黑馬程式設計師

功能介紹

本文將使用solr完成vip等級排名,這裡並不是簡單的按照vip等級排序。而是在使用solr條件查詢(不使用排 序)的時候將符合條件並且具有vip等級的數據顯示在前面,這個時候咱們就要使用solr底層提供的自定義評分 機制來完成。

環境介紹

開發環境:IDEA + SpringBoot solr環境:solr4.10 + tomcat7

備註:solr環境+tomcat環境+IK中文分詞配置自行安裝

準備工作

solr環境安裝+tomcat環境+IK分詞配置(自行完成) 檢查solr環境:

檢查IK中文分詞器,有如下中文分詞效果即可

在solr的collection目錄下的schema.xml中添加如下業務域. 一下業務域中包含:商品標題、商品介紹、商品價格、商品創建時間、商品點擊次數、商品所屬商家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"/>

工程搭建

使用IDEA搭建maven工程

在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>

編寫springBoot啟動類SpringbootSolr5Application.java

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringbootSolr5Application {public static void main(String[] args) { SpringApplication.run(SpringbootSolr5Application.class, args);}}

在resources目錄下創建application.properties加入一下內容:

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

編寫CustomSortTest.java初始化查詢數據:

@RunWith(SpringRunner.class) @SpringBootTestpublic class CustomSortTest {@Autowiredprivate SolrClient client;/*** 初始化solr索引數據* */ @Testpublic 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();}}

編寫一下方法看一下默認條件查詢:三星的效果:

@Testpublic 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進行排序。

完成自定義評分,在默認排序以三星為條件作同時以vip等級排序

@Testpublic void testVipPageQuery()throws Exception{ SolrQuery solrQuery = new SolrQuery();//關鍵詞solrQuery.set("q","t_searchText:*三星*");//分頁,0開始,每頁20條,setStart設置的就是顯示第幾頁solrQuery.setStart(0); solrQuery.setRows(20);//設置權重方式為edismaxsolrQuery.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+" " );}}

結果如下:

查詢到的總條數:100id: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進行學習

相關焦點

  • Apache Solr Velocity模板注入遠程命令執行漏洞
    0x03 環境搭建環境情況solr版本:solr8.2.0作業系統 windows搭建步驟下載漏洞範圍影響範圍內的solr,我這裡使用最新版的8.2.0 (solr啟動需要java環境的支持,所以要提前安裝好java)解壓下載的solr,然後進入到solr的bin目錄下,執行以下命令啟動solr:solr start
  • 提升java編程性能優化知識 程式設計師必看這幾點
    對於學習java的學子也是如此,那麼java程式設計師如何提高編程性能呢,有哪些小知識或者技巧呢,怎麼樣才能在編程性能優化方面有所提升呢?  1.儘量在合適的場合使用單例  使用單例可以減輕加載的負擔,縮短加載的時間,提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面:
  • solr之http請求查詢記錄兩點
    今天犯了兩個很傻的錯誤,特此記錄一下,避免日後再犯:(1) solr提供http請求相關API:平常通過瀏覽器直接訪問:http://192.168.133.129:8983/solr/#/test/query,輸入查詢條件即可,但是由於request
  • Centos6.5 solr4.5 主從部署文檔
    solr4.5安裝(主,輔均需安裝)1、solr.4.5.0.zip解壓到指定的/usr/locar/src/solr-4.5.0目錄中2、將/usr/locar/src /solr-4.5.0/example/webapps下的solr.war拷貝到tomcat–>weapps中3、mkdir -p /usr/local/sorlhome,將/usr
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    前言 作為一名Java程式設計師,我們需要知道Java代碼是怎麼運行的。最近複習了深入理解Java虛擬機,做了一下總結,希望對大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。
  • 開源搜尋引擎solr介紹
    然後把「/usr/solr/server/solr-webapp/」下的「webapp」目錄,複製到「/usr/tomcat/server/webapps/」中並改名為「solr」。做solr的web容器,所以啟動tomcat,自然也就會把solr也啟動了。
  • Apache Solr 爆遠程執行漏洞,請立即限制對外埠
    該模板引擎用java代碼執行,其基本語法如下:// 變量定義#set($name ="velocity")// 變量賦值#set($foo = $bar)// 函數調用#set($foo ="hello") #set(foo.name=bar.name) #set(foo.name=bar.getName($arg)
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    零基礎學Java主流開發語言根據最新2020年TIOBE程式語言指數排行榜,Java仍然排名前三位富者越富,市場的正反饋讓Java被更多的公司採用,從而需要更多的Java程式設計師。軟體開發可以使用的語法是非常多,但是為什麼Java被廣泛的使用呢?其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。
  • Solr的部署模式詳解
    適用於數據規模大,高可靠、高可用、高並發的場獨立伺服器模式架構1、每個solr伺服器實例(啟動的一個solr伺服器進程)都有一個solr主目錄(系統變量名為:solr.solr.home)。查看本機上運行的solr服務實例的狀態bin/solr status停止solr服務實例bin/solr stop [options]bin/solr stop -helpbin/solr stop –p portbin/solr stop -allcore 內核管理內核core
  • Springmvc框架對json的支持 Java程式設計師必看
    解決了發送json的問題後,又遇到一個bug,發送的json字符串返回的確實一個http415錯誤代碼,大概是說後端接收的參數類型不正確的意思,下面請看java代碼。這段代碼看著沒問題啊,在方法參數前面加上@requestBody註解 就能把數據解析到後面的items對象裡面了,這裡是Springmvc調用了一個轉換器,將json數據轉成java對象的,用的就是下面這個轉換器那麼springmvc是怎麼知道要用到這個轉換器的呢?
  • Java程式設計師集合框架面試題
    1、 什麼是Java集合APIJava集合框架API是用來表示和操作集合的統一框架,它包含接口、實現類、以及幫助程式設計師完成一些編程的算法。2、 什麼是Iterator一些集合類提供了內容遍歷的功能,通過java.util.Iterator接口。這些接口允許遍歷對象的集合。依次操作每個元素對象。
  • 世界排行第一的程式語言:java迎來25歲生日
    作為全球排名第一的程式語言,本周末Java將迎來 25 歲生日。Java起源於 1991 年的「 Oak」項目,由James Gosling領導。面向對象的Java以其「一次編寫,隨處運行」的可移植性而聞名,因為Java虛擬機支持多種硬體平臺和作業系統以及Java applet可以從網頁上運行。
  • 程式設計師面試通關的 101 道真題
    在程式設計師的職業生涯中,無論是在跳槽時還是晉升時都會遇到各式各樣的面試,那麼就技術層面上而言,面試有哪些寶典秘籍可供參考,希望本文的 101 道真題能給你幫助。作者 | javinpaul,Java程式設計師譯者 | 彎月,責編 | 屠敏以下為譯文:對程式設計師來說,編程面試有著非凡的意義。
  • 工作五年的程式設計師真實工資是怎麼樣的
    可能大家都覺得程式設計師的工資很高,看一下下面是我五年以來的工資真實寫照就知道高不高了,沒有一點的水分,全是乾貨 2015.9月到2016年8月入職A公司java開發工程師。 試用期稅前前工資:4500元/月,沒有uo五險一金。
  • 建議Solr 用戶更新 Apache POI
    Apache Solr 更新 Apache POI 方法:- 下載 Apache POI 3.10.1 二進位版本: - 解壓文件- 刪除 "solr-4.X.X/contrib/extraction/lib" 文件夾的以下文檔: # poi-3.10-beta2.jar # poi-ooxml-3.10-beta2.jar # poi-ooxml-schemas
  • 程式設計師編程入門必知!程式設計師需要學什麼
    學習語言的過程中還要有機會進行檢驗,不能只編寫代碼,還要檢驗代碼的結果運行是否正確,也就是某些可以運行結果的軟體我們要有,不過許多的程式語言都要求有被程式設計師設計來講代碼轉換成機器能理解的語言的編譯器。其他一些語言,比如Python,使用可以立即轉換成程序而不需要編譯。一些語言有自己的往往包含著代碼編輯器、調試器和/或者翻譯以及調試的IDEs(集成開發環境)。
  • 2020年3月全國程式設計師工資出爐,平均工資13820元,Java「錢」景看好!
    特別是當下的薪資變化趨勢,本文達妹為大家總結了2020年2月份中國程式設計師的薪資狀況,讓你入行前,心裡有數。2020年3月,中國大陸程式設計師平均工資13820元,比上個月增加。具體趨勢如圖:整體趨勢各主要程式設計師城市工資變化職能代碼:https://github.com/juwikuang/china_job_surveyIT行業持續火爆,各大計算機程式語言的前景,卻又各不相同。
  • Java 反射:框架設計的靈魂
    Class clz = Class.forName("java.util.ArrayList");Method method_add = clz.getMethod("add",Object.class);Constructor constructor = clz.getConstructor();Object object
  • 談談一個女程式設計師工作了四年的真實工資
    可愛女程式設計師在國慶節期間我含辛茹苦把我此生所學的java開發實戰經驗傳授於她。工作日我去上班,她就在宿舍閉關修煉。一日復一日,編程學得差不多了,眼看就到年底了,她想在年底找到一份java開發的工作安心回家過年。誰料投了一些簡歷都杳無音訊,眼看就要過年了,一般公司都不會在年底招人的。她也打算回家有空繼續備戰,明年再回來再戰,所以她就狠心丟下我一個人在宿舍,自己提前回家過年去了,我不怪她,因為我自由了。
  • java軟體工程師的這些要求你有嗎?
    如今java是IT界數一數二的語言,許多程式設計師都想要成為java軟體工程師,那大家知道企業對於java軟體工程師的技術要求有哪些嗎?java軟體工程師的技術要求一.java技術要求:1.具有良好的Java語言基礎,面向對象編程基礎2.熟悉Struts、Hibernate、Spring等主流技術框架3.熟悉XML解析、Excel導出、文件上傳、發送E-mail等常見業務的實現二.資料庫技術要求1.掌握、運用SQLServer