




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
./Solr全文檢索技術(shù)Solr介紹15Solr安裝配置-SolrCore配置15Solr安裝配置-Solr工程部署10Solr安裝配置-Solr工程測試15Solr安裝配置-多SorlCore配置10Solr入門--schema20Solr入門-安裝中文分詞器15Solr入門-自定義業(yè)務(wù)系統(tǒng)Field20Solr入門-SolrJ介紹10Solr入門-SolrJ索引維護20Solr入門-數(shù)據(jù)導(dǎo)入處理器20Solr入門-搜索語法10Solr入門-SolrJ-搜索20Solr案例-需求分析10Solr案例-架構(gòu)設(shè)計15Solr案例-Service20Solr案例-Controller20Solr案例-主體調(diào)試20Solr案例-功能完善[Solr介紹]Solr是什么Solr是Apache下的一個頂級開源項目,采用Java開發(fā),它是基于Lucene的全文搜索服務(wù)。Solr提供了比Lucene更為豐富的查詢語言,同時實現(xiàn)了可配置、可擴展,并對索引、搜索性能進行了優(yōu)化。Solr可以獨立運行,運行在Jetty、Tomcat等這些Servlet容器中,Solr索引的實現(xiàn)方法很簡單,用POST方法向Solr服務(wù)器發(fā)送一個描述Field及其內(nèi)容的XML文檔,Solr根據(jù)xml文檔添加、刪除、更新索引。Solr搜索只需要發(fā)送HTTPGET請求,然后對Solr返回Xml、json等格式的查詢結(jié)果進行解析,組織頁面布局。Solr不提供構(gòu)建UI的功能,Solr提供了一個管理界面,通過管理界面可以查詢Solr的配置和運行情況。Solr與Lucene的區(qū)別Lucene是一個開放源代碼的全文檢索引擎工具包,它不是一個完整的全文檢索引擎,Lucene提供了完整的查詢引擎和索引引擎,目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便的在目標系統(tǒng)中實現(xiàn)全文檢索的功能,或者以Lucene為基礎(chǔ)構(gòu)建全文檢索引擎。Solr的目標是打造一款企業(yè)級的搜索引擎系統(tǒng),它是一個搜索引擎服務(wù),可以獨立運行,通過Solr可以非??焖俚臉?gòu)建企業(yè)的搜索引擎,通過Solr也可以高效的完成站內(nèi)搜索功能。Solr下載從Solr官方網(wǎng)站〔下載,根據(jù)Solr的運行環(huán)境,Linux下需要下載,windows下需要下載lucene-4.10.3.zip。Solr使用指南可參考:/solr/FrontPage。下載solr-4.10.3.zip并解壓:bin:solr的運行腳本contrib:solr的一些貢獻軟件/插件,用于增強solr的功能。dist:該目錄包含build過程中產(chǎn)生的war和jar文件,以及相關(guān)的依賴文件。docs:solr的API文檔example:solr工程的例子目錄:example/solr: 該目錄是一個包含了默認配置信息的Solr的Core目錄。example/multicore: 該目錄包含了在Solr的multicore中設(shè)置的多個Core目錄。example/webapps:該目錄中包括一個solr.war,該war可作為solr的運行實例工程。licenses:solr相關(guān)的一些許可信息運行環(huán)境solr需要運行在一個Servlet容器中,要求jdk使用1.7以上,Solr默認提供Jetty〔java寫的Servlet容器,本教程使用Tocmat作為Servlet容器,環(huán)境如下:Solr:Jdk:jdk1.7.0_72Tomcat:Solr安裝配置Solr與Tomcat整合[SolrCore配置]SolrHome與SolrCore創(chuàng)建一個Solrhome目錄,SolrHome是Solr運行的主目錄,目錄中包括了運行Solr實例所有的配置文件和數(shù)據(jù)文件。Solr實例即SolrCore,一個SolrHome中可以包括多個SolrCore目錄,每個SolrCore對外提供單獨的搜索和索引服務(wù)。目錄結(jié)構(gòu)example\solr是一個solrhome目錄結(jié)構(gòu),如下:collection1:叫做一個Solr運行實例SolrCore也稱為一個collection,SolrCore的名稱不固定,命名方式類似collection1/collection2/collection3等,每個collection對外單獨提供索引和搜索接口。solrHome中可以創(chuàng)建多個solrCore即collection。SolrCore目錄內(nèi)容如下所示:說明:〔1一個solrCore中包括一個索引目錄,該目錄存儲了該SolrCore的索引文件。data是SolrCore的索引文件目錄,如果沒有solr會自動創(chuàng)建。〔2conf是SolrCore的配置文件目錄:里面包括兩個重要的配置文件solrconfig.xml與schema.xml配置文件創(chuàng)建SolrCore創(chuàng)建目錄F:\develop\solr將example\solr目錄拷貝至F:\develop\solr目錄下并改名為solrHome。將contrib和dist兩個目錄拷貝到F:\develop\solr下。SolrHome下:SolrCore配置每個SolrCore的conf目錄下有solrconfig.xml文件,它是SolrCore運行的配置文件。加載jar包在solrconfig.xml中可以加載一些擴展的jar,表示solrCore的目錄位置,需要根據(jù)擴展Jar的實際存放位置坐對應(yīng)的修改:dataDir索引目錄每個SolrCore都有自己的索引文件目錄,默認在SolrCore目錄下的data中。data數(shù)據(jù)目錄下包括了index索引目錄和tlog日志文件目錄。如果不想使用默認的目錄也可以通過solrConfig.xml更改索引目錄,如下:請求處理器requestHandler請求處理器,定義了索引和搜索的訪問方式。通過/update維護索引,可以完成索引的添加、修改、刪除操作。提交xml、json數(shù)據(jù)完成索引維護,索引維護小節(jié)詳細介紹。通過/select搜索索引。設(shè)置搜索參數(shù)完成搜索,搜索參數(shù)也可以設(shè)置一些默認值,如下:<requestHandlername="/select"class="solr.SearchHandler"><!--設(shè)置默認的參數(shù)值,可以在請求地址中修改這些參數(shù)--><lstname="defaults"><strname="echoParams">explicit</str><intname="rows">10</int><!--顯示數(shù)量--><strname="wt">json</str><!--顯示格式--><strname="df">text</str><!--默認搜索字段--></lst></requestHandler>[Solr工程部署]將拷貝到Tomcat的webapp目錄下改名為solr.war啟動tomcat后,solr.war自動解壓,將原來的solr.war刪除。拷貝example\lib\ext目錄下所有jar包拷貝到Tomcat的webapp\solr\WEB-INF\lib目錄下修改Tomcat目錄下webapp\solr\WEB-INF\web.xml文件,如下所示:設(shè)置Solrhome拷貝perties文件在Tomcat下webapps\solr\WEB-INF目錄中創(chuàng)建文件classes文件夾,復(fù)制Solr目錄下example\resources\perties至Tomcat下webapps\solr\WEB-INF\classes目錄啟動Tomcat訪問http://localhost:8080/solr[管理界面]Dashboard:儀表盤,顯示了該Solr實例開始啟動運行的時間、版本、系統(tǒng)資源、jvm等信息。Logging:Solr運行日志信息Cloud:Cloud即SolrCloud,即Solr云〔集群,當使用SolrCloud模式運行時會顯示此菜單,如下圖是SolrCloud的管理界面:CoreAdmin:SolrCore的管理界面。SolrCore是Solr的一個獨立運行實例單位,它可以對外提供索引和搜索服務(wù),一個Solr工程可以運行多個SolrCore〔Solr實例,一個Core對應(yīng)一個索引目錄。javapropertiesSolr在JVM運行環(huán)境中的屬性信息,包括類路徑、文件編碼、jvm內(nèi)存設(shè)置等信息。TreadDump顯示SolrServer中當前活躍線程信息,同時也可以跟蹤線程運行棧信息。Coreselector選擇一個SolrCore進行詳細操作,如下:Analysis〔重點通過此界面可以測試索引分析器和搜索分析器的執(zhí)行情況。dataimport可以定義數(shù)據(jù)導(dǎo)入處理器,從關(guān)系數(shù)據(jù)庫將數(shù)據(jù)導(dǎo)入到Solr索引庫中。Document〔重點通過此菜單可以創(chuàng)建索引、更新索引、刪除索引等操作,界面如下:/update表示更新索引,solr默認根據(jù)id〔唯一約束域來更新Document的內(nèi)容,如果根據(jù)id值搜索不到id域則會執(zhí)行添加操作,如果找到則更新。query〔重點通過/select執(zhí)行搜索索引,必須指定"q"查詢條件方可搜索。[多SolrCore配置]配置多SolrCore的好處:一個solr工程對外通過SorlCore提供服務(wù),每個SolrCore相當于一個數(shù)據(jù)庫,這個功能就相當于一個mysql可以運行多個數(shù)據(jù)庫。將索引數(shù)據(jù)分SolrCore存儲,方便對索引數(shù)據(jù)管理維護。SolrCloud集群需要使用多core。復(fù)制原來的core目錄為collection2,目錄結(jié)構(gòu)如下:修改collection2下的perties,如下:演示多core的使用,在collection1和collection2中分別創(chuàng)建索引、搜索索引。Solr基本使用[scheam.xml]schema.xml,在SolrCore的conf目錄下,它是Solr數(shù)據(jù)表配置文件,它定義了加入索引的數(shù)據(jù)的數(shù)據(jù)類型的。主要包括FieldTypes、Fields和其他的一些缺省設(shè)置。FieldType域類型定義下邊"text_general"是Solr默認提供的FieldType,通過它說明FieldType定義的內(nèi)容:FieldType子結(jié)點包括:name,class,positionIncrementGap等一些參數(shù):name:是這個FieldType的名稱class:是Solr提供的solr.TextField,solr.TextField允許用戶通過分析器來定制索引和查詢,分析器包括一個分詞器〔tokenizer和多個過濾器〔filterpositionIncrementGap:可選屬性,定義在同一個文檔中此類型數(shù)據(jù)的空白間隔,避免短語匹配錯誤,此值相當于Lucene的短語查詢設(shè)置slop值,根據(jù)經(jīng)驗設(shè)置為100。在FieldType定義的時候最重要的就是定義這個類型的數(shù)據(jù)在建立索引和進行查詢的時候要使用的分析器analyzer,包括分詞和過濾索引分析器中:使用solr.StandardTokenizerFactory標準分詞器,solr.StopFilterFactory停用詞過濾器,solr.LowerCaseFilterFactory小寫過濾器。搜索分析器中:使用solr.StandardTokenizerFactory標準分詞器,solr.StopFilterFactory停用詞過濾器,這里還用到了solr.SynonymFilterFactory同義詞過濾器。Field定義在fields結(jié)點內(nèi)定義具體的Field,filed定義包括name,type〔為之前定義過的各種FieldType,indexed〔是否被索引,stored〔是否被儲存,multiValued〔是否存儲多個值等屬性。如下:multiValued:該Field如果要存儲多個值時設(shè)置為true,solr允許一個Field存儲多個值,比如存儲一個用戶的好友id〔多個,商品的圖片〔多個,大圖和小圖,通過使用solr查詢要看出返回給客戶端是數(shù)組:uniqueKeySolr中默認定義唯一主鍵key為id域,如下:Solr在刪除、更新索引時使用id域進行判斷,也可以自定義唯一主鍵。注意在創(chuàng)建索引時必須指定唯一約束。copyField復(fù)制域copyField復(fù)制域,可以將多個Field復(fù)制到一個Field中,以便進行統(tǒng)一的檢索:比如,輸入關(guān)鍵字要搜索title標題和作者author以及描述description三個域時,要用到復(fù)制域。定義title、authro、descripton、text的域:Text域允許多個值。根據(jù)關(guān)鍵字只搜索text域的內(nèi)容就相當于搜索title、author、description,將title、author、description復(fù)制到text中,如下:dynamicField〔動態(tài)字段動態(tài)字段就是不用指定具體的名稱,只要定義字段名稱的規(guī)則,例如定義一個dynamicField,name為*_i,定義它的type為text,那么在使用這個字段的時候,任何以_i結(jié)尾的字段都被認為是符合這個定義的,例如:name_i,gender_i,school_i等。自定義Field名為:product_title_t,"product_title_t"和scheam.xml中的dynamicField規(guī)則匹配成功,如下:"product_title_t"是以"_t"結(jié)尾。創(chuàng)建索引:搜索索引:[安裝中文分詞器]IKAnalyzer部署〔1將IKAnalyzer2012FF_u1.jar拷貝到solr\contrib\IKAnalyzer\lib下,在solrconfig.xml中添加:〔2在Tomcat的webapps/solr/WEB-INF/下創(chuàng)建classes目錄將、ext_stopword.dicmydict.diccopy到Tomcat/webapps/solr/WEB-INF/classes下注意:ext_stopword.dic和mydict.dic必須保存成無BOM的utf-8類型。修改schema.xml文件FieldType 首先需要在types結(jié)點內(nèi)定義一個FieldType子結(jié)點,包括name,class,等參數(shù),name就是這個FieldType的名稱,class指向org.apa包里面對應(yīng)的class名稱,用來定義這個類型的行為。在FieldType定義的時候最重要的就是定義這個類型的數(shù)據(jù)在建立索引和進行查詢的時候要使用的分析器analyzer,包括分詞和過濾修改Solr的schema.xml文件,添加FieldType:在index或query分別配置isMaxWordLength,查詢采用IK自己的最大分詞法設(shè)置為true,索引則采用它的細粒度分詞法設(shè)置為false。Field: FieldType定義好后就可以在fields結(jié)點內(nèi)定義具體的field,filed定義包括name,type〔即FieldType,indexed〔是否被索引,stored〔是否被儲存,multiValued〔是否有多個值等<!--IKAnalyzerField--><fieldname="title_ik"type="text_ik"indexed="true"stored="true"/><fieldname="content_ik"type="text_ik"indexed="true"stored="false"multiValued="true"/>測試[自定義業(yè)務(wù)系統(tǒng)Field]如果不使用Solr提供的Field可以針對具體的業(yè)務(wù)需要自定義一套Field,如下是商品信息Field:對Mysql數(shù)據(jù)庫中的product表數(shù)據(jù)定義field:在schema.xml中定義如下:[SolrJ索引維護]SolrJ介紹solrj是訪問Solr服務(wù)的java客戶端,提供索引和搜索的請求方法,SolrJ通常嵌入在業(yè)務(wù)系統(tǒng)中,通過SolrJ的API接口操作Solr服務(wù),如下圖:SolrJ安裝Solrj就是一堆jar包,將solrj的jar包加入工程即可使用。jar包明細:solr-4.10.3\dist\solrj-lib\*solr-4.10.3\dist\.jarsolr-4.10.3\example\lib\ext\*junit包[添加/更新索引]使用/update進行索引維護,進入Solr管理界面SolrCore下的Document下:overwrite="true":solr在做索引的時候,如果文檔已經(jīng)存在,就用xml中的文檔進行替換commitWithin="1000":solr在做索引的時候,每個1000〔1秒毫秒,做一次文檔提交。為了方便測試也可以在Document中立即提交,在</add>后邊添加"<commit/>",如下:<add><doc><fieldname="id">change.me</field><fieldname="title">change.me</field></doc></add><commit/>solr默認根據(jù)id〔唯一約束域來更新Document的內(nèi)容,如果根據(jù)id值搜索不到id域則會執(zhí)行添加操作,如果找到則更新。請求xml格式如下:<add><doc><fieldname="id">change.me</field><fieldname="??">??</field>。。。</doc></add>說明:唯一標識Field必須有,這里使用Solr默認的id。使用SolrJ創(chuàng)建索引,通過調(diào)用SolrJ提供的API請求Solr服務(wù),Document通過SolrInputDocument進行構(gòu)建。//創(chuàng)建索引publicvoidcreateIndex<>throwsSolrServerException,IOException{//當沒有指定solrCore時,會默認使用先創(chuàng)建的solrCoreStringbaseURL=":8080/solr";SolrServersolrServer=newHttpSolrServer<baseURL>;//創(chuàng)建文檔SolrInputDocumentdoc=newSolrInputDocument<>;//向文檔中添加域 doc.addField<"id","7">; doc.addField<"product_name","魔幻星座音樂水晶球內(nèi)雕音樂盒七彩漸變音樂球">; doc.addField<"product_price",48.0f>;UpdateResponseupdateResponse=solrServer.add<doc>; solrSmit<>;System.out.println<"通過solrJ添加索引成功">;}說明:根據(jù)id〔唯一約束域來更新Document的內(nèi)容,如果根據(jù)id值搜索不到id域則會執(zhí)行添加操作,如果找到則更新。刪除索引刪除索引格式如下:1刪除制定ID的索引<delete> <id>8</id> 。。。</delete><commit/>2刪除查詢到的索引數(shù)據(jù)<delete> <query>product_catalog_name:幽默雜貨</query></delete><commit/>3刪除所有索引數(shù)據(jù)<delete> <query>*:*</query></delete><commit/>SorJ代碼如下://刪除索引@TestpublicvoidtestDeleteIndex<>throwsSolrServerException,IOException{ SolrServersolrServer=newHttpSolrServer<urlString>;//根據(jù)id刪除 UpdateResponseresponse=solrServer.deleteById<"c0001">;//根據(jù)多個id刪除//solrServer.deleteById<ids>;//自動查詢條件刪除//solrServer.deleteByQuery<"product_keywords:教程">;//提交 solrSmit<>;}說明:deleteById<Stringid>根據(jù)id刪除索引,此方法為重載方法,也可以傳個多個id批量刪除,也可以調(diào)用deleteByQuery<>根據(jù)查詢條件刪除[數(shù)據(jù)導(dǎo)入處理器]安裝dataimport-Handler從關(guān)系數(shù)據(jù)庫將數(shù)據(jù)導(dǎo)入到索引庫。第一步:加載dataimport的jar包將solr\dist\拷貝至solr\contrib\dataimporthandler下,將mysql數(shù)據(jù)庫驅(qū)動的jar拷貝至solr\contrib\databaseDriver下在solrconfig.xml加載以上jar包:第二步:編輯data-config.xml文件,存放在SolrCore的conf目錄說明:<fieldcolumn="pid"name="id"/>必須有一個id域,這里使用Solr默認的id域,域值是從關(guān)系數(shù)據(jù)庫查詢的pid列值。下邊以"product_"開頭的Field都是在schema.xml中自定義的商品信息Field。第三步:配置請求處理器。修改solrconfig.xml,添加requestHandler:第四步:重啟Tomcat。進入管理界面-->SolrCore-->dataimport下執(zhí)行導(dǎo)入第五步:查看導(dǎo)入結(jié)果。進入管理界面-->SolrCore-->dataimport下SolrJ搜索查詢語法通過/select搜索索引,Solr制定一些參數(shù)完成不同需求的搜索:q-查詢字符串,必須的,如果查詢所有使用*:*。fq-〔filterquery過慮查詢,作用:在q查詢符合結(jié)果中同時是fq查詢符合的,例如::過濾查詢價格從1到20的記錄。也可以在"q"查詢條件中使用product_price:[1TO20],如下:也可以使用"*"表示無限,例如:20以上:product_price:[20TO*]20以下:product_price:[*TO20]sort-排序,格式:sort=<fieldname>+<desc|asc>[,<fieldname>+<desc|asc>]…。示例:按價格降序start-分頁顯示使用,開始記錄下標,從0開始rows-指定返回結(jié)果最多有多少條記錄,配合start來實現(xiàn)分頁。顯示前10條。fl-指定返回那些字段內(nèi)容,用逗號或空格分隔多個。顯示商品圖片、商品名稱、商品價格df-指定一個搜索Field也可以在SolrCore目錄中conf/solrconfig.xml文件中指定默認搜索Field,指定后就可以直接在"q"查詢條件中輸入關(guān)鍵字。wt-<writertype>指定輸出格式,可以有xml,json,php,phps,后面solr1.3增加的,要用通知我們,因為默認沒有打開。hl是否高亮,設(shè)置高亮Field,設(shè)置格式前綴和后綴。SolrJ代碼最基本的查詢:@TestpublicvoidindexSearch<>throwsSolrServerException,IOException{//創(chuàng)建solr服務(wù)器SolrServersolrServer=newHttpSolrServer<baseURL>;//創(chuàng)建solr查詢對象SolrQuerysolrQuery=newSolrQuery<>;//設(shè)置查詢條件 solrQuery.set<"q","product_keywords:家天下">;//使用solr服務(wù)器執(zhí)行查詢QueryResponsequeryResponse=solrServer.query<solrQuery>;//獲取查詢結(jié)果SolrDocumentListsolrDocumentList=queryResponse.getResults<>;for<SolrDocumentsolrDocument:solrDocumentList>{System.out.println<"商品ID:"+solrDocument.get<"id">+"\t"+"商品名稱:"+solrDocument.get<"product_name">>;} solrSmit<>;}部分查詢結(jié)果如下:添加篩選條件://設(shè)置查詢條件solrQuery.set<"q","product_keywords:家天下">;//設(shè)置從查詢結(jié)果中篩選的篩選條件solrQuery.addFilterQuery<"product_catalog_name:品味茶杯">;solrQuery.addFilterQuery<"product_price:[8TO*]">;查詢結(jié)果:排序//設(shè)置排序solrQuery.setSort<"product_price",ORDER.asc>;高亮分頁//設(shè)置分頁Integerrows=5;Integercurpage=1;Integerstart=<cur1>*rows;solrQuery.setRows<rows>;solrQuery.setStart<start>;完整的solrJ代碼:@TestpublicvoidadvancedIndexSearch<>throwsSolrServerException,IOException{//創(chuàng)建solr服務(wù)器SolrServersolrServer=newHttpSolrServer<baseURL>;//創(chuàng)建solr查詢對象SolrQuerysolrQuery=newSolrQuery<>;//設(shè)置查詢條件 solrQuery.set<"q","product_keywords:家天下">;//設(shè)置從查詢結(jié)果中篩選的篩選條件 solrQuery.addFilterQuery<"product_catalog_name:品味茶杯">; solrQuery.addFilterQuery<"product_price:[20TO*]">;//設(shè)置排序 solrQuery.setSort<"product_price",ORDER.asc>;//設(shè)置分頁Integerrows=5;Integercurpage=1;Integerstart=<cur1>*rows; solrQuery.setRows<rows>; solrQuery.setStart<start>;//開啟高亮 solrQuery.setHighlight<true>;//添加要高亮顯示的域〔可以添加多個 solrQuery.addHighlightField<"product_name">;//指定高亮的前綴與后綴 solrQuery.setHighlightSimplePre<"<spanstyle=\"color:red\">">; solrQuery.setHighlightSimplePost<"</span>">;//使用solr服務(wù)器執(zhí)行查詢QueryResponsequeryResponse=solrServer.query<solrQuery>;//從查詢結(jié)果中獲取高亮信息:因為查詢信息與高亮信息時分開的,需要單獨去取 Map<String,Map<String,List<String>>>highlighting=queryResponse.getHighlighting<>;//獲取查詢結(jié)果SolrDocumentListsolrDocumentList=queryResponse.getResults<>;System.out.println<"獲取的記錄總條數(shù):"+solrDocumentList.getNumFound<>>;System.out.println<"=====================================">;for<SolrDocumentsolrDocument:solrDocumentList>{System.out.println<"商品ID:"+solrDocument.get<"id">+"\t"+"商品價格:"+solrDocument.get<"product_price">+"\t"+"商品類別:"+solrDocument.get<"product_catalog_name">+"\t"+"商品名稱:"+solrDocument.get<"product_name">>;//根據(jù)商品主鍵取出當前商品的高亮信息 Map<String,List<String>>hlInfo=highlighting.get<solrDocument.get<"id">.toString<>>;StringhighLighInfo=hlInfo.get<"product_name">.get<0>;//一個商品可能多個域上都加了高亮信息,所以此處返回的是ListSystem.out.println<highLighInfo>;System.out.println<"*******************************">;} solrSmit<>;}案例[需求分析] 使用Solr實現(xiàn)電商網(wǎng)站中商品信息搜索功能,可以根據(jù)關(guān)鍵字、分類、價格搜索商品信息,也可以根據(jù)價格進行排序。界面如下:1、通過關(guān)鍵字搜索商品名稱和商品內(nèi)容。2、用戶點擊分類搜索商品。3、根據(jù)價格范圍搜索商品。4、根據(jù)價格進行排序〔升序、降序點擊一下升序,再點一下是降序。默認搜索相關(guān)度排序??梢苑猪摬檎?。7、用戶查詢出來要展示商品圖片、商品名稱、商品價格。[系統(tǒng)架構(gòu)]spring容器spring容器表現(xiàn)層springmvcService層SolrJDao層Solr索引庫mysql數(shù)據(jù)庫商品信息TomcatSolr服務(wù)索引、搜索請求架構(gòu)包括三塊:業(yè)務(wù)系統(tǒng):針對具體需求開發(fā)的業(yè)務(wù)系統(tǒng),本例子是電商系統(tǒng)mysql數(shù)據(jù)庫:存儲了電商系統(tǒng)的表用于持久化,其中包括商品信息。Solr服務(wù):部署的solr服務(wù),對外提供全文檢索服務(wù)。索引流程如下:1、管理員在業(yè)務(wù)系統(tǒng)中維護商品信息2、將商品信息寫入關(guān)系數(shù)據(jù)庫3、將商品信息寫入Solr的索引庫〔本例子不實現(xiàn)商品信息維護功能所以直接使用dataImport-handler處理器完成索引創(chuàng)建搜索流程如下:springmvc:1、用戶在頁面輸入關(guān)鍵字,點擊"商品搜索"2、Controller方法接收用戶提交的關(guān)鍵字3、action調(diào)用Service查詢商品信息Service:4、service使用Solrj請求Solr服務(wù)查詢商品信息運行環(huán)境jdk1.7eclipseindigojar包:spring3.2.0<包括springmvc>jstljunitlog4jsolrJ相關(guān)jar包搜索實現(xiàn)[Service]PO/***商品信息對象模型*/publicclassProducts{//商品編號privateStringpid;//商品名稱privateStringname;//商品分類privateintcatalog;//商品分類名稱privateStringcatalog_name;//價格privateFloatprice;//數(shù)量privateintnumber;//商品描述privateStringdescription;//圖片名稱privateStringpicture;//上架時間privateDateRelease_time;查詢模型:publicclassProductsQueryextendsProducts{//關(guān)鍵字privateStringkeywords;//商品價格起止privateFloatprice_start;privateFloatprice_end;//排序字段privateStringsortField;//排序方式asc/descprivateStringsortType;//當前頁碼privateIntegercurPage;//每頁顯示個數(shù)privateIntegerrows;//總頁數(shù),用于返回privateIntegerpageCount;//總記錄數(shù),用于返回在頁面顯示privateLongrecordCount;Service接口publicinterfaceProductSearchService{//搜索商品publicList<Products>searchProducts<ProductsQueryproductsQuery>throwsException;}service接口實現(xiàn)類使用@service注解標識。Service接口實現(xiàn)類:@ServicepublicclassProductSearchServiceImplimplementsProductSearchService{//solr服務(wù)地址,當沒有指定core時默認一個core提交,實際開發(fā)時將此地址配置在配置文件中privateStringsolrUrl="http://localhost:8088/solr";@OverridepublicList<Products>searchProducts<ProductsQueryproductsQuery>throwsException{//進行關(guān)鍵信息的校驗//非空校驗if<productsQuery==null>{ productsQuery=newProductsQuery<>;}//如果當前頁碼沒有傳if<productsQuery.getCurPage<>==null>{//默認第一頁 productsQuery.setCurPage<1>;}//如果每頁顯示個數(shù)沒有傳默認16個if<productsQuery.getRows<>==null>{ productsQuery.setRows<16>;}//定義solrServer對象,通過此對象發(fā)起solr的請求SolrServersolrServer=newHttpSolrServer<solrUrl>;//定義solr的查詢對象SolrQuerysolrQuery=newSolrQuery<>;//設(shè)置查詢條件//指定查詢語句q,必須要指定查詢q//如果用戶不輸入關(guān)鍵要查詢所有if<productsQuery.getKeywords<>==null||productsQuery.getKeywords<>.equals<"">>{ solrQuery.set<"q","*:*">;}else{ solrQuery.set<"q","product_keywords:"+productsQuery.getKeywords<>>;}//使用過慮,過慮商品分類if<productsQuery.getCatalog_name<>!=null&&!productsQuery.getCatalog_name<>.equals<"">>{ solrQuery.addFilterQuery<"product_catalog_name:"+productsQuery.getCatalog_name<>>;}//過慮,價格范圍if<productsQuery.getPrice_start<>!=null>{if<productsQuery.getPrice_end<>!=null>{//拼接起止價格 solrQuery.addFilterQuery<"product_price:["+productsQuery.getPrice_start<>+"TO"+productsQuery.getPrice_end<>+"]">;}else{//拼接起始價格和* solrQuery.addFilterQuery<"product_price:["+productsQuery.getPrice_start<>+"TO*]">;}}//進行價格排序if<productsQuery.getSortField<>!=null&&!productsQuery.getSortField<>.equals<"">>{if<productsQuery.getSortType<>!=null&&productsQuery.getSortType<>.equals<"desc">>{ solrQuery.setSort<"product_price",ORDER.desc>;}else{ solrQuery.setSort<"product_price",ORDER.asc>;}}//分頁//指定每頁顯示個數(shù)introws=productsQuery.getRows<>;//指定開始下標,根據(jù)每頁顯示個數(shù)和當前頁碼計算intcurPage=productsQuery.getCurPage<>;intstart=rows*<cur1>;//設(shè)置獲取記錄數(shù) solrQuery.setRows<rows>;//設(shè)置開始下標 solrQuery.setStart<start>;//開啟高亮 solrQuery.setHighlight<true>;//指定高亮的field solrQuery.addHighlightField<"product_name">;//指定高亮前綴 solrQuery.setHighlightSimplePre<"<spanstyle=\"color:red\">">;//指定高亮后綴 solrQuery.setHighlightSimplePost<"</span>">;//請求查詢,得到響應(yīng)QueryResponseresponse=solrServer.query<solrQuery>;//從響應(yīng)中取出數(shù)據(jù)SolrDocumentListdocs=response.getResults<>;//搜索到總記錄數(shù)longnumFound=docs.getNumFound<>;//設(shè)置商品總數(shù),回傳給conroller,再由controller傳到頁面 productsQuery.setRecordCount<numFound>;//計算總頁數(shù)intpageCount=<int>Math.ceil<numFound*1.0/rows>; productsQuery.setPageCount<pageCount>; Map<String,Map<String,List<String>>>highlighting=response.getHighlighting<>;//返回結(jié)果集對象 List<Products>list=newArrayList<Products><>;for<SolrDocumentdoc:docs>{//創(chuàng)建一個新商品對象Productsproducts=newProducts<>;//商品idif<doc.get<"id">!=null>{Stringid=<String>doc.get<"id">; products.setPid<id>;}//商品名稱if<doc.get<"product_name">!=null>{Stringproduct_name=<String>doc.get<"product_name">; products.setName<product_name>;}//商品圖片if<doc.get<"product_picture">!=null>{Stringproduct_picture=<String>doc.get<"product_picture">; products.setPicture<product_picture>;}//商品價格if<doc.get<"product_price">!=null>{Floatproduct_price=Float.parseFloat<doc.get<"product_price">.toString<>>; products.setPrice<product_price>;}//商品分類if<doc.get<"product_catalog_name">!=null>{Stringproduct_catalog_name=<String>doc.get<"product_catalog_name">; products.setCatalog_name<product_catalog_name>;}//取出高亮信息,根據(jù)主鍵取出高亮信息 Map<String,List<Stri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出售供電宿舍合同范例
- 冷凍豬蹄采購合同范例
- 個人融資顧問合同范例
- ktv加盟合同范例
- 黑土灘退化高寒草地土壤有機碳對生物炭添加的響應(yīng)機制研究
- 重慶市銅梁區(qū)郵儲銀行支農(nóng)問題研究
- 公園招商合同范例
- 買賣合同與加工合同范例
- 結(jié)合面部動作單元的三維人臉重建算法研究及疲勞檢測應(yīng)用
- 教育教學(xué)論文-開拓思想 提高素質(zhì)
- 人教版2025三下英語單詞表
- 職業(yè)病衛(wèi)生監(jiān)督培訓(xùn)課件
- 2024年張家界市市直事業(yè)單位選調(diào)工作人員考試真題
- 2025年四川省對口招生(旅游類)考試復(fù)習(xí)題(附答案)
- 私募股權(quán)投資基金基礎(chǔ)知識-《私募股權(quán)投資基金基礎(chǔ)知識》高分通關(guān)卷5
- 校園春季傳染病預(yù)防
- 婦產(chǎn)科學(xué)(甲)知到智慧樹章節(jié)測試課后答案2024年秋浙江大學(xué)
- 醫(yī)院危險化學(xué)品安全管理
- 2024年勞動合同(30篇)
- 燃氣公司安全生產(chǎn)實施方案
- 全國職業(yè)院校技能大賽高職組(生產(chǎn)事故應(yīng)急救援賽項)選拔賽考試題庫500題(含答案)
評論
0/150
提交評論