日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Solr全文检索学习笔记·记录

發(fā)布時(shí)間:2024/8/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Solr全文检索学习笔记·记录 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Solr的安裝

????????略。(注意安裝jdk)

2. Solr客戶端界面介紹

?solr-7.7.3目錄結(jié)構(gòu)介紹? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  • bin該目錄下存放了Solr的工具命令
  • contrib該目錄下存放了Solr所依賴的第三方JAR包。
  • dist該目錄下存放了Solr本身的JAR包。
  • docs該目錄下存放了Solr的文檔。
  • example該目錄下存放了Solr的各種實(shí)例。
  • server該目錄下的solr目錄存放了一系列的索引庫。

?啟動(dòng)Solr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

[root@hadoop1 solr-7.7.3]# cd bin [root@hadoop1 bin]# ./solr start -force

?打開Solr客戶端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  • ??Dashboard顯示了該Solr實(shí)例開始啟動(dòng)運(yùn)行的時(shí)間,版本,系統(tǒng)資源,jvm等信息。
  • Logging: 日志,顯示Solr運(yùn)行出現(xiàn)的異常或錯(cuò)誤。
  • Core Admin:?在這里可以添加Solr Core的實(shí)例,也就是創(chuàng)建一個(gè)索引庫,類似數(shù)據(jù)庫,用來存放數(shù)據(jù)。所以如果要使用Solr必須創(chuàng)建一個(gè)索引庫才能使用。主要有Add Core(添加核心),Unload(卸載核心),Rename(重命名核心),Reload(重新加載核心),Optimize(優(yōu)化索引庫)。
  • Java Properties: 可查看到Java相關(guān)的一些屬性信息。
  • Thread Dump顯示Solr Server中當(dāng)前活躍線程信息,同時(shí)也可以跟蹤線程運(yùn)行棧信息。

??創(chuàng)建索引庫? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????

????????一般來說,在真實(shí)項(xiàng)目環(huán)境下,數(shù)據(jù)庫是要跟Solr中的索引庫結(jié)合在一起的,數(shù)據(jù)庫負(fù)責(zé)增刪改,而索引庫負(fù)責(zé)查詢,所以,我們要利用Solr客戶端來創(chuàng)建我們的索引庫,那怎么創(chuàng)建呢?如下:

? ? ? ? ?Add Core,創(chuàng)建核心,可以理解為創(chuàng)建表,點(diǎn)擊,如下:

  • ?name為自定義名字,也就是到時(shí)候如果添加成功,Solr客戶端左下角的Core Selector下拉框就會(huì)出現(xiàn)name指定的名字,到時(shí)可以選擇。建議和下面的instanceDir保持一致。
  • ?instanceDir為磁盤上文件夾的名稱。
  • ?dataDir為默認(rèn)的數(shù)據(jù)存儲(chǔ)目錄。
  • ?config為配置文件,里面的solrconfig.xml的位置在db_cht/conf/solrconfig.xml。
  • ?schema為db_cht下的conf下的schema文件(schema.xml)。

????????不過以上這樣直接點(diǎn)擊Add Core會(huì)報(bào)錯(cuò)的,但是,雖然報(bào)錯(cuò),在/usr/local/solr-7.7.3/server/solr目錄下就會(huì)生成一個(gè)叫db_cht的空文件夾(為什么文件夾叫db_cht,因?yàn)閕nstanceDir已經(jīng)指定了),進(jìn)去里面啥也沒有,在這里需要復(fù)制一點(diǎn)東西來,執(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)建,首先,進(jìn)入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'

????????這次再打開管理界面,就會(huì)出現(xiàn)下面的兩個(gè)索引庫,如下:

?Core選擇器? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

  • Overview:主要顯示當(dāng)前庫的一個(gè)狀況。
  • Analysis:查詢分析器。如下:

?????????如果左邊高亮,意味著用戶輸入的雖然是my number這個(gè)英文單詞,但是是會(huì)把phone number這條記錄搜索出來的,即使用戶沒有搜索phone這個(gè)英文單詞。
?? ??????再說下分詞器,分詞器很好懂吧,它默認(rèn)是英文分詞器,但也有中文分詞器,中文的后面再說,所謂的分詞器就是對(duì)一句話分成各個(gè)詞語,比如蘋果手機(jī)會(huì)被分成三個(gè)詞語,分別是蘋果,手機(jī),蘋果手機(jī)。當(dāng)用戶在搜索框里輸入蘋果手機(jī)的時(shí)候,搜索結(jié)果可不單單只出現(xiàn)蘋果手機(jī)哦,可能水果類的蘋果也出來了,這就是分詞的作用。在如上圖,也就是那個(gè)下拉框是選擇分詞策略的,如果是中文的,那就選中文分詞器,只不過默認(rèn)是英文的,暫時(shí)沒有中文分詞器,沒關(guān)系,后面再配,反正下拉框里列出來的內(nèi)容就是各個(gè)分詞器策略,而這些分詞器策略都在一個(gè)文件里可以看出來,該文件就在/usr/local/solr-7.7.3/server/solr/索引庫名稱/conf/managed-schema文件里,里面的fieldType標(biāo)簽就是了。

  • Schema: 既然索引庫都創(chuàng)建出來了,或者你也可以理解就是創(chuàng)建了一張表,那么表是不是得有字段呀,字段英文名是不是就叫Field呀,所以,如下:

? ? ? ? 以商品信息為例,是不是有這幾種字段,商品標(biāo)題,商品描述,商品價(jià)格等,分別對(duì)應(yīng)commodityTitle,message,price。話不多說,我們創(chuàng)建一下吧,如下:

?????????添加完之后,在下面的下拉框是可以看到我們剛剛添加的字段的,那我要說下,下拉框里的所有數(shù)據(jù)來源是哪里?沒錯(cuò),就來自managed-schema文件里,打開該文件,就有如下標(biāo)簽,如下:

<field name="commodityTitle" type="text_general" uninvertible="true" docValues="false" indexed="true" stored="true"/>

????????剩下的字段一樣的操作,不過像id,price這兩字段,Solr已經(jīng)默認(rèn)幫我們提供了(說白了就是managed-chema文件里已經(jīng)存在了name等于id和name等于price的field標(biāo)簽),那我們就關(guān)注剩下的message咯,如下:

????????那Add Dynamic Field,添加動(dòng)態(tài)字段,就是managed-schema文件里的dynamicField標(biāo)簽,看它的name就知道了。
? ? ? ? 下一個(gè)是Add Copy Field,添加復(fù)制字段(或叫合成字段),也就是說,我們可以把商品標(biāo)題和商品描述這兩個(gè)字段合成一個(gè)新的字段,叫xxxKeyWorld,隨便。那為什么要合成一個(gè)新的字段?就是說,如果我們?cè)诓樵兡臣唐沸畔⒌臅r(shí)候,肯定是根據(jù)某一個(gè)字段來查詢的,而這字段不單單是commodityTitle字段,或者是message字段,應(yīng)該是兩字段合成,說白了,就是我們查詢商品信息,是根據(jù)commodityTitle字段+message字段查出來的。換句話說,我們?cè)谧銎ヅ涞臅r(shí)候,不單單可以根據(jù)commodityTitle匹配,也可以根據(jù)message做匹配。而這合成后的字段xxxKeyWorld是一個(gè)數(shù)組。

  • ?Documents: 添加數(shù)據(jù),更新數(shù)據(jù),刪除數(shù)據(jù)的。如下:

? ? ? ? 向索引庫添加數(shù)據(jù)(Json版):

? ????????向索引庫添加數(shù)據(jù)(xml版):

?????????刪除id為1的記錄:

? ? ? ? ?刪除所有記錄,就是*:*。下一個(gè)是更新,那么就像添加一樣,只不過重點(diǎn)在id上,如果你要添加的這條記錄,id在索引庫剛好存在,那么就會(huì)把原有記錄覆蓋掉,這就是更新。

  • ?Query: 模擬查詢條件。

? ? ? ? ?說明一點(diǎn),如上commodityTitle字段只所以可以根據(jù)它作為查詢條件,那是因?yàn)閏ommodityTitle的index為true,如果為false,那是不能作為查詢條件的。

? ? ? ? ? ? ? ?如果是多條件,那么可以這樣寫,字段1:值1 AND/OR 字段2:值2

? ? ? ? ?如上fq代表過濾查詢。看,一共有兩個(gè)條件,代表我要查詢commodityTitle有華為的以及message帶有色彩字眼的記錄。

????????fq是在q查詢符合結(jié)果中同時(shí)是fq查詢符合的,例如,請(qǐng)求fq是一個(gè)數(shù)組:

如果fq里寫的是字段:[1 TO 10],代表過濾查詢1到10的記錄,該字段可以是價(jià)格之類的,反正就是數(shù)字型的。當(dāng)然,如果要表示10以上的就是[10 TO *]。

????????fq的另一個(gè)語法,表示并且的關(guān)系,比如commodityTitle:華為,蘋果,表示要把commodityTitle中有華為的和有蘋果的都查出來。同樣也支持字段1:值1 AND/OR 字段2:值2

??????????sort為排序。

? ? ? ? ? 下面的start,rows為分頁。

? ? ? ? ? fl為指定返回哪些字段內(nèi)容,比如你寫的是commodityTitle,price。那么就意味著你在查詢的時(shí)候只會(huì)把commodityTitle和price查詢出來,其它的如message不會(huì)查詢出來。

? ? ? ? df表示默認(rèn)字段,譬如你寫的是commodityTitle,那么我們?cè)趒那里就不用寫的那么完整了,比如commodityTitle:華為,就可以直接寫華為這兩個(gè)字了,因?yàn)槟闳绻粚懸阅膫€(gè)字段作為條件,默認(rèn)就是以你df指定的那個(gè)。

?如上圖是做高亮設(shè)置的,hl.fl那里表示你要對(duì)誰做高亮,下面就是高亮后是什么顏色的。

??IK分詞器的使用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? 接下來是配置中文分詞器。往下看吧!!!

? ? ? ? 下載地址:http://files.cnblogs.com/files/zhangweizhong/ikanalyzer-solr5.zip?????????????????????????

?????????解壓文件及說明:

  • ext.dic:自定義詞語,如沙雕,沙雕在漢語里面不是一個(gè)詞,它只是一個(gè)網(wǎng)絡(luò)用語,我們可以配置到這里面,讓它成為一個(gè)詞。

  • stopword.dic:停止分詞,或者說對(duì)哪些不做分詞處理。

  • 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標(biāo)簽,其中的type等于index或者query是什么意思?其實(shí)是對(duì)應(yīng)如下圖:

????????然后再看,useSmart又是什么意思,如下:

? ? ? ? 跟分詞的粒度相關(guān):

  • False:分詞的粒度大,一句話里面分的詞語少。
  • True:分詞的粒度細(xì),一句話里面分的詞語多。

? ? ? ? 2. 把IK的配置放到Solr:

? ? ? ? 放入jar包:準(zhǔn)備好ik-analyzer-solr5-5.x.jar,這個(gè)我們已經(jīng)下載下來了,但還要下載一個(gè)jar包,可以去maven倉庫下,該jar包就是solr-analyzer-ik-5.1.0.jar,也就是總共有兩個(gè)jar,有了這兩個(gè)jar,就可以把這兩個(gè)jar放到/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF/lib目錄下。

? ? ? ? 3. 放配置:

? ? ? ? 退回到上一級(jí),也就是/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF,在該目錄下新建文件夾,名字叫classes,然后再把ext.dic,IKAnalyzer.cfg.xml,stopword.dic這三個(gè)文件放進(jìn)去。

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

? ? ? ? 重新進(jìn)入solr的管理界面,進(jìn)入如下頁面:

? ? ? ? ?補(bǔ)充:ext.dic的說明

? ? ? ? 打開ext.dic文件,直接寫上沙雕這兩個(gè)字即可,只有這樣,在做分詞的時(shí)候,遇到沙雕才不會(huì)把沙和雕分開來,因?yàn)槿绻@樣的話,網(wǎng)友在搜索沙雕時(shí),不就搜索不到有關(guān)沙雕的視頻嗎?那么為了能夠搜索到,我們就得把沙雕寫到ext.dic文件上,畢竟它是一種網(wǎng)絡(luò)用語,要把它當(dāng)成一個(gè)詞語來用。那么以后,我們?cè)偎阉魃车竦臅r(shí)候,就會(huì)搜索到有關(guān)沙雕的視頻了。如下:

以第一個(gè)視頻為例,如下:?

?????????我要說明的是,如果你不在ext.dic寫上沙雕這兩個(gè)字,那不好意思,ik分詞器不認(rèn)為沙雕是一個(gè)詞語,只會(huì)把沙和雕兩個(gè)字分開。

??數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)到Solr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? 我們打開數(shù)據(jù)庫Navicat,然后新建個(gè)數(shù)據(jù)庫,數(shù)據(jù)庫名隨便你叫什么,都行,右鍵數(shù)據(jù)庫,選擇運(yùn)行sql文件,因?yàn)榇颂?#xff0c;我為方便,準(zhǔn)備導(dǎo)入sql文件,就不自己新建表了。我呢這有兩個(gè)sql文件,也就意味著有兩張表,這兩張表的名字叫bless和products,該兩張表數(shù)據(jù)很多,我就只說它有哪些字段好了:

blessid,bless_content,bless_time
productspid,pname,catalog,catalog_name,price,number,description,picture,release_time

? ? ? ? DataImport導(dǎo)入數(shù)據(jù):

? ? ? ? 該功能是將數(shù)據(jù)庫中的數(shù)據(jù)通過sql語句方式導(dǎo)入到Solr索引庫中。

? ? ? ? 第一步:添加jar包:

? ? ? ? 進(jìn)入/usr/local/solr-7.7.3/dist下,復(fù)制solr-dataimporthandler-7.7.3.jar和solr-dataimporthandler-extras-7.7.3.jar。同時(shí)還要復(fù)制mysql的驅(qū)動(dòng)包mysql-connector-java-5.1.42.jar,復(fù)制到哪?復(fù)制到/usr/local/solr-7.7.3/server/solr-webapp/webapp/WEB-INF/lib下即可。

? ? ? ? 第二步:修改solrconfig.xml

? ? ? ? 進(jìn)入/usr/local/solr-7.7.3/server/solr/索引庫名/conf目錄下,我這里的索引庫名是db1_core,也就是配置了中文分詞器的那個(gè)。

? ? ? ? 進(jìn)入conf下,打開solrconfig.xml,首先查詢是否存在dataimport的requestHandler,如果不存在,因此需要手動(dòng)添加,為了以后便于維護(hù)此文件,我們就在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配置文件

? ? ? ? 注意,在當(dāng)前目錄下創(chuàng)建,也就是跟solrconfig.xml同級(jí)。

? ? ? ? data-config.xml的作用:數(shù)據(jù)庫連接相關(guān)信息,SQL以及查詢結(jié)果映射對(duì)應(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標(biāo)簽里,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管理界面,進(jìn)入核心選擇器,選中DataImport選項(xiàng),也就是我們?cè)诮缑嫔咸砑訑?shù)據(jù)(Documents)的上方。如下:

????????只是我這出現(xiàn)了問題,導(dǎo)入失敗,因?yàn)槲业膕olr是在linux安裝的,而mysql在windows中,可能就是該原因,造成導(dǎo)入失敗。為了不浪費(fèi)時(shí)間,我這也就暫時(shí)先放著,大不了我直接向索引庫添加數(shù)據(jù)也是可以的嘛,雖然麻煩點(diǎn)。大家可以看這個(gè)視頻,我就是參考該視頻的,包括我說的那兩張表:<https://www.bilibili.com/video/BV1ob411T7NQ?p=7>。

? ? ? ? 這里我就自行的往索引庫添加了5條數(shù)據(jù),意思意思一下,最重要的還是后面進(jìn)行增刪改查的部分。如下:

3. Solrj的操作

??Solrj添加數(shù)據(jù)/更新數(shù)據(jù)?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ?到這,就要真正的用java代碼來操作索引庫了,而以上用solr管理控制臺(tái)操作的索引庫我們當(dāng)做了解學(xué)習(xí)即可,下面才是王道。

? ? ? ? solrj是操作Solr的JAVA客戶端,它提供了增加,修改,刪除,查詢Solr索引的JAVA接口。Solrj針對(duì)Solr提供了Rest的HTTP接口進(jìn)行了封裝,SolrJ底層是通過使用HttpClient中的方法來完成Solr的操作的。

? ? ? ? 1. 創(chuàng)建項(xiàng)目普通的maven項(xiàng)目。

? ? ? ? ?2. 引入maven坐標(biāo):

<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)建測(cè)試類來測(cè)試連接,如下:? ? ? ??

package com.cht.test;import org.apache.solr.client.solrj.impl.HttpSolrClient;public class Test01Connection {//聲明一個(gè)連接solr的地址public static final String SOLR_URL = "http://192.168.6.133:8983/solr/db1_core";//聲明一個(gè)連接solr的對(duì)象private static HttpSolrClient httpSolrClient;static {httpSolrClient = new HttpSolrClient.Builder(SOLR_URL).build();}public static void main(String[] args) {System.out.println(httpSolrClient);} }

? ? ? ? 如果連接成功,沒報(bào)錯(cuò),就說明可以來操作solr了。

? ? ? ? 4. 使用solrj向索引庫添加數(shù)據(jù):??

public static void main(String[] args) throws IOException, SolrServerException {//一個(gè)一個(gè)添加SolrInputDocument doc = new SolrInputDocument();doc.addField("id",6); //不指定id值,默認(rèn)是UUIDdoc.addField("prod_pname","zakka雜貨&nbsp;情侶小鹿樹脂擺件家居裝飾品一對(duì)");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);//或者這樣,指定某個(gè)庫,如果這樣那么上面的地址SOLR_URL就不用具體指定是哪個(gè)索引庫了。httpSolrClient.add("db1_core",doc);httpSolrClient.commit();httpSolrClient.close(); }

? ? ? ? 測(cè)試一下是否添加成功,如果成功,打開solr管理后臺(tái),看看添加進(jìn)去沒有。

? ? ? ? 下面是添加多條數(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(); }

? ? ? ? 我們還可以添加一個(gè)對(duì)象,那么我們就要?jiǎng)?chuàng)建一個(gè)實(shí)體類,如下:

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("家天下嘻哈動(dòng)物魔術(shù)貼掛鉤繞帶無痕掛鉤2個(gè)裝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í)候是不是設(shè)置了id,那么如果你設(shè)置的id在索引庫已存在,那就是更新,所以這點(diǎn)要注意!!!因?yàn)槟阋徊恍⌒木蜁?huì)把原有記錄覆蓋掉。

??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ù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

????????簡(jiǎn)單查詢:

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()); //默認(rèn)只查詢10條記錄,這點(diǎn)要注意 for (Products p:product){System.out.println(p); } httpSolrClient.commit(); httpSolrClient.close(); SolrQuery solrQuery = new SolrQuery(); String keyWorld = "情侶"; //模擬用戶在搜索框輸入情侶 //判斷當(dāng)前用戶是否對(duì)keyWorld進(jìn)行賦值,如果為空,查詢所有,不為空,就專門查詢用戶輸入的值 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 = "情侶"; //模擬用戶在搜索框輸入情侶//判斷當(dāng)前用戶是否對(duì)keyWorld進(jìn)行賦值,如果為空,查詢所有,不為空,就專門查詢用戶輸入的值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- 那么對(duì)應(yīng)的就是prod_price:[1 TO *]if(!StringUtils.isEmpty(price_str)){String[] arrs = price_str.split("-");if(arrs.length == 1){ //針對(duì)price_str是這種情況: 數(shù)字-solrQuery.addFilterQuery("prod_price:["+arrs[0]+" TO *]");}else{String perfix = arrs[0];if(StringUtils.isEmpty(arrs[0])){//針對(duì)price_str是這種情況: -數(shù)字perfix = "*";}solrQuery.addFilterQuery("prod_price:["+perfix+" TO "+arrs[1]+"]");}}//設(shè)置價(jià)格排序/*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è)置回顯(可以保護(hù)隱私數(shù)據(jù))solrQuery.setFields("id","prod_pname","prod_catalog_name");//注意這里沒對(duì)prod_price做回顯,所以查詢結(jié)果是0.0//設(shè)置默認(rèn)域(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表示查詢出來的個(gè)數(shù),跟上面的product.size()是一樣的long numFound = query.getResults().getNumFound();System.out.println(numFound);for (Products p:product){//獲取id號(hào)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坐標(biāo)

<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

? ? ? ? 測(cè)試是否可以獲取到solrClient,如下:

@SpringBootTest class SolrSpringbootApplicationTests {@AutowiredSolrClient solrClient;@Testvoid contextLoads() {System.out.println(solrClient);}}

總結(jié)

以上是生活随笔為你收集整理的Solr全文检索学习笔记·记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美午夜 | 亚洲第一激情 | 阿v天堂在线| 鸥美一级片 | 亚洲精品日日夜夜 | 日韩激情视频在线 | 中文字幕一区二区在线观看 | 性喷潮久久久久久久久 | 在线日韩一区二区 | 国产12页 | 打屁股疼的撕心裂肺的视频 | 男女男精品视频 | 最新中文字幕在线 | 欧美xxxxbbbb | 国产精品理论片在线观看 | 国产白嫩美女无套久久 | 午夜免费播放观看在线视频 | 日韩欧美成人网 | 美女超碰| 91精品国产aⅴ一区 黄色a网 | 男人的天堂一区二区 | 成人免费视频网站在线观看 | 亚洲免费观看高清完整 | 免费在线观看一区二区三区 | 久色婷婷| 亚洲人体av| 这里只有精品免费视频 | 日本一区二区视频免费 | 日本免费小视频 | 午夜日韩av | 国产日韩视频 | 国产精品久久久久久亚洲影视 | 国产婷婷在线视频 | 天天插av | 亚洲精品一区二区在线观看 | 亚洲一区二区三区黄色 | 欧美成人精品一区二区 | 亚洲成人av免费观看 | 人妖天堂狠狠ts人妖天堂狠狠 | 婷婷久 | 长篇高h肉爽文丝袜 | 91av在线免费 | 亚洲涩涩爱 | 欧美成人毛片 | av在线免费观看网站 | bt天堂新版中文在线地址 | www.香蕉视频在线观看 | 精品99在线观看 | 日本韩国欧美一区二区三区 | 最新中文字幕av | 四虎成人av | 亚洲综合图片区 | 丰满少妇乱子伦精品看片 | 中文字幕丰满乱子伦无码专区 | 成人午夜影院在线观看 | 色在线综合 | 国产一区二区内射 | 成人在线观看免费高清 | 搡8o老女人老妇人老熟 | www插插插| 九九视频免费在线观看 | 欧美日韩成人 | 精品黑人一区二区三区观看时间 | 午夜九九| 亚洲精视频 | 日韩a级在线观看 | 久久福利在线 | 四虎影院在线视频 | 毛片无限看 | 另类性姿势bbwbbw | 四色成人av永久网址 | 欧美熟妇乱码在线一区 | 欧美一区中文字幕 | 日本黄网站色大片免费观看 | 99激情| 亚洲免费观看高清完整版在线 | 欧美在线导航 | 欧美成人aaaa | 色亚洲天堂 | 国产精品亲子伦对白 | 欧美日韩综合 | 黄色片视频网站 | 女同av网站 | 欧美无砖砖区免费 | 亚洲精品中文字幕乱码三区91 | av天天看 | 国产69av| 粉嫩av一区二区 | 国产在线视频在线观看 | 99在线免费 | 性一交一黄一片 | 美女网站黄页 | 女性女同性aⅴ免费观女性恋 | 女人洗澡一级特黄毛片 | 黑人巨大精品人妻一区二区 | 欧美日韩卡一卡二 | 99免费在线视频 | 国产成人免费在线 | 亚洲免费三区 |