版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Solr 調(diào)研總結(jié)1. Solr 是什么?Solr 它是一種開放源碼的、基于 Lucene Java 的搜索服務(wù)器,易于加入到 Web應(yīng)用程序中。Solr 提供了層面搜索(就是統(tǒng)計)、命中醒目顯示并且支持多種輸出格式(包括 XML/XSLT 和 JSON 等格式)。它易于安裝和配置,而且附帶了一個基于 HTTP 的管理界面??梢允褂?Solr 的表現(xiàn)優(yōu)異的基本搜索功能,也可以對它進(jìn)行擴(kuò)展從而滿足企業(yè)的需要。Solr 的特性包括:高級的全文搜索功能專為高通量的網(wǎng)絡(luò)流量進(jìn)行的優(yōu)化基于開放接口(XML 和 HTTP)的標(biāo)準(zhǔn)綜合的 HTML 管理界面可伸縮性能夠有效地到另外一個 Solr 搜索服務(wù)器使
2、用 XML 配置達(dá)到靈活性和適配性可擴(kuò)展的插件體系2. Lucene 是什么?Lucene 是一個基于 Java 的全文信息檢索工具包,它不是一個完整的搜索應(yīng)用程序,而是為你的應(yīng)用程序提供索引和搜索功能。Lucene 目前是 ApacheJakarta(雅加達(dá))中的一個開源項目。也是目前最為流行的基于 Java 開源全文檢索工具包。目前已經(jīng)有很多應(yīng)用程序的搜索功能是基于 Lucene ,比如Eclipse 幫助系統(tǒng)的搜索功能。Lucene 能夠?yàn)槲谋绢愋偷臄?shù)據(jù)建立索引,所以你只要要索引的數(shù)據(jù)格式轉(zhuǎn)化的文本格式,Lucene 就能對你的文檔進(jìn)行索引和搜索。開發(fā)類型全文檢索相關(guān)開發(fā)Solr 版本4
3、.2文件內(nèi)容本文介紹 solr 的功能使用及相關(guān)注意事項;主要包括以下內(nèi)容:環(huán)境搭建及調(diào)試;兩個配置文件介紹;索引;查詢索引,和在查詢中可以應(yīng)用的顯示、拼寫檢查、搜索建議、分組統(tǒng)計、拼音檢索等功能的使用方法。版本作者/修改人日期V1.0gzk2013-06-043. Solr vs LuceneSolr 與 Lucene 并不是競爭對立關(guān)系,恰恰相反 Solr 依存于 Lucene,因?yàn)镾olr 底層的技術(shù)是使用 Lucene 來實(shí)現(xiàn)的,Solr 和 Lucene 的本質(zhì)區(qū)別有以下三點(diǎn):搜索服務(wù)器,企業(yè)級和管理。Lucene 本質(zhì)上是搜索庫,不是獨(dú)立的應(yīng)用程序,而 Solr 是。Lucene
4、專注于搜索底層的建設(shè),而 Solr 專注于企業(yè)應(yīng)用。Lucene不負(fù)責(zé)支撐搜索服務(wù)所必須的管理,而 Solr 負(fù)責(zé)。所以說,一句話概括是 Lucene 面向企業(yè)搜索應(yīng)用的擴(kuò)展。Solr 與 Lucene 架構(gòu)圖:Solr: SolrSolr 使用 Lucene 并且擴(kuò)展了它!一個真正的擁有動態(tài)字段(Dynamic Field)和唯一鍵(Unique Key)的數(shù)據(jù)模式(Data Schema)對 Lucene 查詢語言的強(qiáng)大擴(kuò)展!支持對結(jié)果進(jìn)行動態(tài)的分組和過濾高級的,可配置的文本分析高度可配置和可擴(kuò)展的緩存機(jī)制性能優(yōu)化支持通過 XML 進(jìn)行外部配置擁有一個管理界面可的日志支持高速增量式更新(F
5、ast incremental Updates)和快照發(fā)布(Snapshot Distribution)4.搭建并調(diào)試 Solr4.1 安裝虛擬機(jī)Solr 必須運(yùn)行在 Java1.6 或更高版本的 Java 虛擬機(jī)中,運(yùn)行標(biāo)準(zhǔn) Solr 服務(wù)只需要安裝 JRE 即可,但如果需要擴(kuò)展功能或編譯源碼則需要JDK 來完成。所需 JDK 或 JRE :可以通過下面的地址OpenJDKSun (h IBM (h/j2se/downloads.html )/j2se/downloads.html )/developerworks/java/jdk/ )/technology/products/jrocki
6、t/index.html )Oracle (htt安裝 步驟請參考相應(yīng)的幫助文檔。4.2Solr本文針對 Solr4.2 版本進(jìn)行調(diào)研的,下文介紹內(nèi)容均針對 Solr4.2 版本,如與Solr內(nèi)容為準(zhǔn)。Solr版本有出入請以地址:4.3并設(shè)置 Apache AntSolr 是使用 Ant 進(jìn)行管理的源碼, Ant 是一種基于 Java 的 build 工具。理論上來說,它有些類似于 Maven 或者是 C 中的 make。境變量設(shè)置。后解壓出來后,進(jìn)行環(huán)ANT_HOME:E:Workapache-ant1.9.1 (這里為你自己解壓縮的目錄) PATH:%ANT_HOME%bin (這個設(shè)置是
7、為了方便在 dos 環(huán)境下操作)查看是否安裝成功,在命令行窗口中輸入命令 ant,若出現(xiàn)結(jié)果:說明 ant 安裝成功!因?yàn)?ant 默認(rèn)運(yùn)行 build.xml 文件,這個文件需要建立?,F(xiàn)在就可以進(jìn)行 build Solr 源碼了。在命令行窗口中進(jìn)入到你的 Solr 源碼目錄,輸入 ant 會出現(xiàn)當(dāng)前 build.xml 使用提示信息。只要針對使用的 IDE 進(jìn)行 build 就行了,如果其它的先不用管它,使用eclipse 就在命令行輸入:ant eclipse.如果使用 ant idea。這樣就能進(jìn)行 build 了。黑窗口里提示這個。elliJ IDEA 就在命令行輸入:失敗。為什么呢,
8、最后我發(fā)現(xiàn)是因?yàn)榈?ant 中少了一個 jar 就是這apache-ivy(地址:)這東東名子真怪 ivy 是 ant 管理 jar 依賴關(guān)系的。當(dāng)?shù)谝淮?bulid 時 ivy 會自動把 build 中的缺少的依賴進(jìn)行下載。網(wǎng)速慢的第一次 build 要好久的。一個 jar 就行把 jar 放到 ant 的 lib 下(E:Workapache-ant1.9.1lib)這樣再次運(yùn)行 ant 就會成功了。到現(xiàn)在才可以進(jìn)行 Solr 的代碼調(diào)試。4.4 配置并運(yùn)行 Solr 代碼不管用什么 IDE 首選都要設(shè)置 Solr Home 在 IDE 的 JVM 參數(shù)設(shè)置 VMarguments 寫入
9、-Dsolr.solr.home=solr/exle/solr 一般就行了.對路徑.也可以使用絕solr 使用 StartSolrJetty 文件作為文件進(jìn)行調(diào)試代碼,在這里可以設(shè)置服務(wù)器使用的端口和 solr 的 webapps 目錄.一般都不用設(shè)置,默認(rèn)的就可以進(jìn)行調(diào)試.Solr Home 也能可在代碼中設(shè)置一樣好用.System.setProperty(solr.solr.home,E:Worksolr-4.2.0-src-ideasolrexlesolr);目前是使用自帶的一個exle 作為solr 配置的根目錄,如果你有其他的 solr配置目錄,設(shè)置之即可。點(diǎn)擊 run 即可,deb
10、ug 也是一樣可以用了。沒有別的問題就應(yīng)該能運(yùn)行了.注意 servlet 容器使用的端口,如查提示:FAILED SocketConnector:8983: .BindException: Address already in use: JVM_Bind就說明當(dāng)前端口占用中.改一下就可以了.如果沒有報錯啟動成功后就可以在瀏覽器中輸入地址:就可以看到如下界面到這里 Solr 就成功配置并運(yùn)行了.要是想跟代碼調(diào)試在啟動時在這個方法里點(diǎn)斷點(diǎn)就可以 Initializer 的 initialize()方法如果想從瀏覽器中找斷點(diǎn)調(diào)試就要到 SolrDispatchFilter 的 doFilter 方法
11、中點(diǎn)斷點(diǎn)了.注:IE9 在兼容模式下有 bug,必須設(shè)置為非兼容模式。5.Solr 基礎(chǔ)因?yàn)?Solr 包裝并擴(kuò)展了 Lucene,所以它們使用很多相同的術(shù)語。更重要的是,Solr 創(chuàng)建的索引與 Lucene 搜索引擎庫完全兼容。通過對 Solr 進(jìn)行適當(dāng)?shù)呐渲?,某些情況下可能需要進(jìn)行編碼,Solr 可以閱讀和使用構(gòu)建到其他 Lucene應(yīng)用程序中的索引。在 Solr 和 Lucene 中,使用一個或多個來構(gòu)建索引。包括一個或多個 Field。Field 包括名稱、內(nèi)容以及告訴 Solr 如何處理內(nèi)容的元數(shù)據(jù)。例如,F(xiàn)ield 可以包含字符串、數(shù)字、值或者日期,也可以包含你想添加的任何類型,只
12、需用在 solr 的配置文件中進(jìn)行相應(yīng)的配置即可。Field 可以使用大量的選項來描述,這些選項告訴 Solr 在索引和搜索期間如何處理內(nèi)容?,F(xiàn)在,查看一下表 1 中列出的重要屬性的子集:屬性名稱描述5.1 模式配置 Schema.xmlschema.xml 這個配置文件可以在你solr 包的安裝解壓目錄的solrexlesolrcollection1conf 中找到,它就是 solr 模式關(guān)聯(lián)的文件。打開這個配置文件,你會發(fā)現(xiàn)有詳細(xì)的注釋。模式組織主要分為三個重要配置5.1.1. types 部分是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是添加到索
13、引中的 xml 文件屬性中的類型,如、text、date 等.IndexedIndexed Field 可以進(jìn)行搜索和排序。你還可以在 indexed Field 上運(yùn)行 Solr 分析過程,此過程可修改內(nèi)容以改進(jìn)或更改結(jié)果。Storedstored Field 內(nèi)容保存在索引中。這對于檢索和醒目顯示內(nèi)容很有用,但對于實(shí)際搜索則不是必需的。例如,很多應(yīng)用程序 指向內(nèi)容位置的指針而不是 實(shí)際的文件內(nèi)容。5.1.2. fileds是你添加到索引文件中出現(xiàn)的屬性名稱,而類型就需要用到上面的 types還有一個特殊的字段 copyField,一般用于檢索時用的字段這樣就只對這一個字段進(jìn)行索引分詞就行了
14、 copyField 的 dest 字段如果有多個 source 一定要設(shè)置field: 固定的字段設(shè)置dynamicField: 動態(tài)的字段設(shè)置,用于后期自定義字段,*號通配符.例如: test_i 就是類型的動態(tài)字段.屬性描述name標(biāo)識而已class和其他屬性決定了這個 fieldType 的實(shí)際行為。sortMissingLast設(shè)置成 true 沒有該 field 的數(shù)據(jù)排在有該 field 的數(shù)據(jù)之后,而不管請求時的排序規(guī)則, 默認(rèn)是設(shè)置成 false。sortMissing跟上面倒過來唄。 默認(rèn)是設(shè)置成 falseyzer字段類型指定的分詞器type當(dāng)前分詞用用于的操作.inde
15、x 代表生成索引時使用的分詞器query 代碼在查詢時使用的分詞器tokenizer分詞器類filter分詞后應(yīng)用的過濾器 過濾器調(diào)用順序和配置相同.參數(shù)說明:multiValued=true,否則會報錯的注意:_ver_ 是一個特殊字段,不能刪除,是當(dāng)前索引版本號的.5.1.3. 其他配置uniqueKey: 唯一鍵,這里配置的是上面出現(xiàn)的 fileds,一般是 id、url 等不重復(fù)的。在更新、刪除的時候可以用到。defaultSearchField:默認(rèn)搜索屬性,如 q=solr 就是默認(rèn)的搜索那個字段solrQueryParser:查詢轉(zhuǎn)換模式,是并且還是或者(AND/OR 必須大寫)
16、5.2. solr 配置 solrconfig.xmlE:Worksolr-4.2.0-src-ideasolrexlesolrcollection1conf 中找到,這個配置文solrconfig.xml 這個配置文件可以在你solr 包的安裝解壓目錄的屬性描述name字段類型名classjava 類名indexed缺省 true。 說明這個數(shù)據(jù)應(yīng)被搜索和排序,如果數(shù)據(jù)沒有 indexed,則 stored 應(yīng)是 true。stored缺省 true。說明這個字段被包含在搜索結(jié)果中是合適的。如果數(shù)據(jù)沒有 stored,則 indexed 應(yīng)是 true。omitNorms字段的長度不影響得分
17、和在索引時不做 boost 時,設(shè)置它為 true。一般文本字段不設(shè)置為 true。termVectors如果字段被用來做 more like this 和 highlight 的特性時應(yīng)設(shè)置為pressed字段是壓縮的。這可能導(dǎo)致索引和搜索變慢,但會減少 空間,只有 StrField 和 TextField 是可以壓縮,這通常適合字段的長度超過 200個字符。multiValued字段多于一個值的時候,可設(shè)置為 true。itionIncrementGap和 multiValued 一起使用,設(shè)置多個值之間的虛擬空白的數(shù)量字段屬性說明:5.2.1 索引 indexConfig
18、5.2.2 查詢配置 query屬性描述maxClauses最大的 Query 數(shù)量. 當(dāng)值超出時,拋出 TooManyClausesException.注意這個是全局的,如果是多個SolrCore 都會使用一個值,每個Core 里設(shè)置不一樣的化,會使用最后一個的.filterCachefilterCache了無序的luceneid 集合,1.了 filter queries(“fq”參數(shù))得到的id 集合結(jié)果。2 還可用于 facet 查詢 3. 3)如果配置了 useFilterForSortedQuery,那么如果查詢有 filter,則使用 filterCache。queryResul
19、tCache緩存搜索結(jié)果,一個文檔 ID 列表Cache緩存Lucene 的對象,不會自熱fieldValueCache字段緩存使用文檔 ID 進(jìn)行快速。默認(rèn)情況下創(chuàng)建 fieldValueCache 即使這里沒有配置。enableLazyFieldLoading若應(yīng)用程序預(yù)期只會檢索上少數(shù)幾個 Field,那么可以將屬性設(shè)置為屬性描述poundFile通過將很多 Lucene整合到一個文件來減少使用中的文件的數(shù)量。這可有助于減少 Solr 使用的文件句柄數(shù)目,代價是降低了性能。除非是應(yīng)用程序用完了文件句柄,否則 false 的默認(rèn)值應(yīng)該就已經(jīng)足夠。ramBufferSizeMB在添加或刪除文
20、檔時,為了減少頻繁的更些索引,Solr 會選緩存在內(nèi)存中,當(dāng)內(nèi)存中的文件大于設(shè)置的值,才會更新到索引庫。較大的值可使索引時間變快但會犧牲較多的內(nèi)存。如兩個值同時設(shè)置,滿足一個就會進(jìn)行刷新索引.maxBufferedDocsmergeFactor決定低水平的 Lucene 段被合并的頻率。較小的值(最小為 2)使用的內(nèi)存較少但導(dǎo)致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的內(nèi)存。maxIndexingThreadsindexWriter 生成索引時使用的最大線程數(shù)unlockOnStartupunlockOnStartup 告知 Solr 忽略在多線程環(huán)境中用來保護(hù)索引的鎖定機(jī)制。在
21、某些情況下,索引可能會由于不正確的關(guān)機(jī)或其他錯誤而一直處于鎖定,這就妨礙了添加和更新。將其設(shè)置為 true 可以禁用啟動鎖定,進(jìn)而允許進(jìn)行添加和更新。lockTypesingle: 在只讀索引或是沒有其它進(jìn)程修改索引時使用.native: 使用操作系統(tǒng)本地文件鎖,不能使用多個 Solr 在同一個 JVM個索引. simple :使用一個文本文件鎖定索引.Solr 性能,來了解與各種更改相關(guān)的性能權(quán)衡。 表 1 概括了可控制Solr 索引處理的各種:件內(nèi)容有點(diǎn)多,主要內(nèi)容有:使用的 lib 配置,包含依賴的 jar 和 Solr 的一些插件;組件信息配置;索引配置和查詢配置,下面詳細(xì)說一下索引配
22、置和查詢配置.5.3Solr 加入中文分詞器中文分詞在 solr 里面是沒有默認(rèn)開啟的,需要自己配置一個中文分詞器。目前可用的分詞器有,IK,Jeasy,。其實(shí)主要是兩種,一種是基于的分詞器,如 IK ,Jeasy,優(yōu)點(diǎn)是可以自定義詞庫,增加新詞,缺點(diǎn)是分5.3.1.分詞器的安裝首選將包的 contrib/ysis-extras/lucene-libs/lucene-4.2.0.jar到solrcontribysis-extraslib 下,在 solr出來的詞較多。各有優(yōu)缺點(diǎn)看應(yīng)用場合自己衡量選擇吧。下面給出兩種分詞器的安裝方法,任選其一即可,第一種,因?yàn)榫驮?solr包的 contrib/
23、ysis-extras/lucene-libs/下,就是lucene-4.2.0.jar,首選在 solrconfig.xml 中加一句ysis-extras 的配置,這樣自己加入的分詞器才會引到的 solr 中.優(yōu)點(diǎn)是分詞準(zhǔn)確度高,缺點(diǎn)是不能使用用戶自定義詞庫;另一種是基于最大匹配ICTCLAS 的隱式HMM 算法的中文分詞器,如,ictclas4j,true。延遲加載的一個常見場景大都發(fā)生在應(yīng)用程序返回和顯示一系列搜索結(jié)果的時候,用戶常常會單擊其中的一個來查看在此索引中的原始文檔。初始的顯示常常只需要顯示很短的一段信息。若考慮到檢索大型的代價除非必需,否則就應(yīng)該避免加載整個文檔。query
24、ResultWindowSize一次查詢中最多的doc 的id 數(shù)目.queryResultMaxDocsCached查詢結(jié)果doc 的最大緩存數(shù)量, 例如要求每頁顯示 10 條,這里設(shè)置是 20 條,也就是說緩存里總會給你多出 10 條的數(shù)據(jù).讓你點(diǎn)示下一頁時很快拿到數(shù)據(jù).listener選項定義 newSearcher 和Searcher 事件,您可以使用這些事件來指定實(shí)例化新搜索程序或第一個搜索程序時應(yīng)該執(zhí)行哪些查詢。如果應(yīng)用程序期望請求某些特定的查詢,那么在創(chuàng)建新搜索程序或第一個搜索程序時就應(yīng)該反注釋這些部分并執(zhí)行適當(dāng)?shù)牟樵?。useColdSearcher是否使用冷搜索,為 false
25、 時使用自熱后的 searchermaxWarmingSearchers最大自熱 searcher 數(shù)量5.3.2. IK 分詞器的安裝IKyzer 的包.地址:首選要去/files/IK%20yzer%202012FF_hf1.zip.后解壓出來文件中的三個到solrcontribysis-extraslib 目錄中.IK IKyzer2012FF_u1.jar yzer.cfg.xml分詞器 jar 包 分詞器配置文件分詞器停詞字典,可自定義添加內(nèi)容Stopword.dic后就可以像一樣的進(jìn)行配置 scheme.xml 了.現(xiàn)在來驗(yàn)證下是否添加成功,首先使用 StartSolrJetty
26、來啟動 solr 服務(wù),啟動過如果需要檢索某個字段,還需要在 scheme.xml 下面的 field 中,添加指定的字段,用 text_作為 type 的名字,來完成中文分詞。如 text 要實(shí)現(xiàn)中文檢索的話,就要做如下的配置:本地應(yīng)用文件夾下,打開/solr/conf/scheme.xml,編輯 text 字段類型如下,添加以下代碼到 scheme.xml 中的相應(yīng)位置,就是找到 fieldType 定義的那一段,在下面多添加這一段就好啦如果配置出錯,一般有兩個原因:一是配置的分詞器 jar 找不到,也就是你沒有jar 包到solrcontribysis-extraslib 目前下;二是分
27、詞器版本不對導(dǎo)致的分詞器接口 API 不一樣出的錯,要是這個錯的話就在檢查分詞器的相關(guān)文檔,看一下支持的版本是否一樣.如果在啟動過沒有報錯的話說明配置成功了.可以進(jìn)入到試一下剛加入的中文分詞器.在首頁的 Core地址進(jìn)Selector 中選擇你配置的 Croe 后的ysis,在yse Fieldname /FieldType 里選擇你剛才設(shè)置的字段名稱或是分詞器類型,在 Field Value(index)中輸入:,點(diǎn)擊右面的分詞就行了.6.Solr 功能應(yīng)用我這里主要使用 SolrJ 進(jìn)行介紹一下 Solr 的一些基本應(yīng)用,使用 SolrJ 加上EmbeddedSolrServer(服務(wù)器)
28、,方便進(jìn)行代碼調(diào)試.在功能上和其它服務(wù)器都是一樣的,它們都是繼承的 SolrServer 來提供服務(wù) API 的. EmbeddedSolrServer 優(yōu)點(diǎn)是不用起 http 協(xié)議,直接加載 SolrCore 進(jìn)行操作,性能上應(yīng)該是最快的,方便用于把 Solr 單結(jié)點(diǎn)服務(wù)嵌入到項目中使用.下面開始介紹 Solr的功能的應(yīng)用.EmbeddedSolrServer 初始化:6.1索引在一般系統(tǒng)中的都是增刪改,在 Solr 中的功能是增刪和優(yōu)化功能,在Solr 中的修改操作就是先刪掉再添加.在做索引之前,首先要做的是配置schema.xml 主要是按上面章節(jié)中的說明設(shè)置好字段信稱,類型,索引,分詞
29、等信息),大概就像在數(shù)據(jù)庫中新建一個表一樣.設(shè)置好 schema.xml 就可以進(jìn)行索引相關(guān)操作了.6.1.1 增加索引在增加索引之前先可構(gòu)建好 SolrInput加字段和值.代碼如下:對象.主要操作就是給文檔添構(gòu)建好文檔后添加的上面初始化好的 server 里就行了.Solr 在 add 文檔時.如果文檔不存在就直接添加,如果文檔存在就刪除后添加,這也就是修改功能了.判斷文檔是否存在的依據(jù)是定義好的 uniqueKey 字段.6.1.2 刪除索引刪除索引可以通過兩種方式操作,一種是通過文檔ID 進(jìn)行刪除,別一種是通過查詢到的結(jié)果進(jìn)行刪除.server.add(doc);mit();/這句一般
30、不用加因?yàn)榭梢酝ㄟ^在配置文件中的mit 來提高性能SolrInputdoc = new SolrInput(); doc.setField(id, ABC);doc.setField(content, 中民);System.setProperty(solr.solr.home, E:Worksolr-4.2.0-srcsolrexlesolr); CoreContainer.Initializer initializer = new CoreContainer.Initializer(); CoreContainer coreContainer = initializer.initialize
31、();SolrServer server = new EmbeddedSolrServer(coreContainer, );通過 ID 刪除方式代碼:通過查詢刪除方式代碼:6.1.2 優(yōu)化索引優(yōu)化 Lucene 的索引文件以改進(jìn)搜索性能。索引完成后執(zhí)行一下優(yōu)化通常比較好。如果更新比較頻繁,則應(yīng)該在使用率較低的時候安排優(yōu)化。一個索引無需優(yōu)化也可以正常地運(yùn)行。優(yōu)化是一個耗時較多的過程。6.2 查詢索引Solr 在不修改任務(wù)配置的情況下就可以使用查詢功能,在 web 項目中應(yīng)用可以直接 URL 進(jìn)行Solr 服務(wù)器例如 :上面的意思就是查詢名為collection1 的 SolrCore 的所有內(nèi)
32、容用xml 格式返回并且有縮進(jìn)。返回結(jié)果如下:collection1/select?q=*%3A*&wt=xml&indent=trueserver.optimize();/不要頻繁的調(diào)用.盡量在無人使用時調(diào)用.server.deleteByQuery(*.*);/這樣就刪除了所有文檔索引/”*.*”就查詢所有內(nèi)容的,介紹查詢時會詳細(xì)說明.server.deleteById(id);/或是使用批量刪除 server.deleteById(ids);上面所看到的就是用 xml 格式返回的查詢結(jié)果,其中的 doc 就是一個文檔,在 doc里面的那個就是開始在 schema.xml 中定義的字段.如
33、果使用 SolrJ 進(jìn)行調(diào)用的話代碼如下:返回結(jié)果在 SolrList 中在這個對象中遍歷取出值來:SolrQuery query = new SolrQuery(); query.set(q,*.*);QueryResponse rsp =server.query(query) SolrList list = rsp.getResults();00true*:*xmlE:Reduced軍事1539.txt2-142370173411624385680001162438568000 俄羅斯lenta2006 年 2 月 9 日俄副總司令比熱中將稱,2006 年春天獨(dú)聯(lián)體國家防空系統(tǒng)打擊范圍向西
34、推進(jìn) 150 千米,偵察范圍向西推進(jìn) 400 千米。2006 年 3 月白俄羅斯 4 個 S-300PS 防空營擔(dān)負(fù)戰(zhàn)斗任務(wù),使獨(dú)聯(lián)體防空系統(tǒng)范圍得以向西推進(jìn)。比熱中將還宣布,近期烏茲別克斯坦可能加入獨(dú)聯(lián)體防空系統(tǒng)。獨(dú)聯(lián)體國家防空系統(tǒng)建于 9 年前,共有 9 個國家參加該組織。目前只有亞美尼亞、白俄羅斯、斯坦、俄羅斯和塔吉克斯坦支持該體系。、烏茲別克斯坦與俄羅斯在雙邊基礎(chǔ)上合作和土庫曼最近7 年不參加獨(dú)聯(lián)體國家對空防御。E3798D82-EAB6-2BEA-D7E2-79FBD102E84526.2.1 查詢參數(shù)6.2.2 查詢語法1.匹配所有文檔:*:*2.強(qiáng)制、和可選查詢:名稱描述q查詢字
35、符串,必須的。fqfilter query。使用 Filter Query 可以充分利用 Filter Query Cache,提高檢索性能。作用:在 q 查詢符合結(jié)果中同時是 fq 查詢符合的,例如:q=mm&fq=date_time:20081001 TO 20091031,找關(guān)鍵字 mm,并且 date_time 是 20081001 到 20091031 之間的。flfield list。指定返回結(jié)果字段。以空格“ ”或逗號“,”分隔。start用于分頁定義結(jié)果起始數(shù),默認(rèn)為 0。rows用于分頁定義結(jié)果每頁返回數(shù),默認(rèn)為 10。sort排序,格式:sort=+,+ 。示例:(inSt
36、ock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默認(rèn)是相關(guān)性降序。df默認(rèn)的查詢字段,一般默認(rèn)指定。q.op覆蓋 schema.xml 的 defaultOperator(有空格時用AND還是用OR操作邏輯),一般默認(rèn)指定。必須大寫wtwriter type。指定查詢輸出結(jié)構(gòu)格式,默認(rèn)為“xml”。在 solrconfig.xml 中定義了查詢輸出格式:xml、json、ruby、s、custom。qtquery type,指定查詢使用的 Query Handler,默認(rèn)為“standard”。explainOther設(shè)置當(dāng) debugQu
37、ery=true 時,顯示其他的查詢說明。defType設(shè)置查詢器名稱。timeAllowed設(shè)置查詢超時時間。omitHeader設(shè)置是否忽略查詢結(jié)果返回頭信息,默認(rèn)為“false”。indent返回的結(jié)果是否縮進(jìn),默認(rèn)關(guān)閉,用 indent=true|on 開啟,一般調(diào)試 json,s,ruby 輸出才有必要用這個參數(shù)。ver查詢語法的版本,建議不使用它,由服務(wù)器指定默認(rèn)值。debugQuery設(shè)置返回結(jié)果是否顯示 Debug 信息。for (i = 0; i =min,且x=0的時候,這個函數(shù)的最大值是1,值的大小隨著x的增大而減小。例如:recip(rord(creationDate)
38、,1,1000,1000)17) Max: max(x,c)將會返回一個函數(shù)和一個常量之間的最大值。例如:max(myfield,0)6.3顯示經(jīng)常使用搜索引擎,比如在 baidu 搜索 java ,會出現(xiàn)如下結(jié)果,結(jié)果中與關(guān)鍵字匹配的地方是紅色顯示與其他內(nèi)容區(qū)別開來。solr 默認(rèn)已經(jīng)配置了 highlight 組件(詳見 SOLR_HOME/conf/sorlconfig.xml)。collection1 /select?通常我出只需要這樣請求q=%E4%B8%AD%E5%9B%BD&start=0&rows=1&fl=content+path+&wt=xml&ind ent=true&h
39、l=true&hl.fl=content可以看到與比一般的請求多了兩個參數(shù) hl=true 和 hl.fl= content 。hl=true 是開啟你想對多個字段進(jìn)行,hl.fl= content 是告訴 solr 對 name 字段進(jìn)行,可以繼續(xù)添加字段,字段間用逗號隔開,如(如果hl.fl=name,name2,name3)。內(nèi)容與關(guān)鍵匹配的地方,默認(rèn)將會被 和 包圍。還可以使用 hl.simple.pre 和 hl.simple.簽.查詢結(jié)果如下:t參數(shù)設(shè)置前后標(biāo)使用 SolrJ 方法基本一樣也是設(shè)置這些個參數(shù),只不過是 SolrJ 封裝起來了,代碼如下:02content patht
40、rue0中國contentxmltrue1E:ReducedIT630.txt 本報訊 中國銀聯(lián)和中國電信日前在簽署全面戰(zhàn)略合作協(xié)議。這標(biāo)志著中國銀聯(lián)和中國電信將在通信服務(wù)、信息增值服務(wù)、新型支付產(chǎn)品合作開發(fā)等領(lǐng)域建立全面合作伙伴關(guān)系。據(jù)悉,雙方簽署的全面合作協(xié)議主要內(nèi)容銀聯(lián)將選擇中國電信作為通信信息服務(wù)的主要提供商,雙方圍繞提高中國銀聯(lián)通信的水平和銷售網(wǎng)絡(luò)的服務(wù)水平開展全面、深入的合作;中國電信選擇中國銀聯(lián)作為轉(zhuǎn)接支付服務(wù)的主要提供商,并圍繞開發(fā)、推廣新型支付終端產(chǎn)品和增值服務(wù)開展全面合作。()本報訊 中國銀聯(lián)和中國電信日前在簽署 全面合作協(xié)議。這標(biāo)志著中國銀聯(lián)和中國電信將在通信服務(wù)、信息增
41、值服務(wù)、新型支付產(chǎn)品合作開發(fā)等領(lǐng)域建立全面合作伙伴關(guān)系。據(jù)悉,雙方簽署6.4 拼寫檢查首先配置 solrconfig.xml,文件可能已經(jīng)有這兩個元素(如果沒有添加即可),需要根據(jù)自己的系統(tǒng)環(huán)境做些適當(dāng)?shù)男薷?。SolrQuery query = new SolrQuery(); query.set(q,*.*); query.setHighlight(true); / 開啟組件query.addHighlightField(content);/字段query.setHighlightSimplePre(PRE_TAG);/ 標(biāo)記 query.setHighlightSimplet(T_TAG)
42、; QueryResponse rsp =server.query(query)/上面取結(jié)果的代碼/取出結(jié)果if (rsp.getHighlighting() != null) if (rsp.getHighlighting().get(id) != null) /先通過結(jié)果中的ID 到集合中取出文檔信息MapString, List map = rsp.getHighlighting().get(id);/取出片段if (map.get(name) != null) for (String s : map.get(name) System.out.pr ln(s);配置完成之后,進(jìn)行一下測試
43、,重啟 Solr 后,如下collection1/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BDtext_spelldirectspellsolr.DirectSolrSpellCheckerernal0.521520.01directontruetruespellcheck使用 SolrJ 時也同樣加入?yún)?shù)就可以6.5 檢索建議檢索建議目前是各大搜索的標(biāo)配應(yīng)用,主要作用是避免用戶輸入錯誤的搜索詞,同時將用戶引導(dǎo)到相應(yīng)的搜索上。Solr 內(nèi)置了檢索建議功能,它在Solr 里叫做 Suggest 模
44、塊.該模塊可選擇基于提示詞文本做檢索建議,還支持通過針對索引的某個字段建立索引詞庫做檢索建議。在諸多文檔中都使用基于索引來做檢索建議,因此目前的實(shí)現(xiàn)也是采取該方案。SolrQuery query = new SolrQuery(); query.set(q,*.*);query.set(qt, /spell);QueryResponse rsp =server.query(query)/上面取結(jié)果的代碼SpellCheckResponse spellCheckResponse = rsp.getSpellCheckResponse(); if (spellCheckResponse != nu
45、ll) String collation = spellCheckResponse.getCollatedResult();00103beijing現(xiàn)在開始配置 Suggest 模塊,首先在 solrconfig.xml 文件中配置 Suggest 依賴的 SpellChecker 模塊,然后再配置 Suggest 模塊,所以這兩個都需要配置。配置完成之后,進(jìn)行一下測試,重啟 Solr 后,如下collection1/suggest?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BDstringsuggest.a
46、pache.solr.spelling.suggest.Suggester.apache.solr.spelling.suggest.tst.TSTLookuptext0.0001spellcheckerfreqtrue!-true-truesuggesttruefalse10truesuggest使用 SolrJ 時也同樣加入?yún)?shù)就可以通過 threshold 參數(shù)來限制一些不常用的詞不出現(xiàn)在智能提示列表中,當(dāng)這個值設(shè)置過大時,可能導(dǎo)致結(jié)果太少,需要引起注意。目前主要存在是使用SolrQuery query = new SolrQuery(); query.set(q, token);que
47、ry.set(qt, /suggest); query.set(spellcheck.count, 10); QueryResponse response = server.query(query);SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse(); if (spellCheckResponse != null) List suggestionList = spellCheckResponse.getSuggestions(); for (SpellCheckResponse.Suggestion
48、suggestion : suggestionList) List suggestedWordList = suggestion.getAlternatives(); for (i = 0; i suggestedWordList.size(); i+) String word = suggestedWordList.get(i);return results;04402中國隊中國中國足協(xié)中國freq 排序算法,返回的結(jié)果完全基于索引中字符的出現(xiàn)次數(shù),沒有兼顧用戶搜索詞語的頻率,因此無法將一些熱門詞排在更靠前的位置。這塊可定制Sparator 來實(shí)現(xiàn),目前還沒有著手做這件事情。6.6 分組統(tǒng)計
49、我這里實(shí)現(xiàn)分組統(tǒng)計的方法是使用了 Solr 的 Facet 組件, Facet 組件是 Solr 默認(rèn)集成的一個組件.6.6.1 Facet 簡介Facet 是 solr 的高級搜索功能之一,可以給用戶提供更友好的搜索體驗(yàn).在搜索關(guān)鍵字的同時,能夠按照 Facet 的字段進(jìn)行分組并統(tǒng)計6.6.2 Facet 字段適宜被 Facet 的字段一般代表了實(shí)體的某種公共屬性,如商品的分類,商品的制造廠家,書籍的商等等.Facet 字段的要求Facet 的字段必須被索引.一般來說該字段無需分詞,無需.無需分詞是因?yàn)樵撟侄蔚闹荡砹艘粋€整體概念,如電腦的品牌”聯(lián)想”代表了一個整體概念,如果拆成”聯(lián)”,”想
50、”兩個字都不具有實(shí)際意義.另外該字段的值無需進(jìn)行大小 寫轉(zhuǎn)換等處理,保持其原貌即可.無需是因?yàn)橐话愣杂脩羲P(guān)心的并不是該字段的具體值,而是作為對查詢結(jié)果進(jìn) 行分組的一種,用戶一般會沿著這個分組進(jìn)一步深入搜索.3.特殊情況對于一般查詢而言,分詞和都是必要的.比如 CPU 類型el 酷睿 2 雙核P7570”,拆分成”el”,”酷?!?”P7570”這樣一些關(guān)鍵字并分別索引,可能提供更好的搜索 體驗(yàn).但是如果將 CPU 作為 Facet 字段,最好不進(jìn)行分詞.這樣就造成了,解決方法為, 將 CPU 字段設(shè)置為不分詞不,然后建立另外一.個字段為它的 COPY,對這個 COPY 的字段進(jìn)行分詞和6.
51、6.2 Facet 組件Solr 的默認(rèn) requesndler 已經(jīng)包含了 Facet 組件(ponent).如果自定義 requesndler 或者對默認(rèn)的 requesndler 自定義組件列表,那么需要將Facet 加入到組件列表中去.自定義組件名facet6.6.2 Facet 查詢進(jìn)行Facet 查詢需要在請求參數(shù)中加入facet=on 或者facet=true組件才起作用.1.Field FacetFacetFacet 字段通過在請求中加入 facet.field 參數(shù)加以,如果需要對多個字段進(jìn)行Facet 查詢,那么將該參數(shù)多次.例如:collection1/select?q=
52、*%3A*&start=0&rows=1&wt=xml&indent=true&facet=true&facet.field=category_s&facet.field=modified_l返回結(jié)果:各個 Facet 字段互不影響,且可以針對每個 Facet 字段設(shè)置查詢參數(shù).以下介紹的參數(shù)既可以應(yīng)用于所有的 Facet 字段,也可以應(yīng)用于每個單獨(dú)的 Facet 字段.應(yīng)用于單獨(dú)的字段時通過01truetrue0*:*category_smodified_lxml0599159905990951917902674這種方式調(diào)用.比如 facet.prefix 參數(shù)應(yīng)用于 cpu 字段,可以采用
53、如下形式1.1 facet.prefix表示 Facet 字的前綴.比如 facet.field=cpu&facet.prefix=el,那么對cpu 字段進(jìn)行 Facet 查詢,返回的 cpu 都是以被統(tǒng)計在內(nèi).1.2 facet.sortel 開頭的, AMD 開頭的 cpu 型號將不會表示 Facet 字以哪種順序返回.可接受的值為 true(count)|false(index,lex).true(count)表示按照 count 值從大到小排列. false(index,lex)表示按照字的自然順序(字母,數(shù)字的順序)排列.默認(rèn)情況下為true(count).當(dāng)facet.limit
54、 值為負(fù)數(shù)時,默認(rèn) facet.sort= false(index,lex).1.3facet.limit限制 Facet 字段返回的結(jié)果條數(shù).默認(rèn)值為 100.如果此值為負(fù)數(shù),表示不限制. facet.offset返回結(jié)果集的偏移量,默認(rèn)為 0.它與 facet.limit 配合使用可以達(dá)到分頁的效果.facet.mincount1.41.5限制了 Facet 字的最小 count,默認(rèn)為 0.合理設(shè)置該參數(shù)可以將用戶的關(guān)注點(diǎn)集中在少數(shù)比較熱門的領(lǐng)域.facet.missing默認(rèn)為”,如果設(shè)置為 true 或者 on,那么將統(tǒng)計那些該 Facet 字.facet.method為 null
55、的取值為enum 或fc,默認(rèn)為fc.該字段表示了兩種Facet 的算法,與執(zhí)行效率相關(guān).enum 適用于字比較少的情況,比如字段類型為型,或者字段表示中國的所有省份.Solr 會遍歷該字段的所有取值,并從 filterCache 里為每個值分配一個 filter(這里要求 solrconfig.xml 里對 filterCache 的設(shè)置足夠大).然后計算每個 filter與主查詢的交集.fc(表示Field Cache)適用于字段取值比較多,但在每個文檔里出現(xiàn)次數(shù)比較少的情f.cpu.facet.prefix=elf.字段名.參數(shù)名=參數(shù)值況.Solr 會遍歷所有的文檔,在每個文檔內(nèi)搜索
56、Cache 內(nèi)的值,如果找到就將 Cache內(nèi)該值的 count 加 1.1.8 facet.enum.cache.minDf當(dāng) facet.method=enum 時,此參數(shù)其作用,minDf 表示 minimumfrequency.也就是文檔內(nèi)出現(xiàn)某個關(guān)鍵字的最少次數(shù).該參數(shù)默認(rèn)值為 0.設(shè)置該參數(shù)可以減少 filterCache 的內(nèi)存消耗,但會增加總的查詢時間(計算交集的時間增加了).如果設(shè)置該值的話,文檔建議優(yōu)先嘗試 25-50 內(nèi)的值.6.6.3 Date Facet日期類型的字段在文檔中很常見,如商品上市時間,貨物出倉時間,書籍上架時間等等.某些情況下需要針對這些字段進(jìn)行 Fac
57、et.不過時間字段的取值有無限性,用戶往往關(guān)心的不是某個時間點(diǎn)而是某個時間段內(nèi)的查詢統(tǒng)計結(jié)果. Solr 為日期字段提供了更為方便的查詢統(tǒng)計方式.當(dāng)然,字段的類型必須是 DateField(或其子類型).需要注意的是,使用Date Facet 時,字段名,起始時間,結(jié)束時間,時間間隔這4 個參數(shù)都必須提供.與 Field Facet 類似,Date Facet 也可以對多個字段進(jìn)行 Facet.并且針對每個字段都可以單獨(dú)設(shè)置參數(shù).facet.date:該參數(shù)表示需要進(jìn)行Date Facet 的字段名,與facet.field 一樣,該參數(shù)可以被設(shè)置多次,表示對多個字段進(jìn)行 Date Facet
58、.facet.date.start:起始時間,時間的一般格式為 1995-12-31T23:59:59Z,另外可以使用 NOWYEAR MONTH 等等,具體格式可以參考 DateField 的 java doc. facet.date.end:結(jié)束時間.facet.date.gap:時間間隔.如果 start 為 2009-1-1,end 為 2010-1-1.gap 設(shè)置為+1MONTH 表示間隔 1 個月,那么將會把這段時間劃分為 12 個間隔段.注意+因?yàn)槭翘厥庾址詰?yīng)該用%2B 代替.facet.date.hardend:取值可以為 true|false,默認(rèn)為 false.它表示
59、 gap 迭代到end 處采用何種處理.舉例說明 start 為 2009-1-1,end 為 2009-12-25,gap 為+1MONTH, hardend 為 false 的話最后一個時間段為 2009-12-1 至 2010-1-1;hardend 為 true 的話最后一個時間段為 2009-12-1 至 2009-12-25.facet.date.other:取值范圍為 before|after|betn|none|all,默認(rèn)為 none.before 會對start 之前的值做統(tǒng)計.after 會對 end 之后的值做統(tǒng)計.betn 會對 start 至 end 之間所有值做統(tǒng)
60、計.如果 hardend 為 true 的話,那么該值就是各個時間段統(tǒng)計值的和.none 表示該項禁用.all 表示 before,after,all 都會統(tǒng)計.舉例:返回結(jié)果:574373672415+1MONTH2010-01-01T00:00:00Z180554&facet=on &facet.date=date&facet.date.start=2009-1-1T0:0:0Z &facet.date.end=2010-1-1T0:0:0Z &facet.date.gap=%2B1MONTH &facet.date.other=all6.6.4 Facet QueryFacet Quer
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能應(yīng)用案例及實(shí)現(xiàn)
- 切削加工技術(shù)論壇
- 路基工程標(biāo)準(zhǔn)化施工要點(diǎn)
- 青少年皮膚問題處理常見問題解答
- 心中的情感流淌抒情類作文12篇
- 綿陽市事業(yè)單位2025年下半年公開選調(diào)工作人員備考題庫(25人)及參考答案詳解1套
- 成都市雙流區(qū)怡心第八幼兒園招聘備考題庫及完整答案詳解1套
- 分段絕緣器課件培訓(xùn)
- 分步介紹教學(xué)
- 分布式記賬技術(shù)
- 松下Feeder維護(hù)保養(yǎng)教材
- 汽車融資貸款合同范本
- 碼頭租賃意向協(xié)議書
- 初一語文2025年上學(xué)期現(xiàn)代文閱讀真題(附答案)
- 雨課堂學(xué)堂在線學(xué)堂云《高分子與阻燃材料成型加工( 理大)》單元測試考核答案
- 情趣用品項目計劃書
- 2025年中考語文文言文真題匯編47份(分師生版)
- DBJ∕T 15-106-2015 頂管技術(shù)規(guī)程
- 血透室護(hù)士長5分鐘述職報告
- 全球及中國蓖麻油行業(yè)2025-2026年深度評估及未來發(fā)展分析報告
- DB64∕T 2060-2024 肉牛場主要疫病凈化管理技術(shù)規(guī)范
評論
0/150
提交評論