Solr全文检索学习笔记·记录
1. Solr的安裝
????????略。(注意安裝jdk)
2. Solr客戶端界面介紹
?solr-7.7.3目錄結(jié)構(gòu)介紹? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
- bin:該目錄下存放了Solr的工具命令。
- contrib:該目錄下存放了Solr所依賴的第三方JAR包。
- dist:該目錄下存放了Solr本身的JAR包。
- docs:該目錄下存放了Solr的文檔。
- example:該目錄下存放了Solr的各種實例。
- server:該目錄下的solr目錄存放了一系列的索引庫。
?啟動Solr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
[root@hadoop1 solr-7.7.3]# cd bin [root@hadoop1 bin]# ./solr start -force?打開Solr客戶端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
- ??Dashboard:顯示了該Solr實例開始啟動運行的時間,版本,系統(tǒng)資源,jvm等信息。
- Logging: 日志,顯示Solr運行出現(xiàn)的異常或錯誤。
- Core Admin:?在這里可以添加Solr Core的實例,也就是創(chuàng)建一個索引庫,類似數(shù)據(jù)庫,用來存放數(shù)據(jù)。所以如果要使用Solr必須創(chuàng)建一個索引庫才能使用。主要有Add Core(添加核心),Unload(卸載核心),Rename(重命名核心),Reload(重新加載核心),Optimize(優(yōu)化索引庫)。
- Java Properties: 可查看到Java相關(guān)的一些屬性信息。
- Thread Dump:顯示Solr Server中當前活躍線程信息,同時也可以跟蹤線程運行棧信息。
??創(chuàng)建索引庫? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????
????????一般來說,在真實項目環(huán)境下,數(shù)據(jù)庫是要跟Solr中的索引庫結(jié)合在一起的,數(shù)據(jù)庫負責增刪改,而索引庫負責查詢,所以,我們要利用Solr客戶端來創(chuàng)建我們的索引庫,那怎么創(chuàng)建呢?如下:
? ? ? ? ?Add Core,創(chuàng)建核心,可以理解為創(chuàng)建表,點擊,如下:
- ?name為自定義名字,也就是到時候如果添加成功,Solr客戶端左下角的Core Selector下拉框就會出現(xiàn)name指定的名字,到時可以選擇。建議和下面的instanceDir保持一致。
- ?instanceDir為磁盤上文件夾的名稱。
- ?dataDir為默認的數(shù)據(jù)存儲目錄。
- ?config為配置文件,里面的solrconfig.xml的位置在db_cht/conf/solrconfig.xml。
- ?schema為db_cht下的conf下的schema文件(schema.xml)。
????????不過以上這樣直接點擊Add Core會報錯的,但是,雖然報錯,在/usr/local/solr-7.7.3/server/solr目錄下就會生成一個叫db_cht的空文件夾(為什么文件夾叫db_cht,因為instanceDir已經(jīng)指定了),進去里面啥也沒有,在這里需要復(fù)制一點東西來,執(zhí)行下面命令,如下:
cp -r ../configsets/sample_techproducts_configs/* ./????????這樣就能創(chuàng)建成功了,那么在db_cht目錄下除了我們剛剛復(fù)制過來的conf文件夾,還有core.properties文件和data文件夾。我們可以打開core.properties看看,如下:
name=db_cht config=solrconfig.xml schema=schema.xml dataDir=data????????或者我們采用命令來創(chuàng)建,首先,進入solr-7.7.3的bin目錄,如下:
[root@hadoop1 bin]# pwd /usr/local/solr-7.7.3/bin [root@hadoop1 bin]# ./solr create_core -c db1_core -force WARNING: Using _default configset with data driven schema functionality. NOT RECOMMENDED for production use.To turn off: bin/solr config -c db1_core -p 8983 -action set-user-property -property update.autoCreateFields -value falseCreated new core 'db1_core'????????這次再打開管理界面,就會出現(xiàn)下面的兩個索引庫,如下:
?Core選擇器? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
- Overview:主要顯示當前庫的一個狀況。
- Analysis:查詢分析器。如下:
?????????如果左邊高亮,意味著用戶輸入的雖然是my number這個英文單詞,但是是會把phone number這條記錄搜索出來的,即使用戶沒有搜索phone這個英文單詞。
?? ??????再說下分詞器,分詞器很好懂吧,它默認是英文分詞器,但也有中文分詞器,中文的后面再說,所謂的分詞器就是對一句話分成各個詞語,比如蘋果手機會被分成三個詞語,分別是蘋果,手機,蘋果手機。當用戶在搜索框里輸入蘋果手機的時候,搜索結(jié)果可不單單只出現(xiàn)蘋果手機哦,可能水果類的蘋果也出來了,這就是分詞的作用。在如上圖,也就是那個下拉框是選擇分詞策略的,如果是中文的,那就選中文分詞器,只不過默認是英文的,暫時沒有中文分詞器,沒關(guān)系,后面再配,反正下拉框里列出來的內(nèi)容就是各個分詞器策略,而這些分詞器策略都在一個文件里可以看出來,該文件就在/usr/local/solr-7.7.3/server/solr/索引庫名稱/conf/managed-schema文件里,里面的fieldType標簽就是了。
- Schema: 既然索引庫都創(chuàng)建出來了,或者你也可以理解就是創(chuàng)建了一張表,那么表是不是得有字段呀,字段英文名是不是就叫Field呀,所以,如下:
? ? ? ? 以商品信息為例,是不是有這幾種字段,商品標題,商品描述,商品價格等,分別對應(yīng)commodityTitle,message,price。話不多說,我們創(chuàng)建一下吧,如下:
?????????添加完之后,在下面的下拉框是可以看到我們剛剛添加的字段的,那我要說下,下拉框里的所有數(shù)據(jù)來源是哪里?沒錯,就來自managed-schema文件里,打開該文件,就有如下標簽,如下:
<field name="commodityTitle" type="text_general" uninvertible="true" docValues="false" indexed="true" stored="true"/>????????剩下的字段一樣的操作,不過像id,price這兩字段,Solr已經(jīng)默認幫我們提供了(說白了就是managed-chema文件里已經(jīng)存在了name等于id和name等于price的field標簽),那我們就關(guān)注剩下的message咯,如下:
????????那Add Dynamic Field,添加動態(tài)字段,就是managed-schema文件里的dynamicField標簽,看它的name就知道了。
? ? ? ? 下一個是Add Copy Field,添加復(fù)制字段(或叫合成字段),也就是說,我們可以把商品標題和商品描述這兩個字段合成一個新的字段,叫xxxKeyWorld,隨便。那為什么要合成一個新的字段?就是說,如果我們在查詢某件商品信息的時候,肯定是根據(jù)某一個字段來查詢的,而這字段不單單是commodityTitle字段,或者是message字段,應(yīng)該是兩字段合成,說白了,就是我們查詢商品信息,是根據(jù)commodityTitle字段+message字段查出來的。換句話說,我們在做匹配的時候,不單單可以根據(jù)commodityTitle匹配,也可以根據(jù)message做匹配。而這合成后的字段xxxKeyWorld是一個數(shù)組。
- ?Documents: 添加數(shù)據(jù),更新數(shù)據(jù),刪除數(shù)據(jù)的。如下:
? ? ? ? 向索引庫添加數(shù)據(jù)(Json版):
? ????????向索引庫添加數(shù)據(jù)(xml版):
?????????刪除id為1的記錄:
? ? ? ? ?刪除所有記錄,就是*:*。下一個是更新,那么就像添加一樣,只不過重點在id上,如果你要添加的這條記錄,id在索引庫剛好存在,那么就會把原有記錄覆蓋掉,這就是更新。
- ?Query: 模擬查詢條件。
? ? ? ? ?說明一點,如上commodityTitle字段只所以可以根據(jù)它作為查詢條件,那是因為commodityTitle的index為true,如果為false,那是不能作為查詢條件的。
? ? ? ? ? ? ? ?如果是多條件,那么可以這樣寫,字段1:值1 AND/OR 字段2:值2。
? ? ? ? ?如上fq代表過濾查詢。看,一共有兩個條件,代表我要查詢commodityTitle有華為的以及message帶有色彩字眼的記錄。
????????fq是在q查詢符合結(jié)果中同時是fq查詢符合的,例如,請求fq是一個數(shù)組:
如果fq里寫的是字段:[1 TO 10],代表過濾查詢1到10的記錄,該字段可以是價格之類的,反正就是數(shù)字型的。當然,如果要表示10以上的就是[10 TO *]。
????????fq的另一個語法,表示并且的關(guān)系,比如commodityTitle:華為,蘋果,表示要把commodityTitle中有華為的和有蘋果的都查出來。同樣也支持字段1:值1 AND/OR 字段2:值2。
??????????sort為排序。
? ? ? ? ? 下面的start,rows為分頁。
? ? ? ? ? fl為指定返回哪些字段內(nèi)容,比如你寫的是commodityTitle,price。那么就意味著你在查詢的時候只會把commodityTitle和price查詢出來,其它的如message不會查詢出來。
? ? ? ? df表示默認字段,譬如你寫的是commodityTitle,那么我們在q那里就不用寫的那么完整了,比如commodityTitle:華為,就可以直接寫華為這兩個字了,因為你如果不寫以哪個字段作為條件,默認就是以你df指定的那個。
?如上圖是做高亮設(shè)置的,hl.fl那里表示你要對誰做高亮,下面就是高亮后是什么顏色的。
??IK分詞器的使用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? 接下來是配置中文分詞器。往下看吧!!!
? ? ? ? 下載地址:http://files.cnblogs.com/files/zhangweizhong/ikanalyzer-solr5.zip?????????????????????????
?????????解壓文件及說明:
-
ext.dic:自定義詞語,如沙雕,沙雕在漢語里面不是一個詞,它只是一個網(wǎng)絡(luò)用語,我們可以配置到這里面,讓它成為一個詞。
-
stopword.dic:停止分詞,或者說對哪些不做分詞處理。
-
IKAnalyzer.cfg.xml:配置IK的配置文件,不用改。
? ? ? ? ?1. 修改managed-sahma,加上如下配置:
<!-- China --> <fieldType name="text_cn" class="solr.TextField" positionIncrementGap="10"><analyzer type="index"><tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/></analyzer><analyzer type="query"><tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/></analyzer> </fieldType>? ? ? ? 說明一下,看analyzer標簽,其中的type等于index或者query是什么意思?其實是對應(yīng)如下圖:
????????然后再看,useSmart又是什么意思,如下:
? ? ? ? 跟分詞的粒度相關(guān):
- False:分詞的粒度大,一句話里面分的詞語少。
- True:分詞的粒度細,一句話里面分的詞語多。
? ? ? ? 2. 把IK的配置放到Solr:
? ? ? ? 放入jar包:準備好ik-analyzer-solr5-5.x.jar,這個我們已經(jīng)下載下來了,但還要下載一個jar包,可以去maven倉庫下,該jar包就是solr-analyzer-ik-5.1.0.jar,也就是總共有兩個jar,有了這兩個jar,就可以把這兩個jar放到/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF/lib目錄下。
? ? ? ? 3. 放配置:
? ? ? ? 退回到上一級,也就是/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF,在該目錄下新建文件夾,名字叫classes,然后再把ext.dic,IKAnalyzer.cfg.xml,stopword.dic這三個文件放進去。
? ? ? ? 4. 重啟Solr? ? ?
[root@hadoop1 solr-7.7.3]# cd bin [root@hadoop1 bin]# ps -ef|grep solr root 3632 1 0 06:24 pts/0 ...... [root@hadoop1 bin]# kill -9 3632 [root@hadoop1 bin]# ./solr start -force? ? ? ? 重新進入solr的管理界面,進入如下頁面:
? ? ? ? ?補充:ext.dic的說明
? ? ? ? 打開ext.dic文件,直接寫上沙雕這兩個字即可,只有這樣,在做分詞的時候,遇到沙雕才不會把沙和雕分開來,因為如果這樣的話,網(wǎng)友在搜索沙雕時,不就搜索不到有關(guān)沙雕的視頻嗎?那么為了能夠搜索到,我們就得把沙雕寫到ext.dic文件上,畢竟它是一種網(wǎng)絡(luò)用語,要把它當成一個詞語來用。那么以后,我們再搜索沙雕的時候,就會搜索到有關(guān)沙雕的視頻了。如下:
以第一個視頻為例,如下:?
?????????我要說明的是,如果你不在ext.dic寫上沙雕這兩個字,那不好意思,ik分詞器不認為沙雕是一個詞語,只會把沙和雕兩個字分開。
??數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)到Solr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 我們打開數(shù)據(jù)庫Navicat,然后新建個數(shù)據(jù)庫,數(shù)據(jù)庫名隨便你叫什么,都行,右鍵數(shù)據(jù)庫,選擇運行sql文件,因為此處,我為方便,準備導(dǎo)入sql文件,就不自己新建表了。我呢這有兩個sql文件,也就意味著有兩張表,這兩張表的名字叫bless和products,該兩張表數(shù)據(jù)很多,我就只說它有哪些字段好了:
| bless | id,bless_content,bless_time |
| products | pid,pname,catalog,catalog_name,price,number,description,picture,release_time |
? ? ? ? DataImport導(dǎo)入數(shù)據(jù):
? ? ? ? 該功能是將數(shù)據(jù)庫中的數(shù)據(jù)通過sql語句方式導(dǎo)入到Solr索引庫中。
? ? ? ? 第一步:添加jar包:
? ? ? ? 進入/usr/local/solr-7.7.3/dist下,復(fù)制solr-dataimporthandler-7.7.3.jar和solr-dataimporthandler-extras-7.7.3.jar。同時還要復(fù)制mysql的驅(qū)動包mysql-connector-java-5.1.42.jar,復(fù)制到哪?復(fù)制到/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF/lib下即可。
? ? ? ? 第二步:修改solrconfig.xml
? ? ? ? 進入/usr/local/solr-7.7.3/server/solr/索引庫名/conf目錄下,我這里的索引庫名是db1_core,也就是配置了中文分詞器的那個。
? ? ? ? 進入conf下,打開solrconfig.xml,首先查詢是否存在dataimport的requestHandler,如果不存在,因此需要手動添加,為了以后便于維護此文件,我們就在requestHandler起始位置,約在720行處,添加如下內(nèi)容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"><lst name="defaults"><str name="config">data-config.xml</str></lst> </requestHandler>? ? ? ? 第三步:創(chuàng)建data-config.xml配置文件
? ? ? ? 注意,在當前目錄下創(chuàng)建,也就是跟solrconfig.xml同級。
? ? ? ? data-config.xml的作用:數(shù)據(jù)庫連接相關(guān)信息,SQL以及查詢結(jié)果映射對應(yīng)域(字段)中。
<?xml version="1.0" encoding="UTF-8"?> <dataConfig><dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver"url="jdbc:mysql://192.168.1.101:3306/db1"user="root"password="root"/><document><entity name="products" query="select pid,pname,catalog_name,price,description,picture from products"><field column="pid" name="id"/><field column="pname" name="prod_pname"/><field column="catalog_name" name="prod_catalog_name"/><field column="price" name="prod_price"/><field column="description" name="prod_description"/><field column="picture" name="prod_picture"/></entity></document> </dataConfig>如上field標簽里,column為數(shù)據(jù)庫里的字段名稱,name為solr索引庫里的字段名稱,或者叫域名稱。
? ? ? ? 第四步:分析定義域
? ? ? ? 修改同目錄下的managed-schema文件,增加下面內(nèi)容:
<!--prod_pname:支持分詞技術(shù)查詢--> <field name="prod_pname" type="text_cn" indexed="true" stored="true" required="true"/><!--catalog_name: 直接相等的方式查詢,不要做分詞,直接精確查詢--> <field name="prod_catalog_name" type="string" indexed="true" stored="true" required="true"/><field name="prod_price" type="pdouble" indexed="true" stored="true" required="true"/><field name="prod_description" type="text_cn" indexed="true" stored="true" required="true"/><!--prod_picture: 不分詞,也不做搜索條件--> <field name="prod_picture" type="string" indexed="false" stored="true" required="true"/>? ? ? ? 第五步,重啟solr。
? ? ? ? 第六步,查看solr管理界面,進入核心選擇器,選中DataImport選項,也就是我們在界面上添加數(shù)據(jù)(Documents)的上方。如下:
????????只是我這出現(xiàn)了問題,導(dǎo)入失敗,因為我的solr是在linux安裝的,而mysql在windows中,可能就是該原因,造成導(dǎo)入失敗。為了不浪費時間,我這也就暫時先放著,大不了我直接向索引庫添加數(shù)據(jù)也是可以的嘛,雖然麻煩點。大家可以看這個視頻,我就是參考該視頻的,包括我說的那兩張表:<https://www.bilibili.com/video/BV1ob411T7NQ?p=7>。
? ? ? ? 這里我就自行的往索引庫添加了5條數(shù)據(jù),意思意思一下,最重要的還是后面進行增刪改查的部分。如下:
3. Solrj的操作
??Solrj添加數(shù)據(jù)/更新數(shù)據(jù)?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?到這,就要真正的用java代碼來操作索引庫了,而以上用solr管理控制臺操作的索引庫我們當做了解學習即可,下面才是王道。
? ? ? ? solrj是操作Solr的JAVA客戶端,它提供了增加,修改,刪除,查詢Solr索引的JAVA接口。Solrj針對Solr提供了Rest的HTTP接口進行了封裝,SolrJ底層是通過使用HttpClient中的方法來完成Solr的操作的。
? ? ? ? 1. 創(chuàng)建項目普通的maven項目。
? ? ? ? ?2. 引入maven坐標:
<properties><solrj.version>7.7.2</solrj.version> </properties> <dependencies><dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>${solrj.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency> </dependencies>? ? ? ? 3. 創(chuàng)建測試類來測試連接,如下:? ? ? ??
package com.cht.test;import org.apache.solr.client.solrj.impl.HttpSolrClient;public class Test01Connection {//聲明一個連接solr的地址public static final String SOLR_URL = "http://192.168.6.133:8983/solr/db1_core";//聲明一個連接solr的對象private static HttpSolrClient httpSolrClient;static {httpSolrClient = new HttpSolrClient.Builder(SOLR_URL).build();}public static void main(String[] args) {System.out.println(httpSolrClient);} }? ? ? ? 如果連接成功,沒報錯,就說明可以來操作solr了。
? ? ? ? 4. 使用solrj向索引庫添加數(shù)據(jù):??
public static void main(String[] args) throws IOException, SolrServerException {//一個一個添加SolrInputDocument doc = new SolrInputDocument();doc.addField("id",6); //不指定id值,默認是UUIDdoc.addField("prod_pname","zakka雜貨 情侶小鹿樹脂擺件家居裝飾品一對");doc.addField("prod_catalog_name","幽默雜貨");doc.addField("prod_price",15);doc.addField("prod_description","<TABLE id=table2 cellSpacing=5 .........");doc.addField("prod_picture","2014031517190225.jpg");httpSolrClient.add(doc);//或者這樣,指定某個庫,如果這樣那么上面的地址SOLR_URL就不用具體指定是哪個索引庫了。httpSolrClient.add("db1_core",doc);httpSolrClient.commit();httpSolrClient.close(); }? ? ? ? 測試一下是否添加成功,如果成功,打開solr管理后臺,看看添加進去沒有。
? ? ? ? 下面是添加多條數(shù)據(jù),如下:
public static void main(String[] args) throws IOException, SolrServerException {List<SolrInputDocument> docs = new ArrayList<>();for (int i=0;i<=5;i++){SolrInputDocument doc = new SolrInputDocument();doc.addField("id",i);doc.addField("prod_pname","魔幻星座音樂水晶球內(nèi)雕音樂盒七彩漸變音樂球");doc.addField("prod_catalog_name","幽默雜貨:"+i);doc.addField("prod_price",70);doc.addField("prod_description","description:"+i);doc.addField("prod_picture","2014030610151185.jpg");docs.add(doc);}httpSolrClient.add(docs);httpSolrClient.commit();httpSolrClient.close(); }? ? ? ? 我們還可以添加一個對象,那么我們就要創(chuàng)建一個實體類,如下:
package com.cht.domain;import lombok.Data; import org.apache.solr.client.solrj.beans.Field;@Data public class Products {@Field("id")private String pid;@Field("prod_pname")private String pname;private String catalog;@Field("prod_catalog_name")private String catalogName;@Field("prod_price")private double price;private Integer number;@Field("prod_description")private String description;@Field("prod_picture")private String picture; }? ? ? ? 那么添加如下:
Products products = new Products(); products.setPid("8"); products.setPname("家天下嘻哈動物魔術(shù)貼掛鉤繞帶無痕掛鉤2個裝RB205"); products.setCatalogName("幽默雜貨"); products.setPrice(5.5); products.setDescription("<TABLE id=table2 cellSpacing=5 cellPadding=5 width=700 border=0>\n..."); products.setPicture("2013112909444459_S.jpg"); UpdateResponse response = httpSolrClient.addBean(products); httpSolrClient.commit(); httpSolrClient.close();? ? ? ? 注意,以上添加的時候是不是設(shè)置了id,那么如果你設(shè)置的id在索引庫已存在,那就是更新,所以這點要注意!!!因為你一不小心就會把原有記錄覆蓋掉。
??Solrj刪除數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 根據(jù)id刪除:
httpSolrClient.deleteById("1"); httpSolrClient.commit(); httpSolrClient.close();? ? ? ? 根據(jù)ids刪除:
httpSolrClient.deleteById(Arrays.asList("1","2","3")); httpSolrClient.commit(); httpSolrClient.close();? ? ? ? 全部刪除:
httpSolrClient.deleteByQuery("*:*");//全部刪除。表示以查詢作為刪除條件。 httpSolrClient.commit(); httpSolrClient.close();??solrj查詢數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
????????簡單查詢:
String q = "*:*"; //SolrParams是抽象類 SolrParams solrQuery = new SolrQuery(q); QueryResponse query = httpSolrClient.query(solrQuery); List<Products> product = query.getBeans(Products.class); System.out.println(product.size()); //默認只查詢10條記錄,這點要注意 for (Products p:product){System.out.println(p); } httpSolrClient.commit(); httpSolrClient.close(); SolrQuery solrQuery = new SolrQuery(); String keyWorld = "情侶"; //模擬用戶在搜索框輸入情侶 //判斷當前用戶是否對keyWorld進行賦值,如果為空,查詢所有,不為空,就專門查詢用戶輸入的值 if(StringUtils.isEmpty(keyWorld)){solrQuery.set("q","*:*"); }else {solrQuery.set("q","prod_pname:"+keyWorld); } QueryResponse query = httpSolrClient.query(solrQuery); List<Products> product = query.getBeans(Products.class); System.out.println(product.size()); for (Products p:product){System.out.println(p.getPname()); } httpSolrClient.commit(); httpSolrClient.close();? ? ? ? 復(fù)雜查詢:
public static void main(String[] args) throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery();String keyWorld = "情侶"; //模擬用戶在搜索框輸入情侶//判斷當前用戶是否對keyWorld進行賦值,如果為空,查詢所有,不為空,就專門查詢用戶輸入的值if(StringUtils.isEmpty(keyWorld)){solrQuery.set("q","*:*");}else {solrQuery.set("q","prod_pname:"+keyWorld);}//設(shè)置fqString catalogName = "";if(!StringUtils.isEmpty(catalogName)){solrQuery.addFilterQuery("prod_catalog_name:"+catalogName);}//prod_price:[1 TO 5]String price_str="1-5";//如果是1- 那么對應(yīng)的就是prod_price:[1 TO *]if(!StringUtils.isEmpty(price_str)){String[] arrs = price_str.split("-");if(arrs.length == 1){ //針對price_str是這種情況: 數(shù)字-solrQuery.addFilterQuery("prod_price:["+arrs[0]+" TO *]");}else{String perfix = arrs[0];if(StringUtils.isEmpty(arrs[0])){//針對price_str是這種情況: -數(shù)字perfix = "*";}solrQuery.addFilterQuery("prod_price:["+perfix+" TO "+arrs[1]+"]");}}//設(shè)置價格排序/*psort=1為升序,psort=2為降序*/int psort=2;if(psort==1){solrQuery.addSort("prod_price", SolrQuery.ORDER.asc);}else if(psort==2){solrQuery.addSort("prod_price", SolrQuery.ORDER.desc);}//設(shè)置分頁//start=0,rows=10 公式:start=rows*(page-1)solrQuery.setStart(0);solrQuery.setRows(6);//設(shè)置回顯(可以保護隱私數(shù)據(jù))solrQuery.setFields("id","prod_pname","prod_catalog_name");//注意這里沒對prod_price做回顯,所以查詢結(jié)果是0.0//設(shè)置默認域(df)//solrQuery.set("df","prod_pname");//hi 設(shè)置高亮solrQuery.setHighlight(true);solrQuery.addHighlightField("prod_pname");solrQuery.setHighlightSimplePre("<font color='red'>");solrQuery.setHighlightSimplePost("</font>");QueryResponse query = httpSolrClient.query(solrQuery);//得到高亮數(shù)據(jù)Map<String, Map<String, List<String>>> map = query.getHighlighting();List<Products> product = query.getBeans(Products.class);System.out.println(product.size());//下面的numFound表示查詢出來的個數(shù),跟上面的product.size()是一樣的long numFound = query.getResults().getNumFound();System.out.println(numFound);for (Products p:product){//獲取id號String pid = p.getPid();//注意要把索引庫的id回顯,否則獲取不到,為nullMap<String, List<String>> map1 = map.get(pid);List<String> map2 = map1.get("prod_pname");if(map2!=null){// System.out.println(p.getPrice()+":::"+p.getPname());System.out.println(map2.get(0)+":::"+p.getPname());}else {System.out.println(p.getPrice()+":::"+p.getPname());}}httpSolrClient.commit();httpSolrClient.close(); }??SpringBoot整合solr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
????????maven坐標
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-solr</artifactId> </dependency>? ? ? ? 編寫配置文件(application.yml):
spring:data:solr:host: http://192.168.6.133:8983/solr/db1_core? ? ? ? 測試是否可以獲取到solrClient,如下:
@SpringBootTest class SolrSpringbootApplicationTests {@AutowiredSolrClient solrClient;@Testvoid contextLoads() {System.out.println(solrClient);}}總結(jié)
以上是生活随笔為你收集整理的Solr全文检索学习笔记·记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 5.0 lg g2,升级
- 下一篇: 计算机一级安装的软件要钱吗,电脑没装这5