日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【转载】solr教程,值得刚接触搜索开发人员一看

發(fā)布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】solr教程,值得刚接触搜索开发人员一看 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載:http://blog.csdn.net/awj3584/article/details/16963525

Solr調(diào)研總結(jié)

開發(fā)類型

全文檢索相關(guān)開發(fā)

Solr版本

4.2

文件內(nèi)容

本文介紹solr的功能使用及相關(guān)注意事項;主要包括以下內(nèi)容:環(huán)境搭建及調(diào)試;兩個核心配置文件介紹;維護(hù)索引;查詢索引,和在查詢中可以應(yīng)用的高亮顯示、拼寫檢查、搜索建議、分組統(tǒng)計、拼音檢索等功能的使用方法。

版本

作者/修改人

日期

V1.0

gzk

2013-06-04

1. Solr 是什么?

Solr它是一種開放源碼的、基于 Lucene Java 的搜索服務(wù)器,易于加入到 Web 應(yīng)用程序中。Solr 提供了層面搜索(就是統(tǒng)計)、命中醒目顯示并且支持多種輸出格式(包括XML/XSLT 和JSON等格式)。它易于安裝和配置,而且附帶了一個基于HTTP 的管理界面。可以使用 Solr 的表現(xiàn)優(yōu)異的基本搜索功能,也可以對它進(jìn)行擴展從而滿足企業(yè)的需要。Solr的特性包括:

  • 高級的全文搜索功能
  • 專為高通量的網(wǎng)絡(luò)流量進(jìn)行的優(yōu)化
  • 基于開放接口(XML和HTTP)的標(biāo)準(zhǔn)
  • 綜合的HTML管理界面
  • 可伸縮性-能夠有效地復(fù)制到另外一個Solr搜索服務(wù)器
  • 使用XML配置達(dá)到靈活性和適配性
  • 可擴展的插件體系

2. Lucene 是什么?

Lucene是一個基于Java的全文信息檢索工具包,它不是一個完整的搜索應(yīng)用程序,而是為你的應(yīng)用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加達(dá)) 家族中的一個開源項目。也是目前最為流行的基于Java開源全文檢索工具包。目前已經(jīng)有很多應(yīng)用程序的搜索功能是基于 Lucene ,比如Eclipse 幫助系統(tǒng)的搜索功能。Lucene能夠為文本類型的數(shù)據(jù)建立索引,所以你只要把你要索引的數(shù)據(jù)格式轉(zhuǎn)化的文本格式,Lucene 就能對你的文檔進(jìn)行索引和搜索。

3. Solr vs Lucene

Solr與Lucene 并不是競爭對立關(guān)系,恰恰相反Solr 依存于Lucene,因為Solr底層的核心技術(shù)是使用Lucene 來實現(xiàn)的,Solr和Lucene的本質(zhì)區(qū)別有以下三點:搜索服務(wù)器,企業(yè)級和管理。Lucene本質(zhì)上是搜索庫,不是獨立的應(yīng)用程序,而Solr是。Lucene專注于搜索底層的建設(shè),而Solr專注于企業(yè)應(yīng)用。Lucene不負(fù)責(zé)支撐搜索服務(wù)所必須的管理,而Solr負(fù)責(zé)。所以說,一句話概括 Solr: Solr是Lucene面向企業(yè)搜索應(yīng)用的擴展。

Solr與Lucene架構(gòu)圖:

Solr使用Lucene并且擴展了它!

  • 一個真正的擁有動態(tài)字段(Dynamic Field)和唯一鍵(Unique Key)的數(shù)據(jù)模式(Data Schema)
  • 對Lucene查詢語言的強大擴展!
  • 支持對結(jié)果進(jìn)行動態(tài)的分組和過濾
  • 高級的,可配置的文本分析
  • 高度可配置和可擴展的緩存機制
  • 性能優(yōu)化
  • 支持通過XML進(jìn)行外部配置
  • 擁有一個管理界面
  • 可監(jiān)控的日志
  • 支持高速增量式更新(Fast incremental Updates)和快照發(fā)布(Snapshot Distribution)

4.搭建并調(diào)試Solr

4.1 安裝虛擬機

Solr 必須運行在Java1.6 或更高版本的Java 虛擬機中,運行標(biāo)準(zhǔn)Solr 服務(wù)只需要安裝JRE 即可,但如果需要擴展功能或編譯源碼則需要下載JDK 來完成。可以通過下面的地址下載所需JDK 或JRE :

  • OpenJDK (?http://java.sun.com/j2se/downloads.html?)
  • Sun (http://java.sun.com/j2se/downloads.html?)
  • IBM (http://www.ibm.com/developerworks/java/jdk/?)
  • Oracle (http://www.oracle.com/technology/products/jrockit/index.html?)

安裝 步驟請參考相應(yīng)的幫助文檔。

4.2下載Solr

本文針對Solr4.2版本進(jìn)行調(diào)研的,下文介紹內(nèi)容均針對Solr4.2版本,如與Solr 最新版本有出入請以官方網(wǎng)站內(nèi)容為準(zhǔn)。Solr官方網(wǎng)站下載地址:http://lucene.apache.org/solr/

4.3下載并設(shè)置Apache Ant

Solr是使用Ant進(jìn)行管理的源碼, Ant是一種基于Java的build工具。理論上來說,它有些類似于Maven 或者是 C中的make。下載后解壓出來后,進(jìn)行環(huán)境變量設(shè)置。

ANT_HOME:E:\Work\apache-ant\1.9.1 (這里為你自己解壓縮的目錄) PATH:%ANT_HOME%\bin (這個設(shè)置是為了方便在dos環(huán)境下操作)

查看是否安裝成功,在命令行窗口中輸入命令ant,若出現(xiàn)結(jié)果:



說明ant安裝成功!因為ant默認(rèn)運行build.xml文件,這個文件需要我們建立。現(xiàn)在就可以進(jìn)行build Solr源碼了。在命令行窗口中進(jìn)入到你的Solr源碼目錄,輸入ant會出現(xiàn)當(dāng)前build.xml使用提示信息。

其它的先不用管它,我們只要針對我們使用的IDE進(jìn)行build就行了,如果使用eclipse就在命令行輸入:ant eclipse.如果使用IntelliJ IDEA 就在命令行輸入:ant idea。這樣就能進(jìn)行build了。

黑窗口里提示這個。。。

失敗。。。為什么呢,最后我發(fā)現(xiàn)是因為下載的ant中少了一個jar就是這apache-ivy(下載地址:http://ant.apache.org/ivy/)這東東名子真怪 ivy是ant管理jar依賴關(guān)系的。當(dāng)?shù)谝淮蝏ulid時ivy會自動把build中的缺少的依賴進(jìn)行下載。網(wǎng)速慢的第一次build要好久的。。。

下載一個jar就行把jar放到ant的lib下(E:\Work\apache-ant\1.9.1\lib)這樣再次運行ant 就會成功了。到現(xiàn)在才可以進(jìn)行Solr的代碼調(diào)試。

4.4配置并運行Solr代碼

不管用什么IDE首選都要設(shè)置Solr Home在IDE的JVM參數(shù)設(shè)置VM arguments寫入 -Dsolr.solr.home=solr/example/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:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");

目前是使用自帶的一個example作為solr配置的根目錄,如果你有其他的solr配置目錄,設(shè)置之即可。點擊run即可,debug也是一樣可以用了。沒有別的問題就應(yīng)該能運行了.注意servlet 容器使用的端口,如查提示:

FAILED SocketConnector@0.0.0.0:8983: java.net.BindException: Address already in use: JVM_Bind 就說明當(dāng)前端口占用中.改一下就可以了.如果沒有報錯啟動成功后就可以在瀏覽器中輸入地址:?http://localhost:8983/solr/?就可以看到如下界面

到這里Solr就成功配置并運行了.要是想跟代碼調(diào)試在啟動時在這個方法里點斷點就可以Initializer的initialize()方法如果想從瀏覽器中找斷點調(diào)試就要到SolrDispatchFilter的doFilter方法中點斷點了.

注:IE9在兼容模式下有bug,必須設(shè)置為非兼容模式。

5.Solr基礎(chǔ)

因為 Solr 包裝并擴展了Lucene,所以它們使用很多相同的術(shù)語。更重要的是,Solr 創(chuàng)建的索引與 Lucene 搜索引擎庫完全兼容。通過對 Solr 進(jìn)行適當(dāng)?shù)呐渲?#xff0c;某些情況下可能需要進(jìn)行編碼,Solr 可以閱讀和使用構(gòu)建到其他 Lucene 應(yīng)用程序中的索引。在 Solr 和 Lucene 中,使用一個或多個 Document 來構(gòu)建索引。Document 包括一個或多個 Field。Field 包括名稱、內(nèi)容以及告訴 Solr 如何處理內(nèi)容的元數(shù)據(jù)。

例如,Field 可以包含字符串、數(shù)字、布爾值或者日期,也可以包含你想添加的任何類型,只需用在solr的配置文件中進(jìn)行相應(yīng)的配置即可。Field 可以使用大量的選項來描述,這些選項告訴 Solr 在索引和搜索期間如何處理內(nèi)容。

現(xiàn)在,查看一下表 1 中列出的重要屬性的子集:

屬性名稱

描述

Indexed

Indexed Field 可以進(jìn)行搜索和排序。你還可以在 indexed Field 上運行 Solr 分析過程,此過程可修改內(nèi)容以改進(jìn)或更改結(jié)果。

Stored

stored Field 內(nèi)容保存在索引中。這對于檢索和醒目顯示內(nèi)容很有用,但對于實際搜索則不是必需的。例如,很多應(yīng)用程序存儲指向內(nèi)容位置的指針而不是存儲實際的文件內(nèi)容。

5.1模式配置Schema.xml

schema.xml這個配置文件可以在你下載solr包的安裝解壓目錄的\solr\example\solr\collection1\conf中找到,它就是solr模式關(guān)聯(lián)的文件。打開這個配置文件,你會發(fā)現(xiàn)有詳細(xì)的注釋。模式組織主要分為三個重要配置

5.1.1. types 部分

是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是添加到索引中的xml文件屬性中的類型,如int、text、date等.

<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>

<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

? <tokenizer class="solr.StandardTokenizerFactory"/>

? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

? <filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

<analyzer type="query">

? <tokenizer class="solr.StandardTokenizerFactory"/>

? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

? <filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

參數(shù)說明:

屬性

描述

name

標(biāo)識而已

class

和其他屬性決定了這個fieldType的實際行為。

sortMissingLast

設(shè)置成true沒有該field的數(shù)據(jù)排在有該field的數(shù)據(jù)之后,而不管請求時的排序規(guī)則, 默認(rèn)是設(shè)置成false。

sortMissingFirst

跟上面倒過來唄。 默認(rèn)是設(shè)置成false

analyzer

字段類型指定的分詞器

type

當(dāng)前分詞用用于的操作.index代表生成索引時使用的分詞器query代碼在查詢時使用的分詞器

tokenizer

分詞器類

filter

分詞后應(yīng)用的過濾器? 過濾器調(diào)用順序和配置相同.

5.1.2. fileds

是你添加到索引文件中出現(xiàn)的屬性名稱,而聲明類型就需要用到上面的types

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>

<field name="path" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true" />

<field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/>

<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>

<field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/>

<field name="_version_" type="long" indexed="true" stored="true"/>

<dynamicField name="*_i" type="int" indexed="true" stored="true"/>

<dynamicField name="*_l" type="long" indexed="true" stored="true"/>

<dynamicField name="*_s" type="string" indexed="true" stored="true" />

  • field: 固定的字段設(shè)置
  • dynamicField: 動態(tài)的字段設(shè)置,用于后期自定義字段,*號通配符.例如: test_i就是int類型的動態(tài)字段.

還有一個特殊的字段copyField,一般用于檢索時用的字段這樣就只對這一個字段進(jìn)行索引分詞就行了copyField的dest字段如果有多個source一定要設(shè)置multiValued=true,否則會報錯的

<copyField source="content" dest="pinyin"/>

<copyField source="content" dest="text"/>

<copyField source="pinyin" dest="text"/>

字段屬性說明:

屬性

描述

name

字段類型名

class

java類名

indexed

缺省true。 說明這個數(shù)據(jù)應(yīng)被搜索和排序,如果數(shù)據(jù)沒有indexed,則stored應(yīng)是true。

stored

缺省true。說明這個字段被包含在搜索結(jié)果中是合適的。如果數(shù)據(jù)沒有stored,則indexed應(yīng)是true。

omitNorms

字段的長度不影響得分和在索引時不做boost時,設(shè)置它為true。

一般文本字段不設(shè)置為true。

termVectors

如果字段被用來做more like this 和highlight的特性時應(yīng)設(shè)置為true。

compressed

字段是壓縮的。這可能導(dǎo)致索引和搜索變慢,但會減少存儲空間,只有StrField和TextField是可以壓縮,這通常適合字段的長度超過200個字符。

multiValued

字段多于一個值的時候,可設(shè)置為true。

positionIncrementGap

和multiValued一起使用,設(shè)置多個值之間的虛擬空白的數(shù)量

注意:_version_ 是一個特殊字段,不能刪除,是記錄當(dāng)前索引版本號的.

5.1.3. 其他配置

uniqueKey: 唯一鍵,這里配置的是上面出現(xiàn)的fileds,一般是id、url等不重復(fù)的。在更新、刪除的時候可以用到。

defaultSearchField:默認(rèn)搜索屬性,如q=solr就是默認(rèn)的搜索那個字段

solrQueryParser:查詢轉(zhuǎn)換模式,是并且還是或者(AND/OR必須大寫)

5.2. solr配置solrconfig.xml

?????? solrconfig.xml這個配置文件可以在你下載solr包的安裝解壓目錄的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,這個配置文件內(nèi)容有點多,主要內(nèi)容有:使用的lib配置,包含依賴的jar和Solr的一些插件;組件信息配置;索引配置和查詢配置,下面詳細(xì)說一下索引配置和查詢配置.

5.2.1索引indexConfig

?????? Solr 性能因素,來了解與各種更改相關(guān)的性能權(quán)衡。 表 1 概括了可控制 Solr 索引處理的各種因素:

屬性

描述

useCompoundFile

通過將很多 Lucene 內(nèi)部文件整合到一個文件來減少使用中的文件的數(shù)量。這可有助于減少 Solr 使用的文件句柄數(shù)目,代價是降低了性能。除非是應(yīng)用程序用完了文件句柄,否則 false 的默認(rèn)值應(yīng)該就已經(jīng)足夠。

ramBufferSizeMB

在添加或刪除文檔時,為了減少頻繁的更些索引,Solr會選緩存在內(nèi)存中,當(dāng)內(nèi)存中的文件大于設(shè)置的值,才會更新到索引庫。較大的值可使索引時間變快但會犧牲較多的內(nèi)存。如兩個值同時設(shè)置,滿足一個就會進(jìn)行刷新索引.

maxBufferedDocs

mergeFactor

決定低水平的 Lucene 段被合并的頻率。較小的值(最小為 2)使用的內(nèi)存較少但導(dǎo)致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的內(nèi)存。

maxIndexingThreads

indexWriter生成索引時使用的最大線程數(shù)

unlockOnStartup

unlockOnStartup 告知 Solr 忽略在多線程環(huán)境中用來保護(hù)索引的鎖定機制。在某些情況下,索引可能會由于不正確的關(guān)機或其他錯誤而一直處于鎖定,這就妨礙了添加和更新。將其設(shè)置為 true 可以禁用啟動鎖定,進(jìn)而允許進(jìn)行添加和更新。

lockType

single: 在只讀索引或是沒有其它進(jìn)程修改索引時使用.

native: 使用操作系統(tǒng)本地文件鎖,不能使用多個Solr在同一個JVM中共享一個索引.

simple :使用一個文本文件鎖定索引.

5.2.2 查詢配置query

屬性

描述

maxBooleanClauses

最大的BooleanQuery數(shù)量. 當(dāng)值超出時,拋出 TooManyClausesException.注意這個是全局的,如果是多個SolrCore都會使用一個值,每個Core里設(shè)置不一樣的化,會使用最后一個的.

filterCache

filterCache存儲了無序的lucene document id集合,1.存儲了filter queries(“fq”參數(shù))得到的document id集合結(jié)果。2還可用于facet查詢3. 3)如果配置了useFilterForSortedQuery,那么如果查詢有filter,則使用filterCache。

queryResultCache

緩存搜索結(jié)果,一個文檔ID列表

documentCache

緩存Lucene的Document對象,不會自熱

fieldValueCache

字段緩存使用文檔ID進(jìn)行快速訪問。默認(rèn)情況下創(chuàng)建fieldValueCache即使這里沒有配置。

enableLazyFieldLoading

若應(yīng)用程序預(yù)期只會檢索 Document 上少數(shù)幾個 Field,那么可以將屬性設(shè)置為 true。延遲加載的一個常見場景大都發(fā)生在應(yīng)用程序返回和顯示一系列搜索結(jié)果的時候,用戶常常會單擊其中的一個來查看存儲在此索引中的原始文檔。初始的顯示常常只需要顯示很短的一段信息。若考慮到檢索大型 Document 的代價,除非必需,否則就應(yīng)該避免加載整個文檔。

queryResultWindowSize

一次查詢中存儲最多的doc的id數(shù)目.

queryResultMaxDocsCached

查詢結(jié)果doc的最大緩存數(shù)量, 例如要求每頁顯示10條,這里設(shè)置是20條,也就是說緩存里總會給你多出10條的數(shù)據(jù).讓你點示下一頁時很快拿到數(shù)據(jù).

listener

選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定實例化新搜索程序或第一個搜索程序時應(yīng)該執(zhí)行哪些查詢。如果應(yīng)用程序期望請求某些特定的查詢,那么在創(chuàng)建新搜索程序或第一個搜索程序時就應(yīng)該反注釋這些部分并執(zhí)行適當(dāng)?shù)牟樵儭?/p>

useColdSearcher

是否使用冷搜索,為false時使用自熱后的searcher

maxWarmingSearchers

最大自熱searcher數(shù)量

5.3Solr加入中文分詞器

???? 中文分詞在solr里面是沒有默認(rèn)開啟的,需要我們自己配置一個中文分詞器。目前可用的分詞器有smartcn,IK,Jeasy,庖丁。其實主要是兩種,一種是基于中科院ICTCLAS的隱式馬爾科夫HMM算法的中文分詞器,如smartcn,ictclas4j,優(yōu)點是分詞準(zhǔn)確度高,缺點是不能使用用戶自定義詞庫;另一種是基于最大匹配的分詞器,如IK ,Jeasy,庖丁,優(yōu)點是可以自定義詞庫,增加新詞,缺點是分出來的垃圾詞較多。各有優(yōu)缺點看應(yīng)用場合自己衡量選擇吧。

?????? 下面給出兩種分詞器的安裝方法,任選其一即可,推薦第一種,因為smartcn就在solr發(fā)行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首選在solrconfig.xml中加一句引用analysis-extras的配置,這樣我們自己加入的分詞器才會引到的solr中.

<lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" />

5.3.1. smartcn 分詞器的安裝

??? 首選將發(fā)行包的contrib/analysis-extras/lucene-libs/ lucene-analyzers-smartcn-4.2.0.jar復(fù)制到\solr\contrib\analysis-extras\lib下,在solr本地應(yīng)用文件夾下,打開/solr/conf/scheme.xml,編輯text字段類型如下,添加以下代碼到scheme.xml中的相應(yīng)位置,就是找到fieldType定義的那一段,在下面多添加這一段就好啦

<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">

????? <analyzer type="index">

??????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

??????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

????? </analyzer>

????? <analyzer type="query">

???????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

??????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

????? </analyzer>

</fieldType>

?????? 如果需要檢索某個字段,還需要在scheme.xml下面的field中,添加指定的字段,用text_ smartcn作為type的名字,來完成中文分詞。如 text要實現(xiàn)中文檢索的話,就要做如下的配置:

<field name ="text" type ="text_smartcn" indexed ="true" stored ="false" multiValued ="true"/>

5.3.2. IK 分詞器的安裝

首選要去下載IKAnalyzer的發(fā)行包.下載地址:?http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.

下載后解壓出來文件中的三個復(fù)制到\solr\contrib\analysis-extras\lib目錄中.

IKAnalyzer2012FF_u1.jar?????? 分詞器jar包

IKAnalyzer.cfg.xml???????????????? 分詞器配置文件

Stopword.dic?????????????????????????? 分詞器停詞字典,可自定義添加內(nèi)容

復(fù)制后就可以像smartcn一樣的進(jìn)行配置scheme.xml了.

<fieldType name="text_ik" class="solr.TextField">

???????? <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>

?????? 現(xiàn)在來驗證下是否添加成功,首先使用StartSolrJetty來啟動solr服務(wù),啟動過程中如果配置出錯,一般有兩個原因:一是配置的分詞器jar找不到,也就是你沒有復(fù)制jar包到\solr\contrib\analysis-extras\lib目前下;二是分詞器版本不對導(dǎo)致的分詞器接口API不一樣出的錯,要是這個錯的話就在檢查分詞器的相關(guān)文檔,看一下支持的版本是否一樣.

?????? 如果在啟動過程中沒有報錯的話說明配置成功了.我們可以進(jìn)入到http://localhost:8983/solr地址進(jìn)行測試一下剛加入的中文分詞器.在首頁的Core Selector中選擇你配置的Croe后點擊下面的Analysis,在Analyse Fieldname / FieldType里選擇你剛才設(shè)置的字段名稱或是分詞器類型,在Field Value(index)中輸入:中國人,點擊右面的分詞就行了.

6.Solr功能應(yīng)用

?????? 我這里主要使用SolrJ進(jìn)行介紹一下Solr的一些基本應(yīng)用,使用SolrJ加上EmbeddedSolrServer(嵌入式服務(wù)器),方便進(jìn)行代碼跟蹤調(diào)試.在功能上和其它服務(wù)器都是一樣的,它們都是繼承的SolrServer來提供服務(wù)API的. EmbeddedSolrServer優(yōu)點是不用起http協(xié)議,直接加載SolrCore進(jìn)行操作,性能上應(yīng)該是最快的,方便用于把Solr單結(jié)點服務(wù)嵌入到項目中使用.下面開始介紹Solr的功能的應(yīng)用.EmbeddedSolrServer初始化:

System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src\\solr\\example\\solr");

CoreContainer.Initializer initializer = new CoreContainer.Initializer();

CoreContainer? coreContainer = initializer.initialize();

SolrServer? server = new EmbeddedSolrServer(coreContainer, "");

6.1維護(hù)索引

?????? 在一般系統(tǒng)中維護(hù)的都是增刪改,在Solr中的維護(hù)功能是增刪和優(yōu)化功能,在Solr中的修改操作就是先刪掉再添加.在做索引維護(hù)之前,首先要做的是配置schema.xml主要是按上面章節(jié)中的說明設(shè)置好字段信息(名稱,類型,索引,存儲,分詞等信息),大概就像在數(shù)據(jù)庫中新建一個表一樣.設(shè)置好schema.xml就可以進(jìn)行索引相關(guān)操作了.

6.1.1增加索引

?????? 在增加索引之前先可構(gòu)建好SolrInputDocument對象.主要操作就是給文檔添加字段和值.代碼如下:

SolrInputDocument doc = new SolrInputDocument();

doc.setField("id", "ABC");

doc.setField("content", "中華人民共和國");

構(gòu)建好文檔后添加的上面初始化好的server里就行了.

server.add(doc);

server.commit();//這句一般不用加因為我們可以通過在配置文件中的

???????????????????????????? //autoCommit來提高性能

?????? Solr在add文檔時.如果文檔不存在就直接添加,如果文檔存在就刪除后添加,這也就是修改功能了.判斷文檔是否存在的依據(jù)是定義好的uniqueKey字段.

6.1.2刪除索引

?????? 刪除索引可以通過兩種方式操作,一種是通過文檔ID進(jìn)行刪除,別一種是通過查詢到的結(jié)果進(jìn)行刪除.

通過ID刪除方式代碼:

server.deleteById(id);

//或是使用批量刪除

server.deleteById(ids);

通過查詢刪除方式代碼:

server.deleteByQuery("*.*");//這樣就刪除了所有文檔索引

//”*.*”就查詢所有內(nèi)容的,介紹查詢時會詳細(xì)說明.

6.1.2優(yōu)化索引

?????? 優(yōu)化Lucene 的索引文件以改進(jìn)搜索性能。索引完成后執(zhí)行一下優(yōu)化通常比較好。如果更新比較頻繁,則應(yīng)該在使用率較低的時候安排優(yōu)化。一個索引無需優(yōu)化也可以正常地運行。優(yōu)化是一個耗時較多的過程。

? server.optimize();//不要頻繁的調(diào)用..盡量在無人使用時調(diào)用.

6.2查詢索引

?????? Solr在不修改任務(wù)配置的情況下就可以使用查詢功能,在web項目中應(yīng)用可以直接URL進(jìn)行訪問Solr服務(wù)器例如 :

http://localhost:8983/solr/ collection1/select?q=*%3A*&wt=xml&indent=true

?????? 上面的意思就是查詢名為collection1的SolrCore的所有內(nèi)容用xml格式返回并且有縮進(jìn)。

返回結(jié)果如下:

<?xml version="1.0" encoding="UTF-8"?>

<response>

<lst name="responseHeader">

? <int name="status">0</int>

? <int name="QTime">0</int>

? <lst name="params">

??? <str name="indent">true</str>

??? <str name="q">*:*</str>

??? <str name="wt">xml</str>

? </lst>

</lst>

<result name="response" numFound="17971" start="0">

? <doc>

??? <str name="path">E:\Reduced\軍事\1539.txt</str>

??? <str name="category_s">2</str>

??? <int name="browseCount_i">-1423701734</int>

??? <long name="modified_l">1162438568000</long>

??? <long name="releasedate_l">1162438568000</long>

??? <str name="content"> [俄羅斯lenta網(wǎng)站2006年2月9日報道]俄空軍副總司令比熱耶夫中將稱,2006年春天獨聯(lián)體國家防空系統(tǒng)打擊范圍向西推進(jìn)150千米,偵察范圍向西推進(jìn)400千米。  2006年3月白俄羅斯4個S-300PS防空導(dǎo)彈營擔(dān)負(fù)戰(zhàn)斗任務(wù),使獨聯(lián)體防空系統(tǒng)作戰(zhàn)范圍得以向西推進(jìn)。比熱耶夫中將還宣布,近期烏茲別克斯坦可能加入獨聯(lián)體防空系統(tǒng)。  獨聯(lián)體國家防空系統(tǒng)建于9年前,共有9個國家參加該組織。目前只有亞美尼亞、白俄羅斯、哈薩克斯坦、吉爾吉斯、俄羅斯和塔吉克斯坦支持該體系。  烏克蘭、烏茲別克斯坦與俄羅斯在雙邊基礎(chǔ)上合作,格魯吉亞和土庫曼最近7年不參加獨聯(lián)體國家對空防御。</str>

??? <str name="id">E3798D82-EAB6-2BEA-D7E2-79FBD102E845</str>

??? <long name="_version_">1436361868021071872</long></doc>

? …

</result>

</response>

上面所看到的就是用xml格式返回的查詢結(jié)果,其中的doc就是一個文檔,在doc里面的那個就是我們開始在schema.xml中定義的字段.

如果使用SolrJ進(jìn)行調(diào)用的話代碼如下:

SolrQuery query = new SolrQuery();

query.set("q","*.*");

QueryResponse rsp =server.query(query)

SolrDocumentList list = rsp.getResults();

返回結(jié)果在SolrDocumentList中在這個對象中遍歷取出值來:

for (int i = 0; i < list.size(); i++) {

?? SolrDocument sd = list.get(i);

?? String id = (String) sd.getFieldValue("id");

?? System.out.println(id);

}

6.2.1查詢參數(shù)

名稱

描述

q

查詢字符串,必須的。

fq

filter query。使用Filter Query可以充分利用Filter Query Cache,提高檢索性能。作用:在q查詢符合結(jié)果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關(guān)鍵字mm,并且date_time是20081001到20091031之間的。

fl

field list。指定返回結(jié)果字段。以空格“ ”或逗號“,”分隔。

start

用于分頁定義結(jié)果起始記錄數(shù),默認(rèn)為0。

rows

用于分頁定義結(jié)果每頁返回記錄數(shù),默認(rèn)為10。

sort

排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默認(rèn)是相關(guān)性降序。

df

默認(rèn)的查詢字段,一般默認(rèn)指定。

q.op

覆蓋schema.xml的defaultOperator(有空格時用"AND"還是用"OR"操作邏輯),一般默認(rèn)指定。必須大寫

wt

writer type。指定查詢輸出結(jié)構(gòu)格式,默認(rèn)為“xml”。在solrconfig.xml中定義了查詢輸出格式:xml、json、python、ruby、php、phps、custom。

qt

query type,指定查詢使用的Query Handler,默認(rèn)為“standard”。

explainOther

設(shè)置當(dāng)debugQuery=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,php,phps,ruby輸出才有必要用這個參數(shù)。

version

查詢語法的版本,建議不使用它,由服務(wù)器指定默認(rèn)值。

debugQuery

設(shè)置返回結(jié)果是否顯示Debug信息。

6.2.2查詢語法

1.匹配所有文檔:*:*

2.強制、阻止和可選查詢:

1)??? Mandatory:查詢結(jié)果中必須包括的(for example, only entry name containing the word make)

Solr/Lucene Statement:+make, +make +up ,+make +up +kiss

2)??? prohibited:(for example, all documents except those with word believe)

Solr/Lucene Statement:+make +up -kiss

3)??? optional:

Solr/Lucene Statement:+make +up kiss

3.布爾操作:AND、OR和NOT布爾操作(必須大寫)與Mandatory、optional和prohibited相似。

1)?????? make AND up = +make +up :AND左右兩邊的操作都是mandatory

2)?????? make || up = make OR up=make up :OR左右兩邊的操作都是optional

3)?????? +make +up NOT kiss = +make +up –kiss

4)?????? make AND up OR french AND Kiss不可以達(dá)到期望的結(jié)果,因為AND兩邊的操作都是mandatory的。

4. 子表達(dá)式查詢(子查詢):可以使用“()”構(gòu)造子查詢。

示例:(make AND up) OR (french AND Kiss)

5.子表達(dá)式查詢中阻止查詢的限制:

示例:make (-up):只能取得make的查詢結(jié)果;要使用make (-up *:*)查詢make或者不包括up的結(jié)果。

6.多字段fields查詢:通過字段名加上分號的方式(fieldName:query)來進(jìn)行查詢

示例:entryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c

7.通配符查詢(wildCard Query):

1)?????? 通配符?和*:“*”表示匹配任意字符;“?”表示匹配出現(xiàn)的位置。

示例:ma?*(ma后面的一個位置匹配),ma??*(ma后面兩個位置都匹配)

2)?????? 查詢字符必須要小寫:+Ma +be**可以搜索到結(jié)果;+Ma +Be**沒有搜索結(jié)果.

3)?????? 查詢速度較慢,尤其是通配符在首位:主要原因一是需要迭代查詢字段中的每個term,判斷是否匹配;二是匹配上的term被加到內(nèi)部的查詢,當(dāng)terms數(shù)量達(dá)到1024的時候,查詢會失敗。

4)?????? Solr中默認(rèn)通配符不能出現(xiàn)在首位(可以修改QueryParser,設(shè)置

setAllowLeadingWildcard為true)

5)?????? set setAllowLeadingWildcard to true.

8.模糊查詢、相似查詢:不是精確的查詢,通過對查詢的字段進(jìn)行重新插入、刪除和轉(zhuǎn)換來取得得分較高的查詢解決(由Levenstein Distance Algorithm算法支持)。

1)?????? 一般模糊查詢:示例:make-believ~

2)?????? 門檻模糊查詢:對模糊查詢可以設(shè)置查詢門檻,門檻是0~1之間的數(shù)值,門檻越高表面相似度越高。示例:make-believ~0.5、make-believ~0.8、make-believ~0.9

9.范圍查詢(Range Query):Lucene支持對數(shù)字、日期甚至文本的范圍查詢。結(jié)束的范圍可以使用“*”通配符。

示例:

1)?????? 日期范圍(ISO-8601 時間GMT):sa_type:2 AND a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]

2)?????? 數(shù)字:salary:[2000 TO *]

3)?????? 文本:entryNm:[a TO a]

10.日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被標(biāo)志成日期。

示例:

1)? r_event_date:[* TO NOW-2YEAR]:2年前的現(xiàn)在這個時間

2)? r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的這個時間

6.2.3函數(shù)查詢(Function Query)

?????? 函數(shù)查詢 可以利用 numeric字段的值 或者 與字段相關(guān)的的某個特定的值的函數(shù),來對文檔進(jìn)行評分。

1.??? 使用函數(shù)查詢的方法

這里主要有三種方法可以使用函數(shù)查詢,這三種s方法都是通過solr http接口的。

1)??? 使用FunctionQParserPlugin。ie: q={!func}log(foo)

2)??? 使用“_val_”內(nèi)嵌方法

內(nèi)嵌在正常的solr查詢表達(dá)式中。即,將函數(shù)查詢寫在 q這個參數(shù)中,這時候,我們使用“_val_”將函數(shù)與其他的查詢加以區(qū)別。

ie:entryNm:make && _val_:ord(entryNm)

3)??? 使用dismax中的bf參數(shù)

使用明確為函數(shù)查詢的參數(shù),比如說dismax中的bf(boost function)這個參數(shù)。? 注意:bf這個參數(shù)是可以接受多個函數(shù)查詢的,它們之間用空格隔開,它們還可以帶上權(quán)重。所以,當(dāng)我們使用bf這個參數(shù)的時候,我們必須保證單個函數(shù)中是沒有空格出現(xiàn)的,不然程序有可能會以為是兩個函數(shù)。

示例:

q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3

2.??? 函數(shù)的格式(Function Query Syntax)

目前,function query 并不支持 a+b 這樣的形式,我們得把它寫成一個方法形式,這就是 sum(a,b).

3.??? 使用函數(shù)查詢注意事項

1)??? 用于函數(shù)查詢的field必須是被索引的;

2)??? 字段不可以是多值的(multi-value)

4.??? 可以利用的函數(shù) (available function)

1)??? constant:支持有小數(shù)點的常量; 例如:1.5 ;SolrQuerySyntax:_val_:1.5

2)??? fieldvalue:這個函數(shù)將會返回numeric field的值,這個字段必須是indexd的,非multiValued的。格式很簡單,就是該字段的名字。如果這個字段中沒有這樣的值,那么將會返回0。

3)??? ord:對于一個字段,它所有的值都將會按照字典順序排列,這個函數(shù)返回你要查詢的那個特定的值在這個順序中的排名。這個字段,必須是非multiValued的,當(dāng)沒有值存在的時候,將返回0。例如:某個特定的字段只能去三個值,“apple”、“banana”、“pear”,那么ord(“apple”)=1,ord(“banana”)=2,ord(“pear”)=3.需要注意的是,ord()這個函數(shù),依賴于值在索引中的位置,所以當(dāng)有文檔被刪除、或者添加的時候,ord()的值就會發(fā)生變化。當(dāng)你使用MultiSearcher的時候,這個值也就是不定的了。

4)??? rord:這個函數(shù)將會返回與ord相對應(yīng)的倒排序的排名。

格式: rord(myIndexedField)。

5)??? sum:這個函數(shù)的意思就顯而易見啦,它就是表示“和”啦。

格式:sum(x,1) 、sum(x,y)、 sum(sqrt(x),log(y),z,0.5)

6)??? product:product(x,y,...)將會返回多個函數(shù)的乘積。格式:product(x,2)、product(x,y)

7)??? div:div(x,y)表示x除以y的值,格式:div(1,x)、div(sum(x,100),max(y,1))

8)??? pow:pow表示冪值。pow(x,y) =x^y。例如:pow(x,0.5) 表示開方pow(x,log(y))

9)??? abs:abs(x)將返回表達(dá)式的絕對值。格式:abs(-5)、 abs(x)

10)? log:log(x)將會返回基數(shù)為10,x的對數(shù)。格式: log(x)、 log(sum(x,100))

11)? Sqrt:sqrt(x) 返回 一個數(shù)的平方根。格式:sqrt(2)、sqrt(sum(x,100))

12)? Map:如果 x>=min,且x<=max,那么map(x,min,max,target)=target.如果 x不在[min,max]這個區(qū)間內(nèi),那么map(x,min,max,target)=x.

格式:map(x,0,0,1)

13)? Scale:scale(x,minTarget,maxTarget) 這個函數(shù)將會把x的值限制在[minTarget,maxTarget]范圍內(nèi)。

14)? query :query(subquery,default)將會返回給定subquery的分?jǐn)?shù),如果subquery與文檔不匹配,那么將會返回默認(rèn)值。任何的查詢類型都是受支持的。可以通過引用的方式,也可以直接指定查詢串。

例子:q=product(popularity, query({!dismax v='solr rocks'}) 將會返回popularity和通過dismax 查詢得到的分?jǐn)?shù)的乘積。

q=product(popularity, query($qq)&qq={!dismax}solr rocks 跟上一個例子的效果是一樣的。不過這里使用的是引用的方式

q=product(popularity, query($qq,0.1)&qq={!dismax}solr rocks 在前一個例子的基礎(chǔ)上又加了一個默認(rèn)值。

15)? linear: inear(x,m,c)表示 m*x+c ,其中m和c都是常量,x是一個變量也可以是一個函數(shù)。例如: linear(x,2,4)=2*x+4.

16)? Recip:recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是變量或者一個函數(shù)。當(dāng)a=b,并且x>=0的時候,這個函數(shù)的最大值是1,值的大小隨著x的增大而減小。例如:recip(rord(creationDate),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)。通常我出只需要這樣請求http://localhost:8983/solr/ collection1 /select? q=%E4%B8%AD%E5%9B%BD&start=0&rows=1&fl=content+path+&wt=xml&indent=true&hl=true&hl.fl=content

?????? 可以看到與比一般的請求多了兩個參數(shù) "hl=true" 和 "hl.fl= content " 。

"hl=true" 是開啟高亮,"hl.fl= content " 是告訴solr 對 name 字段進(jìn)行高亮(如果你想對多個字段進(jìn)行高亮,可以繼續(xù)添加字段,字段間用逗號隔開,如 "hl.fl=name,name2,name3")。 高亮內(nèi)容與關(guān)鍵匹配的地方,默認(rèn)將會被 "<em>" 和 "</em>" 包圍。還可以使用hl.simple.pre" 和 "hl.simple.post"參數(shù)設(shè)置前后標(biāo)簽.

查詢結(jié)果如下:

<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">2</int> <lst name="params"> <str name="fl">content path</str> <str name="indent">true</str> <str name="start">0</str> <str name="q">中國</str> <str name="hl.simple.pre"><em></str> <str name="hl.simple.post"></em></str> <str name="hl.fl">content</str> <str name="wt">xml</str> <str name="hl">true</str> <str name="rows">1</str> </lst> </lst> <result name="response" numFound="6799" start="0"> <doc> <str name="path">E:\Reduced\IT\630.txt</str> <str name="content">  本報訊 中國銀聯(lián)股份有限公司和中國電信集團(tuán)日前在北京簽署全面戰(zhàn)略合作協(xié)議。這標(biāo)志著中國銀聯(lián)和中國電信將在通信服務(wù)、信息增值服務(wù)、新型支付產(chǎn)品合作開發(fā)等領(lǐng)域建立全面合作伙伴關(guān)系。  據(jù)悉,雙方簽署的全面戰(zhàn)略合作協(xié)議主要內(nèi)容是:中國銀聯(lián)將選擇中國電信作為通信信息服務(wù)的主要提供商,雙方圍繞提高中國銀聯(lián)內(nèi)部通信的水平和銷售網(wǎng)絡(luò)的服務(wù)水平開展全面、深入的合作;中國電信選擇中國銀聯(lián)作為銀行卡轉(zhuǎn)接支付服務(wù)的主要提供商,并圍繞開發(fā)、推廣新型支付終端產(chǎn)品和增值服務(wù)開展全面合作。(辛華)</str></doc> </result> <lst name="highlighting"> <lst name="7D919C61-03B3-4B6F-2D10-9E3CC92D2852"> <arr name="content"> <str>  本報訊 <em>中國</em>銀聯(lián)股份有限公司和<em>中國</em>電信集團(tuán)日前在北京簽署全面戰(zhàn)略合作協(xié)議。這標(biāo)志著<em>中國</em>銀聯(lián)和<em>中國</em>電信將在通信服務(wù)、信息增值服務(wù)、新型支付產(chǎn)品合作開發(fā)等領(lǐng)域建立全面合作伙伴關(guān)系。  據(jù)悉,雙方簽署</str> </arr> </lst> </lst> </response>

使用SolrJ方法基本一樣也是設(shè)置這些個參數(shù),只不過是SolrJ封裝起來了,代碼如下:

SolrQuery query = new SolrQuery();

query.set("q","*.*");

query.setHighlight(true); // 開啟高亮組件

query.addHighlightField("content");// 高亮字段

query.setHighlightSimplePre(PRE_TAG);// 標(biāo)記

query.setHighlightSimplePost(POST_TAG);

QueryResponse rsp =server.query(query)

//…上面取結(jié)果的代碼

//取出高亮結(jié)果

if (rsp.getHighlighting() != null) {

? if (rsp.getHighlighting().get(id) != null) {//先通過結(jié)果中的ID到高亮集合中取出文檔高亮信息

??? Map<String, List<String>> map = rsp.getHighlighting().get(id);//取出高亮片段

??? if (map.get(name) != null) {

????? for (String s : map.get(name)) {

??????? System.out.println(s);

????? }

??? }

}

6.4拼寫檢查

?????? 首先配置 solrconfig.xml,文件可能已經(jīng)有這兩個元素(如果沒有添加即可),需要根據(jù)我們自己的系統(tǒng)環(huán)境做些適當(dāng)?shù)男薷摹?/p>

<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <str name="queryAnalyzerFieldType">text_spell</str> <lst name="spellchecker"> <str name="name">direct</str> <str name="field">spell</str> <str name="classname">solr.DirectSolrSpellChecker</str> <str name="distanceMeasure">internal</str> <float name="accuracy">0.5</float> <int name="maxEdits">2</int> <int name="minPrefix">1</int> <int name="maxInspections">5</int> <int name="minQueryLength">2</int> <float name="maxQueryFrequency">0.01</float> </lst> </searchComponent> <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> <lst name="defaults"> <str name="spellcheck.dictionary">direct</str> <str name="spellcheck">on</str> <str name="spellcheck.collate">true</str> <str name="spellcheck.collateExtendedResults">true</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>

配置完成之后,我們進(jìn)行一下測試,重啟Solr后,訪問如下鏈接

http://localhost:8983/solr/ collection1/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD

<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <result name="response" numFound="0" start="0"/> <lst name="spellcheck"> <lst name="suggestions"> <lst name="beijink"> <int name="numFound">1</int> <int name="startOffset">0</int> <int name="endOffset">3</int> <arr name="suggestion"> <str>beijing</str> </arr> </lst> </lst> </lst> </response>

使用SolrJ時也同樣加入?yún)?shù)就可以

SolrQuery query = new SolrQuery();

query.set("q","*.*");

query.set("qt", "/spell");

QueryResponse rsp =server.query(query)

//…上面取結(jié)果的代碼

SpellCheckResponse spellCheckResponse = rsp.getSpellCheckResponse();

if (spellCheckResponse != null) {

? String collation = spellCheckResponse.getCollatedResult();

}

6.5檢索建議

?????? 檢索建議目前是各大搜索的標(biāo)配應(yīng)用,主要作用是避免用戶輸入錯誤的搜索詞,同時將用戶引導(dǎo)到相應(yīng)的關(guān)鍵詞搜索上。Solr內(nèi)置了檢索建議功能,它在Solr里叫做Suggest模塊.該模塊可選擇基于提示詞文本做檢索建議,還支持通過針對索引的某個字段建立索引詞庫做檢索建議。在諸多文檔中都推薦使用基于索引來做檢索建議,因此我們目前的實現(xiàn)也是采取該方案。

?????? 現(xiàn)在我們開始配置Suggest模塊,首先在solrconfig.xml文件中配置Suggest依賴的SpellChecker模塊,然后再配置Suggest模塊,所以這兩個都需要配置。

<searchComponent? name="suggest" class="solr.SpellCheckComponent">

??? <str name="queryAnalyzerFieldType">string</str>

??? <lst name="spellchecker">

??????? <str name="name">suggest</str>

??????? <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>

??????? <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>

??????? <str name="field">text</str>

??????? <float name="threshold">0.0001</float>

??????? <str name="spellcheckIndexDir">spellchecker</str>

??????? <str name="comparatorClass">freq</str>

??????? <str name="buildOnOptimize">true</str>

??????? <!--<str name="buildOnCommit">true</str>-->

??? </lst>

</searchComponent>

<requestHandler? name="/suggest" class="solr.SearchHandler" startup="lazy">

??? <lst name="defaults">

??????? <str name="spellcheck">true</str>

??????? <str name="spellcheck.dictionary">suggest</str>

??????? <str name="spellcheck.onlyMorePopular">true</str>

??????? <str name="spellcheck.extendedResults">false</str>

??????? <str name="spellcheck.count">10</str>

??????? <str name="spellcheck.collate">true</str>

??? </lst>

??? <arr name="components">

??????? <str>suggest</str>

??? </arr>

</requestHandler>

配置完成之后,我們進(jìn)行一下測試,重啟Solr后,訪問如下鏈接

http://localhost:8983/solr/ collection1/suggest?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD

<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">4</int> </lst> <lst name="spellcheck"> <lst name="suggestions"> <lst name="中國"> <int name="numFound">4</int> <int name="startOffset">0</int> <int name="endOffset">2</int> <arr name="suggestion"> <str>中國隊</str> <str>中國證監(jiān)會</str> <str>中國足協(xié)</str> <str>中國銀行</str> </arr> </lst> </lst> </lst> </response>

使用SolrJ時也同樣加入?yún)?shù)就可以

SolrQuery query = new SolrQuery();

query.set("q", token);

query.set("qt", "/suggest");

query.set("spellcheck.count", "10");

QueryResponse response = server.query(query);

SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();

if (spellCheckResponse != null) {

?? List<SpellCheckResponse.Suggestion> suggestionList = spellCheckResponse.getSuggestions();

?? for (SpellCheckResponse.Suggestion suggestion : suggestionList) {

???? List<String> suggestedWordList = suggestion.getAlternatives();

???? for (int i = 0; i < suggestedWordList.size(); i++) {

?????? String word = suggestedWordList.get(i);

???? }

?? }

?? return results;

}

?????? 通過threshold參數(shù)來限制一些不常用的詞不出現(xiàn)在智能提示列表中,當(dāng)這個值設(shè)置過大時,可能導(dǎo)致結(jié)果太少,需要引起注意。目前主要存在的問題是使用freq排序算法,返回的結(jié)果完全基于索引中字符的出現(xiàn)次數(shù),沒有兼顧用戶搜索詞語的頻率,因此無法將一些熱門詞排在更靠前的位置。這塊可定制SuggestWordScoreComparator來實現(xiàn),目前還沒有著手做這件事情。

6.6分組統(tǒng)計

?????? 我這里實現(xiàn)分組統(tǒng)計的方法是使用了Solr的Facet組件, Facet組件是Solr默認(rèn)集成的一個組件.

6.6.1 Facet簡介

?????? Facet是solr的高級搜索功能之一,可以給用戶提供更友好的搜索體驗.在搜索關(guān)鍵字的同時,能夠按照Facet的字段進(jìn)行分組并統(tǒng)計

6.6.2 Facet字段

1.??? 適宜被Facet的字段

?????? 一般代表了實體的某種公共屬性,如商品的分類,商品的制造廠家,書籍的出版商等等.

2.??? Facet字段的要求

?????? Facet的字段必須被索引.一般來說該字段無需分詞,無需存儲.

?????? 無需分詞是因為該字段的值代表了一個整體概念,如電腦的品牌”聯(lián)想”代表了一個整???? 體概念,如果拆成”聯(lián)”,”想”兩個字都不具有實際意義.另外該字段的值無需進(jìn)行大小?????? 寫轉(zhuǎn)換等處理,保持其原貌即可.

?????? 無需存儲是因為一般而言用戶所關(guān)心的并不是該字段的具體值,而是作為對查詢結(jié)果進(jìn)???? 行分組的一種手段,用戶一般會沿著這個分組進(jìn)一步深入搜索.

3.??? 特殊情況

?????? 對于一般查詢而言,分詞和存儲都是必要的.比如CPU類型”Intel 酷睿2雙核 P7570”, 拆分成”Intel”,”酷睿”,”P7570”這樣一些關(guān)鍵字并分別索引,可能提供更好的搜索?? 體驗.但是如果將CPU作為Facet字段,最好不進(jìn)行分詞.這樣就造成了矛盾,解決方法為, 將CPU字段設(shè)置為不分詞不存儲,然后建立另外一個字段為它的COPY,對這個COPY的?????? 字段進(jìn)行分詞和存儲.

<types>

???????? <fieldType name="string" class="solr.StrField" omitNorms="true"/>

???????? <fieldType name="tokened" class="solr.TextField" >

?????????????????? <analyzer>

?????????????????? ……

?????????????????? </analyzer>

???????? </fieldType>

</types>

<fields>

???????? <field name="cpu" type="string" indexed="true" stored="false"/>

???????? <field name="cpuCopy” type=" tokened" indexed="true" stored="true"/>

</fields>

<copyField source="cpu" dest="cpuCopy"/>

6.6.2 Facet組件

?????? Solr的默認(rèn)requestHandler已經(jīng)包含了Facet組件(solr.FacetComponent).如果自定義requestHandler或者對默認(rèn)的requestHandler自定義組件列表,那么需要將Facet加入到組件列表中去.

<requestHandler name="standard" class="solr.SearchHandler" default="true">

……

<arr name="components">

<str>自定義組件名</str>

<str>facet</str>

……

</arr>

</requestHandler>

6.6.2 Facet查詢

?????? 進(jìn)行Facet查詢需要在請求參數(shù)中加入facet=on或者facet=true只有這樣Facet組件才起作用.

1.??? Field Facet

Facet字段通過在請求中加入facet.field參數(shù)加以聲明,如果需要對多個字段進(jìn)行Facet查詢,那么將該參數(shù)聲明多次.例如:

http://localhost:8983/solr/ collection1/select?q=*%3A*&start=0&rows=1&wt=xml&indent=true&facet=true&facet.field=category_s&facet.field=modified_l

返回結(jié)果:

<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">1</int> <lst name="params"> <str name="facet">true</str> <str name="indent">true</str> <str name="start">0</str> <str name="q">*:*</str> <arr name="facet.field"> <str>category_s</str> <str>modified_l</str> </arr> <str name="wt">xml</str> <str name="rows">0</str> </lst> </lst> <result name="response" numFound="17971" start="0"> </result> <lst name="facet_counts"> <lst name="facet_queries"/> <lst name="facet_fields"> <lst name="category_s"> <int name="0">5991</int> <int name="1">5990</int> <int name="2">5990</int> </lst> <lst name="modified_l"> <int name="1162438554000">951</int> <int name="1162438556000">917</int> <int name="1162438548000">902</int> <int name="1162438546000">674</int> </lst> </lst> <lst name="facet_dates"/> <lst name="facet_ranges"/> </lst> </response>

?????? 各個Facet字段互不影響,且可以針對每個Facet字段設(shè)置查詢參數(shù).以下介紹的參數(shù)既可以應(yīng)用于所有的Facet字段,也可以應(yīng)用于每個單獨的Facet字段.應(yīng)用于單獨的字段時通過

f.字段名.參數(shù)名=參數(shù)值

這種方式調(diào)用.比如facet.prefix參數(shù)應(yīng)用于cpu字段,可以采用如下形式

f.cpu.facet.prefix=Intel

1.1? facet.prefix

?????? 表示Facet字段值的前綴.比如facet.field=cpu&facet.prefix=Intel,那么對cpu字段進(jìn)行Facet查詢,返回的cpu都是以Intel開頭的, AMD開頭的cpu型號將不會被統(tǒng)計在內(nèi).

1.2? facet.sort

?????? 表示Facet字段值以哪種順序返回.可接受的值為true(count)|false(index,lex). true(count)表示按照count值從大到小排列. false(index,lex)表示按照字段值的自然順序(字母,數(shù)字的順序)排列.默認(rèn)情況下為true(count).當(dāng)facet.limit值為負(fù)數(shù)時,默認(rèn)facet.sort= false(index,lex).

1.3? facet.limit

?????? 限制Facet字段返回的結(jié)果條數(shù).默認(rèn)值為100.如果此值為負(fù)數(shù),表示不限制.

1.4? facet.offset

?????? 返回結(jié)果集的偏移量,默認(rèn)為0.它與facet.limit配合使用可以達(dá)到分頁的效果.

1.5? facet.mincount

?????? 限制了Facet字段值的最小count,默認(rèn)為0.合理設(shè)置該參數(shù)可以將用戶的關(guān)注點集中在少數(shù)比較熱門的領(lǐng)域.

1.6? facet.missing

?????? 默認(rèn)為””,如果設(shè)置為true或者on,那么將統(tǒng)計那些該Facet字段值為null的記錄.

1.7? facet.method

?????? 取值為enum或fc,默認(rèn)為fc.該字段表示了兩種Facet的算法,與執(zhí)行效率相關(guān).

enum適用于字段值比較少的情況,比如字段類型為布爾型,或者字段表示中國的所有省份.Solr會遍歷該字段的所有取值,并從filterCache里為每個值分配一個filter(這里要求solrconfig.xml里對filterCache的設(shè)置足夠大).然后計算每個filter與主查詢的交集.

fc(表示Field Cache)適用于字段取值比較多,但在每個文檔里出現(xiàn)次數(shù)比較少的情況.Solr會遍歷所有的文檔,在每個文檔內(nèi)搜索Cache內(nèi)的值,如果找到就將Cache內(nèi)該值的count加1.

1.8? facet.enum.cache.minDf

?????? 當(dāng)facet.method=enum時,此參數(shù)其作用,minDf表示minimum document frequency.也就是文檔內(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)行Facet.不過時間字段的取值有無限性,用戶往往關(guān)心的不是某個時間點而是某個時間段內(nèi)的查詢統(tǒng)計結(jié)果. Solr為日期字段提供了更為方便的查詢統(tǒng)計方式.當(dāng)然,字段的類型必須是DateField(或其子類型).

需要注意的是,使用Date Facet時,字段名,起始時間,結(jié)束時間,時間間隔這4個參數(shù)都必須提供.與Field Facet類似,Date Facet也可以對多個字段進(jìn)行Facet.并且針對每個字段都可以單獨設(shè)置參數(shù).

facet.date:該參數(shù)表示需要進(jìn)行Date Facet的字段名,與facet.field一樣,該參數(shù)可以被設(shè)置多次,表示對多個字段進(jìn)行Date Facet.

facet.date.start:起始時間,時間的一般格式為1995-12-31T23:59:59Z,另外可以使用NOW\YEAR\ 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īng)該用%2B代替.

facet.date.hardend:取值可以為true|false,默認(rèn)為false.它表示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|between|none|all,默認(rèn)為none.before會對start之前的值做統(tǒng)計.after會對end之后的值做統(tǒng)計.between會對start至end之間所有值做統(tǒng)計.如果hardend為true的話,那么該值就是各個時間段統(tǒng)計值的和.none表示該項禁用.all表示before,after,all都會統(tǒng)計.

舉例:

&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=all

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries"/>

?????? <lst name="facet_fields"/>

?????? <lst name="facet_dates">

????????????? <int name="2009-01-01T00:00:00Z">5</int>

<int name="2009-02-01T00:00:00Z">7</int>

<int name="2009-03-01T00:00:00Z">4</int>

<int name="2009-04-01T00:00:00Z">3</int>

<int name="2009-05-01T00:00:00Z">7</int>

<int name="2009-06-01T00:00:00Z">3</int>

<int name="2009-07-01T00:00:00Z">6</int>

<int name="2009-08-01T00:00:00Z">7</int>

<int name="2009-09-01T00:00:00Z">2</int>

<int name="2009-10-01T00:00:00Z">4</int>

<int name="2009-11-01T00:00:00Z">1</int>

<int name="2009-12-01T00:00:00Z">5</int>

<str name="gap">+1MONTH</str>

<date name="end">2010-01-01T00:00:00Z</date>

<int name="before">180</int>

<int name="after">5</int>

<int name="between">54</int>

</lst>

</lst>

6.6.4 Facet Query

Facet Query利用類似于filter query的語法提供了更為靈活的Facet.通過facet.query參數(shù),可以對任意字段進(jìn)行篩選.

例1:

&facet=on

&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]

&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries">

????????????? <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>

<int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>

</lst>

?????? <lst name="facet_fields"/>

?????? <lst name="facet_dates"/>

</lst>

例2:

&facet=on

&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]

&facet.query=price:[* TO 5000]

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries">

????????????? <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>

<int name="price:[* TO 5000]">116</int>

</lst>

?????? <lst name="facet_fields"/>

?????? <lst name="facet_dates"/>

</lst>

例3:

&facet=on

&facet.query=cpu:[A TO G]

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries">

????????????? <int name="cpu:[A TO G]">11</int>

</lst>

?????? <lst name="facet_fields"/>

?????? <lst name="facet_dates"/>

</lst>

6.6.5 key操作符

可以用key操作符為Facet字段取一個別名.

例:

&facet=on

&facet.field={!key=中央處理器}cpu

&facet.field={!key=顯卡}videoCard

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries"/>

?????? <lst name="facet_fields">

????????????? <lst name="中央處理器">

???????????????????? <int name="Intel 酷睿2雙核 T6600">48</int>

???????????????????? <int name="Intel 奔騰雙核 T4300">28</int>

<int name="Intel 酷睿2雙核 P8700">18</int>

<int name="Intel 酷睿2雙核 T6570">11</int>

<int name="Intel 酷睿2雙核 T6670">11</int>

<int name="Intel 奔騰雙核 T4400">9</int>

<int name="Intel 酷睿2雙核 P7450">9</int>

<int name="Intel 酷睿2雙核 T5870">8</int>

<int name="Intel 賽揚雙核 T3000">7</int>

<int name="Intel 奔騰雙核 SU4100">6</int>

<int name="Intel 酷睿2雙核 P8400">6</int>

<int name="Intel 酷睿2雙核 SU7300">5</int>

<int name="Intel 酷睿 i3 330M">4</int>

????????????? </lst>

????????????? <lst name="顯卡">

???????????????????? <int name="ATI Mobility Radeon HD 4">63</int>

???????????????????? <int name="NVIDIA GeForce G 105M">24</int>

<int name="NVIDIA GeForce GT 240M">21</int>

<int name="NVIDIA GeForce G 103M">8</int>

<int name="NVIDIA GeForce GT 220M">8</int>

<int name="NVIDIA GeForce 9400M G">7</int>

<int name="NVIDIA GeForce G 210M">6</int>

</lst>

?????? </lst>

?????? <lst name="facet_dates"/>

</lst>

6.6.6 tag操作符和ex操作符

?????? 當(dāng)查詢使用filter query的時候,如果filter query的字段正好是Facet字段,那么查詢結(jié)果往往被限制在某一個值內(nèi).

例:

&fq=screenSize:14

&facet=on

&facet.field=screenSize

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries"/>

?????? <lst name="facet_fields">

????????????? <lst name=" screenSize">

???????????????????? <int name="14.0">107</int>

<int name="10.2">0</int>

<int name="11.1">0</int>

<int name="11.6">0</int>

<int name="12.1">0</int>

<int name="13.1">0</int>

<int name="13.3">0</int>

<int name="14.1">0</int>

<int name="15.4">0</int>

<int name="15.5">0</int>

<int name="15.6">0</int>

<int name="16.0">0</int>

<int name="17.0">0</int>

<int name="17.3">0</int>

</lst>

?????? </lst>

?????? <lst name="facet_dates"/>

</lst>

?????? 可以看到,屏幕尺寸(screenSize)為14寸的產(chǎn)品共有107件,其它尺寸的產(chǎn)品的數(shù)目都是0,這是因為在filter里已經(jīng)限制了screenSize:14.這樣,查詢結(jié)果中,除了screenSize=14的這一項之外,其它項目沒有實際的意義.有些時候,用戶希望把結(jié)果限制在某一范圍內(nèi),又希望查看該范圍外的概況.比如上述情況,既要把查詢結(jié)果限制在14寸屏的筆記本,又想查看一下其它屏幕尺寸的筆記本有多少產(chǎn)品.這個時候需要用到tag和ex操作符.tag就是把一個filter標(biāo)記起來,ex(exclude)是在Facet的時候把標(biāo)記過的filter排除在外.

例:

&fq={!tag=aa}screenSize:14

&facet=on

&facet.field={!ex=aa}screenSize

返回結(jié)果:

<lst name="facet_counts">

?????? <lst name="facet_queries"/>

?????? <lst name="facet_fields">

????????????? <lst name=" screenSize">

???????????????????? <int name="14.0">107</int>

<int name="14.1">40</int>

<int name="13.3">34</int>

<int name="15.6">22</int>

<int name="15.4">8</int>

<int name="11.6">6</int>

<int name="12.1">5</int>

<int name="16.0">5</int>

<int name="15.5">3</int>

<int name="17.0">3</int>

<int name="17.3">3</int>

<int name="10.2">1</int>

<int name="11.1">1</int>

<int name="13.1">1</int>

</lst>

?????? </lst>

?????? <lst name="facet_dates"/>

</lst>

這樣其它屏幕尺寸的統(tǒng)計信息就有意義了.

6.6.7 SolrJ對Facet的支持

//初始化查詢對象

String q = “*.*”;

SolrQuery query = new SolrQuery(q);

query.setIncludeScore(false);//是否按每組數(shù)量高低排序

query.setFacet(true);//是否分組查詢

query.setRows(0);//設(shè)置返回結(jié)果條數(shù),如果你時分組查詢,你就設(shè)置為0

query.addFacetField(“modified_l”);//增加分組字段?? q

query.addFacetQuery (“category_s[0 TO 1]”);

QueryResponse rsp = server.query(query);

//取出結(jié)果

List<FacetField.Count> list = rsp.getFacetField(“modified_l”).getValues();

Map<String, Integer> list = rsp.getFacetQuery();

6.7自動聚類

?????? Solr 使用Carrot2完成了聚類功能,能夠把檢索到的內(nèi)容自動分類, Carrot2聚類示例:

?????? 要想Solr支持聚類功能,首選要把Solr發(fā)行包的中的dist/ solr-clustering-4.2.0.jar, 復(fù)制到\solr\contrib\analysis-extras\lib下.然后打開solrconfig.xml進(jìn)行添加配置:

<searchComponent name="clustering"

?????????????????? enable="${solr.clustering.enabled:true}"

?????????????????? class="solr.clustering.ClusteringComponent" >

<lst name="engine">

<str name="name">default</str>

<str name="carrot.algorithm">org.carrot2.clustering.

lingo.LingoClusteringAlgorithm</str>

<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>

</lst>

</searchComponent>

?????? 配好了聚類組件后,下面配置requestHandler:

<requestHandler name="/clustering"? startup="lazy" enable="${solr.clustering.enabled:true}" class="solr.SearchHandler">

?? <lst name="defaults">

??? <str name="echoParams">explicit</str>

??? <bool name="clustering">true</bool>

??? <str name="clustering.engine">default</str>

??? <bool name="clustering.results">true</bool>

??? <str name="carrot.title">category_s</str>

??? <str name="carrot.snippet">content</str>? </lst>

? <arr name="last-components">??

??? <str>clustering</str>? </arr>

</requestHandler>

?????? 有兩個參數(shù)要注意carrot.title, carrot.snippet是聚類的比較計算字段,這兩個參數(shù)必須是stored="true".carrot.title的權(quán)重要高于carrot.snippet,如果只有一個做計算的字段carrot.snippet可以去掉(是去掉不是值為空).設(shè)完了用下面的URL就可以查詢了

http://localhost:8983/skyCore/clustering?q=*%3A*&wt=xml&indent=true

6.8相似匹配

  在我們使用網(wǎng)頁搜索時,會注意到每一個結(jié)果都包含一個 “相似頁面” 鏈接,單擊該鏈接,就會發(fā)布另一個搜索請求,查找出與起初結(jié)果類似的文檔。Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 實現(xiàn)了一樣的功能。如上所述,MLT 是與標(biāo)準(zhǔn) SolrRequestHandler 集成在一起的;MoreLikeThisHandler 與 MLT 結(jié)合在一起,并添加了一些其他選項,但它要求發(fā)布一個單一的請求。我將著重講述 MLT,因為使用它的可能性更大一些。幸運的是,不需要任何設(shè)置就可以查詢它,所以您現(xiàn)在就可以開始查詢。

  MLT 要求字段被儲存或使用檢索詞向量,檢索詞向量以一種以文檔為中心的方式儲存信息。MLT 通過文檔的內(nèi)容來計算文檔中關(guān)鍵詞語,然后使用原始查詢詞語和這些新詞語創(chuàng)建一個新的查詢。提交新查詢就會返回其他查詢結(jié)果。所有這些都可以用檢索詞向量來完成:只需將 termVectors="true" 添加到 schema.xml 中的 <field> 聲明。

MoreLikeThisComponent 參數(shù):

參數(shù)

 說明

  值域

mlt

在查詢時,打開/關(guān)閉 MoreLikeThisComponent 的布爾值。

true|false

mlt.count

可選。每一個結(jié)果要檢索的相似文檔數(shù)。          

> 0

mlt.fl  

用于創(chuàng)建 MLT 查詢的字段。               

任何被儲存的或含有檢索詞向量的字段。

mlt.maxqt

可選。查詢詞語的最大數(shù)量。由于長文檔可能會有很多關(guān)鍵詞語,這樣 MLT 查詢可能會很大,從而導(dǎo)致反應(yīng)緩慢或可怕的 TooManyClausesException,該參數(shù)只保留關(guān)鍵的詞語。

> 0

要想使用匹配相似首先在 solrconfig.xml 中配置 MoreLikeThisHandler

<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">??
</requestHandler>

然后我就可以請求

http://localhost:8983/skyCore/mlt?q=id%3A6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531&mlt.true&mlt.fl=content&wt=xml&indent=true

上面請求的意思查找 id 為 6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531 的 document ,然后返回與此 document 在 name 字段上相似的其他 document。需要注意的是 mlt.fl 中的 field 的 termVector=true 才有效果

<field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/>

使用SolrJ時也同樣加入?yún)?shù)就可以

SolrQuery? query = new SolrQuery();

query.set("qt", "/mlt");

query.set("mlt.fl","content");

query.set("fl", "id,");

query.set("q", "id: 6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531");

query.setStart(0);

query.setRows(5);

QueryResponse? rsp = server.query(query);

SolrDocumentList list = rsp.getResults();

6.9拼音檢索

?????? 拼音檢索中國人的專用檢索,例如:中文內(nèi)容為 中國 的輸入zhongguo、zg、zhonggu 全拼、簡拼、拼音的相鄰的一部份都應(yīng)該能檢索出 中國 來。

?????? 想要實現(xiàn)拼音檢索第一個就是拼音轉(zhuǎn)換我這里用的是pinyin4j進(jìn)行拼音轉(zhuǎn)換。第二個就是N-Gram的題目,推敲到用戶可能輸入的既不是前綴也不是后綴,所以此處選擇的是N-Gram技巧,但不同于常用的N-Gram,我應(yīng)用的從一邊開端的單向的N-Gram,Solr里的實現(xiàn)叫EdgeNGramTokenFilter,但是分的分的太細(xì)了,不需要這么復(fù)雜EdgeNGramTokenFilter,也就是說我們用的N-Gram不同于傳統(tǒng)的N-Gram。

??????? 同樣的例子使用EdgeNGramTokenFilter從前往后取2-Gram的結(jié)果是zh, 一般是取min–max之間的所有g(shù)ram,所以使用EdgeNGramTokenFilter取2-20的gram結(jié)果就是zh,zho, zhon, zhong, zhongg, zhonggu, zhongguo, 從這個例子也不難理解為什么我要選擇使用EdgeNGramTokenFilter而非一般意義上的N-Gram, 考慮到用戶可能輸入的不是前綴而是后綴,所以為了照顧這些用戶,我選擇了從前往后和從后往前使用了兩次EdgeNGramTokenFilter,這樣不只是前綴、后綴,二十任意的字串都考慮進(jìn)去了,所以大幅度的提高了搜索體驗.

?????? 現(xiàn)在思路明確了我們把它結(jié)合到Solr中,為了方便使用現(xiàn)在寫了兩個Filter進(jìn)行處理拼音分詞問題一個是拼音轉(zhuǎn)換Filter(PinyinTransformTokenFilter)一個是拼音N-Gram的Filter(PinyinNGramTokenFilter),這樣一來使用時就不用在添加索引前做攔音的轉(zhuǎn)換了。而且PinyinTransformTokenFilter還有個好處就是它只使用中文分詞器分過的詞,也就是說做轉(zhuǎn)換的詞都是有用的不重復(fù)的,不會對沒用的停詞類的做拼音轉(zhuǎn)換和重復(fù)拼音轉(zhuǎn)換,這樣大大的提高了拼音轉(zhuǎn)換速度。

?????? 想要Solr支持拼音檢索就要先把拼音分詞(PinyinAnalyzer)的jar復(fù)制到\solr\contrib\analysis-extras\lib下,然后在schema.xml中配置一個拼音字段類型:

<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">

? <analyzer type="index">

????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

????????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

???? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

????? </analyzer>

? <analyzer type="query">

????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

???????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

???? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

???????? <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

????? </analyzer>

??? </fieldType>

minTermLenght:最小中文詞長度,意思是小于這個值的中文詞不會做拼音轉(zhuǎn)換。

minGram:最小拼音切分長度。
如果想使用簡拼的話在拼音轉(zhuǎn)換Filter 使用這個參數(shù)isFirstChar="true"就可以了

?????? 在這個拼音類型中我們使用了smartcn的中言語分詞器,如果想使用其它的自己換掉就行了。現(xiàn)在我們在原來索引中加入一個拼音字段,因為只做索引,我們可以這樣配置:

<field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/>

加完后我們重新啟動Solr測試一下看看

?????? 由于上面minTermLenght和minGram設(shè)置的值,現(xiàn)在出現(xiàn)了人沒有進(jìn)行拼音轉(zhuǎn)換并且最小拼音切分是從1個開始的。

?????? 到這里我們的配置還有沒完成呢,還要加幾個copyFiled,這樣就不用單獨處理我們新加的拼音字段了。方便呀~~~

<copyField source="content" dest="pinyin"/>

<copyField source="text" dest="spell"/>

到現(xiàn)在就可以使用拼音檢索了。

拼音分詞器jar 點擊并復(fù)制就可以粘出去了.

6.10 SolrCloud

? SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在開發(fā)中的Solr4.0的核心組件之一,它的主要思想是使用Zookeeper作為集群的配置信息中心。它有幾個特色功能,集中式的配置信息、自動容錯 、近實時搜索 、查詢時自動負(fù)載均衡。

基本可以用上面這幅圖來概述,這是一個擁有4個Solr節(jié)點的集群,索引分布在兩個Shard里面,每個Shard包含兩個Solr節(jié)點,一個是Leader節(jié)點,一個是Replica節(jié)點,此外集群中有一個負(fù)責(zé)維護(hù)集群狀態(tài)信息的Overseer節(jié)點,它是一個總控制器。集群的所有狀態(tài)信息都放在Zookeeper集群中統(tǒng)一維護(hù)。從圖中還可以看到,任何一個節(jié)點都可以接收索引更新的請求,然后再將這個請求轉(zhuǎn)發(fā)到文檔所應(yīng)該屬于的那個Shard的Leader節(jié)點,Leader節(jié)點更新結(jié)束完成,最后將版本號和文檔轉(zhuǎn)發(fā)給同屬于一個Shard的replicas節(jié)點。這里就不多說SolrCloud了,等研究明白后再單寫一個文檔。

附1:schema.xml

<?xml version="1.0" encoding="UTF-8" ?>

<schema name="example" version="1.5">

? <fields>

??? <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>

??? <field name="path" type="text_ik" indexed="false" stored="true" multiValued="false"? termVector="true" />

??? <field name="content" type="text_ik" indexed="false" stored="true" multiValued="false" termVector="true"/>

??? <field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>

???????? <field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/>

???????? <field name ="py" type ="text_py" indexed ="true" stored ="false" multiValued ="false"/>

???????? <field name="spell" type="text_spell" indexed="true" stored="false" multiValued="false" termVector="true"/>

???????? <field name="_version_" type="long" indexed="true" stored="true"/>

??? <dynamicField name="*_i" type="int" indexed="true" stored="true"/>

??? <dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>

???????? <dynamicField name="*_s" type="string" indexed="true" stored="true" />

??? <dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_l" type="long" indexed="true" stored="true"/>

??? <dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_t" type="text_general" indexed="true" stored="true"/>

??? <dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_en" type="text_en" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>

??? <dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_f" type="float" indexed="true" stored="true"/>

??? <dynamicField name="*_fs" type="float" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_d" type="double" indexed="true" stored="true"/>

??? <dynamicField name="*_ds" type="double" indexed="true" stored="true" multiValued="true"/>

??? <!-- Type used to index the lat and lon components for the "location" FieldType -->

??? <dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false"/>

??? <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>

??? <dynamicField name="*_dts" type="date" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="*_p" type="location" indexed="true" stored="true"/>

??? <!-- some trie-coded dynamic fields for faster range queries -->

??? <dynamicField name="*_ti" type="tint" indexed="true" stored="true"/>

??? <dynamicField name="*_tl" type="tlong" indexed="true" stored="true"/>

??? <dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/>

??? <dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/>

??? <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/>

??? <dynamicField name="*_pi" type="pint" indexed="true" stored="true"/>

??? <dynamicField name="*_c" type="currency" indexed="true" stored="true"/>

??? <dynamicField name="ignored_*" type="ignored" multiValued="true"/>

??? <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

??? <dynamicField name="random_*" type="random"/>

? </fields>

? <uniqueKey>id</uniqueKey>

<copyField source="content" dest="spell"/>

<copyField source="content" dest="pinyin"/>

<copyField source="content" dest="py"/>

? <copyField source="path" dest="text"/>

? <copyField source="content" dest="text"/>

? <copyField source="pinyin" dest="text"/>

? <copyField source="py" dest="text"/>

<defaultSearchField>text</defaultSearchField>

? <types>

??? <fieldType name="string" class="solr.StrField" sortMissingLast="true"/>

??? <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

??? <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>

??? <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>

??? <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>

??? <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>

??? <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>

??? <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>

??? <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>

??? <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>

??? <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>

??? <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>

??? <fieldtype name="binary" class="solr.BinaryField"/>

??? <fieldType name="pint" class="solr.IntField"/>

??? <fieldType name="plong" class="solr.LongField"/>

??? <fieldType name="pfloat" class="solr.FloatField"/>

??? <fieldType name="pdouble" class="solr.DoubleField"/>

??? <fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>

??? <fieldType name="random" class="solr.RandomSortField" indexed="true"/>

??? <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.WhitespaceTokenizerFactory"/>

????? </analyzer>

??? </fieldType>

????

????????? <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

????? <analyzer type="index">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

??????? <filter class="solr.LowerCaseFilterFactory"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

??????? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

????? </analyzer>

??? </fieldType>

??????????

????????

???????? <fieldType name="text_spell" class="solr.TextField" >

????????????? <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

??? </fieldType>

????????

???????? <fieldType name="text_ik" class="solr.TextField">

?????????????????? <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

???????? </fieldType>

??? <fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">

????? <analyzer type="index">

??????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

??????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

????? </analyzer>

????? <analyzer type="query">

???????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

??????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

????? </analyzer>

??? </fieldType>

???????? <fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">

????? <analyzer type="index">

????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

????????????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

???? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

???????????????????? <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

????? </analyzer>

????? <analyzer type="query">

?????????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

???????????????????????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

??????? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

???????????????????? <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

????? </analyzer>

??? </fieldType>

????????

???????? <fieldType name="text_py" class="solr.TextField" positionIncrementGap="0">

????? <analyzer type="index">

??????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

????????????????????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

????????? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" isFirstChar="true" minTermLenght="2" />

???????????????????

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

????????????????????? <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

?????? <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" isFirstChar="true" minTermLenght="2" />

????? </analyzer>

??? </fieldType>

????????

??? <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">

????? <analyzer type="index">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- in this example, we will only use synonyms at query time

??????? <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>

??????? -->

??????? <!-- Case insensitive stop word removal.

????????? add enablePositionIncrements=true in both the index and query

????????? analyzers to leave a 'gap' for more accurate phrase queries.

??????? -->

??????? <filter class="solr.StopFilterFactory"

??????????????? ignoreCase="true"

??????????????? words="lang/stopwords_en.txt"

??????????????? enablePositionIncrements="true"

??????????? />

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.EnglishPossessiveFilterFactory"/>

??????? <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

??????? <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:

????????????? <filter class="solr.EnglishMinimalStemFilterFactory"/>

??????? -->

??????? <filter class="solr.PorterStemFilterFactory"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

??????? <filter class="solr.StopFilterFactory"

??????????????? ignoreCase="true"

??????????????? words="lang/stopwords_en.txt"

??????????????? enablePositionIncrements="true"

??????????? />

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.EnglishPossessiveFilterFactory"/>

??????? <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

??????? <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:

????????????? <filter class="solr.EnglishMinimalStemFilterFactory"/>

??????? -->

??????? <filter class="solr.PorterStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100"

?????????????? autoGeneratePhraseQueries="true">

????? <analyzer type="index">

??????? <tokenizer class="solr.WhitespaceTokenizerFactory"/>

??????? <!-- in this example, we will only use synonyms at query time

??????? <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>

??????? -->

??????? <!-- Case insensitive stop word removal.

????????? add enablePositionIncrements=true in both the index and query

????????? analyzers to leave a 'gap' for more accurate phrase queries.

??????? -->

??????? <filter class="solr.StopFilterFactory"

??????????????? ignoreCase="true"

??????????????? words="lang/stopwords_en.txt"

??????????????? enablePositionIncrements="true"

??????????? />

??????? <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1"

??????????????? catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

??????? <filter class="solr.PorterStemFilterFactory"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.WhitespaceTokenizerFactory"/>

??????? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

??????? <filter class="solr.StopFilterFactory"

??????????????? ignoreCase="true"

??????????????? words="lang/stopwords_en.txt"

??????????????? enablePositionIncrements="true"

??????????? />

??????? <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0"

??????????????? catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

??????? <filter class="solr.PorterStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100"

?????????????? autoGeneratePhraseQueries="true">

????? <analyzer>

??????? <tokenizer class="solr.WhitespaceTokenizerFactory"/>

??????? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>

??????? <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1"

??????????????? catenateNumbers="1" catenateAll="0"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

??????? <filter class="solr.EnglishMinimalStemFilterFactory"/>

??????? <!-- this filter can remove any duplicate tokens that appear at the same position - sometimes

???????????? possible with WordDelimiterFilter in conjuncton with stemming. -->

??????? <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100">

????? <analyzer type="index">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"

??????????????? maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">

????? <analyzer>

??????? <!-- KeywordTokenizer does no actual tokenizing, so the entire

???????????? input string is preserved as a single token

????????? -->

??????? <tokenizer class="solr.KeywordTokenizerFactory"/>

??????? <!-- The LowerCase TokenFilter does what you expect, which can be

???????????? when you want your sorting to be case insensitive

????????? -->

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <!-- The TrimFilter removes any leading or trailing whitespace -->

??????? <filter class="solr.TrimFilterFactory"/>

??????? <!-- The PatternReplaceFilter gives you the flexibility to use

???????????? Java Regular expression to replace any sequence of characters

???????????? matching a pattern with an arbitrary replacement string,

???????????? which may include back references to portions of the original

???????????? string matched by the pattern.

????????????

???????????? See the Java Regular Expression documentation for more

???????????? information on pattern and replacement string syntax.

????????????

???????????? http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html

????????? -->

??????? <filter class="solr.PatternReplaceFilterFactory"

??????????????? pattern="([^a-z])" replacement="" replace="all"

??????????? />

????? </analyzer>

??? </fieldType>

??? <fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>

????? </analyzer>

??? </fieldtype>

??? <fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField">

????? <analyzer>

??????? <tokenizer class="solr.WhitespaceTokenizerFactory"/>

??????? <!--

??????? The DelimitedPayloadTokenFilter can put payloads on tokens... for example,

??????? a token of "foo|1.4"? would be indexed as "foo" with a payload of 1.4f

??????? Attributes of the DelimitedPayloadTokenFilterFactory :

???????? "delimiter" - a one character delimiter. Default is | (pipe)

????????? "encoder" - how to encode the following value into a playload

???????????? float -> org.apache.lucene.analysis.payloads.FloatEncoder,

???????????? integer -> o.a.l.a.p.IntegerEncoder

???????????? identity -> o.a.l.a.p.IdentityEncoder

??????????? Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor.

???????? -->

??????? <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/>

????? </analyzer>

??? </fieldtype>

??? <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.KeywordTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="descendent_path" class="solr.TextField">

????? <analyzer type="index">

??????? <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.KeywordTokenizerFactory"/>

????? </analyzer>

??? </fieldType>

??? <fieldType name="ancestor_path" class="solr.TextField">

????? <analyzer type="index">

??????? <tokenizer class="solr.KeywordTokenizerFactory"/>

????? </analyzer>

????? <analyzer type="query">

??????? <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>

????? </analyzer>

??? </fieldType>

??? <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField"/>

??? <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>

??? <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>

??? <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"

?????????????? geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees"/>

??? <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD"

?????????????? currencyConfig="currency.xml"/>

??? <!-- some examples for different languages (generally ordered by ISO code) -->

??? <!-- Arabic -->

??? <fieldType name="text_ar" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- for any non-arabic -->

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ar.txt"

??????????????? enablePositionIncrements="true"/>

??????? <!-- normalizes ﻯ to ﻱ, etc -->

??????? <filter class="solr.ArabicNormalizationFilterFactory"/>

??????? <filter class="solr.ArabicStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Bulgarian -->

??? <fieldType name="text_bg" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_bg.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.BulgarianStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Catalan -->

??? <fieldType name="text_ca" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- removes l', etc -->

??????? <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ca.txt"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ca.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Catalan"/>

????? </analyzer>

??? </fieldType>

??? <!-- CJK bigram (see text_ja for a Japanese configuration using morphological analysis) -->

??? <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- normalize width before bigram, as e.g. half-width dakuten combine? -->

??????? <filter class="solr.CJKWidthFilterFactory"/>

??????? <!-- for any non-CJK -->

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.CJKBigramFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Czech -->

??? <fieldType name="text_cz" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_cz.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.CzechStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Danish -->

??? <fieldType name="text_da" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_da.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Danish"/>

????? </analyzer>

??? </fieldType>

??? <!-- German -->

??? <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.GermanNormalizationFilterFactory"/>

??????? <filter class="solr.GermanLightStemFilterFactory"/>

??????? <!-- less aggressive: <filter class="solr.GermanMinimalStemFilterFactory"/> -->

??????? <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="German2"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Greek -->

??? <fieldType name="text_el" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- greek specific lowercase for sigma -->

??????? <filter class="solr.GreekLowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_el.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.GreekStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Spanish -->

??? <fieldType name="text_es" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SpanishLightStemFilterFactory"/>

??????? <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Spanish"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Basque -->

??? <fieldType name="text_eu" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_eu.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Basque"/>

????? </analyzer>

??? </fieldType>

??? <!-- Persian -->

??? <fieldType name="text_fa" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <!-- for ZWNJ -->

??????? <charFilter class="solr.PersianCharFilterFactory"/>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.ArabicNormalizationFilterFactory"/>

??????? <filter class="solr.PersianNormalizationFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fa.txt"

??????????????? enablePositionIncrements="true"/>

????? </analyzer>

??? </fieldType>

??? <!-- Finnish -->

??? <fieldType name="text_fi" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fi.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Finnish"/>

??????? <!-- less aggressive: <filter class="solr.FinnishLightStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- French -->

??? <fieldType name="text_fr" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- removes l', etc -->

??????? <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_fr.txt"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fr.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.FrenchLightStemFilterFactory"/>

??????? <!-- less aggressive: <filter class="solr.FrenchMinimalStemFilterFactory"/> -->

??????? <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="French"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Irish -->

??? <fieldType name="text_ga" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- removes d', etc -->

??????? <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ga.txt"/>

??????? <!-- removes n-, etc. position increments is intentionally false! -->

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/hyphenations_ga.txt"

??????????????? enablePositionIncrements="false"/>

??????? <filter class="solr.IrishLowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ga.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Irish"/>

????? </analyzer>

??? </fieldType>

??? <!-- Galician -->

??? <fieldType name="text_gl" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_gl.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.GalicianStemFilterFactory"/>

??????? <!-- less aggressive: <filter class="solr.GalicianMinimalStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Hindi -->

??? <fieldType name="text_hi" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <!-- normalizes unicode representation -->

??????? <filter class="solr.IndicNormalizationFilterFactory"/>

??????? <!-- normalizes variation in spelling -->

??????? <filter class="solr.HindiNormalizationFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hi.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.HindiStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Hungarian -->

??? <fieldType name="text_hu" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hu.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Hungarian"/>

??????? <!-- less aggressive: <filter class="solr.HungarianLightStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Armenian -->

??? <fieldType name="text_hy" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hy.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Armenian"/>

????? </analyzer>

??? </fieldType>

??? <!-- Indonesian -->

??? <fieldType name="text_id" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_id.txt"

??????????????? enablePositionIncrements="true"/>

??????? <!-- for a less aggressive approach (only inflectional suffixes), set stemDerivational to false -->

??????? <filter class="solr.IndonesianStemFilterFactory" stemDerivational="true"/>

????? </analyzer>

??? </fieldType>

??? <!-- Italian -->

??? <fieldType name="text_it" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <!-- removes l', etc -->

??????? <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_it.txt"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_it.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.ItalianLightStemFilterFactory"/>

??????? <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Italian"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Japanese using morphological analysis (see text_cjk for a configuration using bigramming)

???????? NOTE: If you want to optimize search for precision, use default operator AND in your query

???????? parser config with <solrQueryParser defaultOperator="AND"/> further down in this file.? Use

???????? OR if you would like to optimize for recall (default).

??? -->

??? <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">

????? <analyzer>

??????? <!-- Kuromoji Japanese morphological analyzer/tokenizer (JapaneseTokenizer)

???????????? Kuromoji has a search mode (default) that does segmentation useful for search.? A heuristic

???????????? is used to segment compounds into its parts and the compound itself is kept as synonym.

???????????? Valid values for attribute mode are:

??????????????? normal: regular segmentation

??????????????? search: segmentation useful for search with synonyms compounds (default)

????????????? extended: same as search mode, but unigrams unknown words (experimental)

???????????? For some applications it might be good to use search mode for indexing and normal mode for

???????????? queries to reduce recall and prevent parts of compounds from being matched and highlighted.

???????????? Use <analyzer type="index"> and <analyzer type="query"> for this and mode normal in query.

???????????? Kuromoji also has a convenient user dictionary feature that allows overriding the statistical

???????????? model with your own entries for segmentation, part-of-speech tags and readings without a need

???????????? to specify weights.? Notice that user dictionaries have not been subject to extensive testing.

???????????? User dictionary attributes are:

?????????????????????? userDictionary: user dictionary filename

?????????????? userDictionaryEncoding: user dictionary encoding (default is UTF-8)

???????????? See lang/userdict_ja.txt for a sample user dictionary file.

???????????? Punctuation characters are discarded by default.? Use discardPunctuation="false" to keep them.

???????????? See http://wiki.apache.org/solr/JapaneseLanguageSupport for more on Japanese language support.

????????? -->

??????? <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>

??????? <!--<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>-->

??????? <!-- Reduces inflected verbs and adjectives to their base/dictionary forms (辭書形) -->

??????? <filter class="solr.JapaneseBaseFormFilterFactory"/>

??????? <!-- Removes tokens with certain part-of-speech tags -->

??????? <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"

??????????????? enablePositionIncrements="true"/>

??????? <!-- Normalizes full-width romaji to half-width and half-width kana to full-width (Unicode NFKC subset) -->

??????? <filter class="solr.CJKWidthFilterFactory"/>

??????? <!-- Removes common tokens typically not useful for search, but have a negative effect on ranking -->

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt"

??????????????? enablePositionIncrements="true"/>

??????? <!-- Normalizes common katakana spelling variations by removing any last long sound character (U+30FC) -->

??????? <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>

??????? <!-- Lower-cases romaji characters -->

??????? <filter class="solr.LowerCaseFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Latvian -->

??? <fieldType name="text_lv" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_lv.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.LatvianStemFilterFactory"/>

????? </analyzer>

??? </fieldType>

??? <!-- Dutch -->

??? <fieldType name="text_nl" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_nl.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.StemmerOverrideFilterFactory" dictionary="lang/stemdict_nl.txt" ignoreCase="false"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Dutch"/>

????? </analyzer>

??? </fieldType>

??? <!-- Norwegian -->

??? <fieldType name="text_no" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_no.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Norwegian"/>

??????? <!-- less aggressive: <filter class="solr.NorwegianLightStemFilterFactory"/> -->

??????? <!-- singular/plural: <filter class="solr.NorwegianMinimalStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Portuguese -->

??? <fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.PortugueseLightStemFilterFactory"/>

??????? <!-- less aggressive: <filter class="solr.PortugueseMinimalStemFilterFactory"/> -->

??????? <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/> -->

??????? <!-- most aggressive: <filter class="solr.PortugueseStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Romanian -->

??? <fieldType name="text_ro" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ro.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Romanian"/>

????? </analyzer>

??? </fieldType>

??? <!-- Russian -->

??? <fieldType name="text_ru" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Russian"/>

??????? <!-- less aggressive: <filter class="solr.RussianLightStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Swedish -->

??? <fieldType name="text_sv" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_sv.txt" format="snowball"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Swedish"/>

??????? <!-- less aggressive: <filter class="solr.SwedishLightStemFilterFactory"/> -->

????? </analyzer>

??? </fieldType>

??? <!-- Thai -->

??? <fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.LowerCaseFilterFactory"/>

??????? <filter class="solr.ThaiWordFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt"

??????????????? enablePositionIncrements="true"/>

????? </analyzer>

??? </fieldType>

??? <!-- Turkish -->

??? <fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">

????? <analyzer>

??????? <tokenizer class="solr.StandardTokenizerFactory"/>

??????? <filter class="solr.TurkishLowerCaseFilterFactory"/>

??????? <filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_tr.txt"

??????????????? enablePositionIncrements="true"/>

??????? <filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>

????? </analyzer>

??? </fieldType>

? </types>

</schema>

附2:solrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<config>

? <luceneMatchVersion>LUCENE_42</luceneMatchVersion>

???????? <lib dir="../../../lib" regex=".*\.jar" />

? <lib dir="../../../contrib/extraction/lib" regex=".*\.jar" />

? <lib dir="../../../dist/" regex="solr-cell-\d.*\.jar" />

? <lib dir="../../../contrib/clustering/lib/" regex=".*\.jar" />

? <lib dir="../../../dist/" regex="solr-clustering-\d.*\.jar" />

? <lib dir="../../../contrib/langid/lib/" regex=".*\.jar" />

? <lib dir="../../../dist/" regex="solr-langid-\d.*\.jar" />

? <lib dir="../../../contrib/velocity/lib" regex=".*\.jar" />

? <lib dir="../../../dist/" regex="solr-velocity-\d.*\.jar" />

? <lib dir="/total/crap/dir/ignored" />

? <dataDir>${solr.data.dir:}</dataDir>

? <directoryFactory name="DirectoryFactory"

??????????????????? class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

? <codecFactory class="solr.SchemaCodecFactory"/>

? <indexConfig>

??? <!-- maxFieldLength was removed in 4.0. To get similar behavior, include a

???????? LimitTokenCountFilterFactory in your fieldType definition. E.g.

???? <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>

??? -->

??? <!-- Maximum time to wait for a write lock (ms) for an IndexWriter. Default: 1000 -->

??? <!-- <writeLockTimeout>1000</writeLockTimeout>? -->

??? <!-- The maximum number of simultaneous threads that may be

???????? indexing documents at once in IndexWriter; if more than this

???????? many threads arrive they will wait for others to finish.

???????? Default in Solr/Lucene is 8. -->

??? <!-- <maxIndexingThreads>8</maxIndexingThreads>? -->

??? <!-- Expert: Enabling compound file will use less files for the index,

???????? using fewer file descriptors on the expense of performance decrease.

???????? Default in Lucene is "true". Default in Solr is "false" (since 3.6) -->

??? <!-- <useCompoundFile>false</useCompoundFile> -->

??? <!-- ramBufferSizeMB sets the amount of RAM that may be used by Lucene

???????? indexing for buffering added documents and deletions before they are

???????? flushed to the Directory.

???????? maxBufferedDocs sets a limit on the number of documents buffered

???????? before flushing.

???????? If both ramBufferSizeMB and maxBufferedDocs is set, then

???????? Lucene will flush based on whichever limit is hit first.? -->

?? <ramBufferSizeMB>100</ramBufferSizeMB>

??? <maxBufferedDocs>1000</maxBufferedDocs>

??? <!-- Expert: Merge Policy

???????? The Merge Policy in Lucene controls how merging of segments is done.

???????? The default since Solr/Lucene 3.3 is TieredMergePolicy.

???????? The default since Lucene 2.3 was the LogByteSizeMergePolicy,

???????? Even older versions of Lucene used LogDocMergePolicy.

???????

????

??????? <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">

????????? <int name="maxMergeAtOnce">100</int>

????????? <int name="segmentsPerTier">100</int>

??????? </mergePolicy>

????? -->

????

??? <!-- Merge Factor

???????? The merge factor controls how many segments will get merged at a time.

???????? For TieredMergePolicy, mergeFactor is a convenience parameter which

???????? will set both MaxMergeAtOnce and SegmentsPerTier at once.

???????? For LogByteSizeMergePolicy, mergeFactor decides how many new segments

???????? will be allowed before they are merged into one.

???????? Default is 10 for both merge policies.

???? -->

??? <mergeFactor>50</mergeFactor>

?

??? <!-- Expert: Merge Scheduler

???????? The Merge Scheduler in Lucene controls how merges are

???????? performed.? The ConcurrentMergeScheduler (Lucene 2.3 default)

???????? can perform merges in the background using separate threads.

???????? The SerialMergeScheduler (Lucene 2.2 default) does not.

???? -->

??? <!--

?????? <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>

?????? -->

??? <!-- LockFactory

???????? This option specifies which Lucene LockFactory implementation

???????? to use.

?????

???????? single = SingleInstanceLockFactory - suggested for a

????????????????? read-only index or when there is no possibility of

????????????????? another process trying to modify the index.

???????? native = NativeFSLockFactory - uses OS native file locking.

????????????????? Do not use when multiple solr webapps in the same

????????????????? JVM are attempting to share a single index.

???????? simple = SimpleFSLockFactory? - uses a plain file for locking

???????? Defaults: 'native' is default for Solr3.6 and later, otherwise

?????????????????? 'simple' is the default

???????? More details on the nuances of each LockFactory...

???????? http://wiki.apache.org/lucene-java/AvailableLockFactories

??? -->

??? <lockType>${solr.lock.type:native}</lockType>

??? <!-- Unlock On Startup

???????? If true, unlock any held write or commit locks on startup.

???????? This defeats the locking mechanism that allows multiple

???????? processes to safely access a lucene index, and should be used

???????? with care. Default is "false".

???????? This is not needed if lock type is 'single'

???? -->

??? <!--

??? <unlockOnStartup>false</unlockOnStartup>

????? -->

???

??? <!-- Expert: Controls how often Lucene loads terms into memory

???????? Default is 128 and is likely good for most everyone.

????? -->

??? <!-- <termIndexInterval>128</termIndexInterval> -->

??? <!-- If true, IndexReaders will be reopened (often more efficient)

???????? instead of closed and then opened. Default: true

????? -->

??? <!--

??? <reopenReaders>true</reopenReaders>

????? -->

??? <!-- Commit Deletion Policy

???????? Custom deletion policies can be specified here. The class must

???????? implement org.apache.lucene.index.IndexDeletionPolicy.

???????? The default Solr IndexDeletionPolicy implementation supports

???????? deleting index commit points on number of commits, age of

???????? commit point and optimized status.

????????

???????? The latest commit point should always be preserved regardless

???????? of the criteria.

??? -->

??? <!--

??? <deletionPolicy class="solr.SolrDeletionPolicy">

??? -->

????? <!-- The number of commit points to be kept -->

????? <!-- <str name="maxCommitsToKeep">1</str> -->

????? <!-- The number of optimized commit points to be kept -->

????? <!-- <str name="maxOptimizedCommitsToKeep">0</str> -->

????? <!--

????????? Delete all commit points once they have reached the given age.

????????? Supports DateMathParser syntax e.g.

??????? -->

????? <!--

???????? <str name="maxCommitAge">30MINUTES</str>

???????? <str name="maxCommitAge">1DAY</str>

????? -->

??? <!--

??? </deletionPolicy>

??? -->

??? <!-- Lucene Infostream

??????

???????? To aid in advanced debugging, Lucene provides an "InfoStream"

???????? of detailed information when indexing.

???????? Setting The value to true will instruct the underlying Lucene

???????? IndexWriter to write its debugging info the specified file

????? -->

???? <!-- <infoStream file="INFOSTREAM.txt">false</infoStream> -->

? </indexConfig>

? <jmx />

? <updateHandler class="solr.DirectUpdateHandler2">

??? <updateLog>

????? <str name="dir">${solr.ulog.dir:}</str>

??? </updateLog>

??

???? <autoCommit>

????????? <maxDocs>1000</maxDocs>

?????? <maxTime>15000</maxTime>

?????? <openSearcher>false</openSearcher>

???? </autoCommit>

???

? </updateHandler>

?

?

? <query>

??? <!-- Max Boolean Clauses

???????? Maximum number of clauses in each BooleanQuery,? an exception

???????? is thrown if exceeded.

???????? ** WARNING **

????????

???????? This option actually modifies a global Lucene property that

???????? will affect all SolrCores.? If multiple solrconfig.xml files

???????? disagree on this property, the value at any given moment will

???????? be based on the last SolrCore to be initialized.

????????

????? -->

??? <maxBooleanClauses>1024</maxBooleanClauses>

??? <!-- Solr Internal Query Caches

???????? There are two implementations of cache available for Solr,

???????? LRUCache, based on a synchronized LinkedHashMap, and

???????? FastLRUCache, based on a ConcurrentHashMap.?

???????? FastLRUCache has faster gets and slower puts in single

???????? threaded operation and thus is generally faster than LRUCache

???????? when the hit ratio of the cache is high (> 75%), and may be

???????? faster under other scenarios on multi-cpu systems.

??? -->

??? <!-- Filter Cache

???????? Cache used by SolrIndexSearcher for filters (DocSets),

???????? unordered sets of *all* documents that match a query.? When a

???????? new searcher is opened, its caches may be prepopulated or

???????? "autowarmed" using data from caches in the old searcher.

???????? autowarmCount is the number of items to prepopulate.? For

???????? LRUCache, the autowarmed items will be the most recently

???????? accessed items.

???????? Parameters:

?????????? class - the SolrCache implementation LRUCache or

?????????????? (LRUCache or FastLRUCache)

?????????? size - the maximum number of entries in the cache

?????????? initialSize - the initial capacity (number of entries) of

?????????????? the cache.? (see java.util.HashMap)

?????????? autowarmCount - the number of entries to prepopulate from

?????????????? and old cache.?

????? -->

??? <filterCache class="solr.FastLRUCache"

???????????????? size="512"

???????????????? initialSize="512"

???????????????? autowarmCount="0"/>

??? <!-- Query Result Cache

????????

???????? Caches results of searches - ordered lists of document ids

???????? (DocList) based on a query, a sort, and the range of documents requested.?

????? -->

??? <queryResultCache class="solr.LRUCache"

???????????????????? size="512"

???????????????????? initialSize="512"

???????????????????? autowarmCount="0"/>

??

??? <!-- Document Cache

???????? Caches Lucene Document objects (the stored fields for each

???????? document).? Since Lucene internal document ids are transient,

???????? this cache will not be autowarmed.?

????? -->

??? <documentCache class="solr.LRUCache"

?????????????????? size="512"

?????????????????? initialSize="512"

?????????????????? autowarmCount="0"/>

???

??? <!-- Field Value Cache

????????

???????? Cache used to hold field values that are quickly accessible

???????? by document id.? The fieldValueCache is created by default

???????? even if not configured here.

????? -->

??? <!--

?????? <fieldValueCache class="solr.FastLRUCache"

??????????????????????? size="512"

??????????????????????? autowarmCount="128"

??????????????????????? showItems="32" />

????? -->

??? <!-- Custom Cache

???????? Example of a generic cache.? These caches may be accessed by

???????? name through SolrIndexSearcher.getCache(),cacheLookup(), and

???????? cacheInsert().? The purpose is to enable easy caching of

???????? user/application level data.? The regenerator argument should

???????? be specified as an implementation of solr.CacheRegenerator

???????? if autowarming is desired.?

????? -->

??? <!--

?????? <cache name="myUserCache"

????????????? class="solr.LRUCache"

????????????? size="4096"

????????????? initialSize="1024"

????????????? autowarmCount="1024"

????????????? regenerator="com.mycompany.MyRegenerator"

????????????? />

????? -->

??? <!-- Lazy Field Loading

???????? If true, stored fields that are not requested will be loaded

???????? lazily.? This can result in a significant speed improvement

???????? if the usual case is to not load all stored fields,

???????? especially if the skipped fields are large compressed text

???????? fields.

??? -->

??? <enableLazyFieldLoading>true</enableLazyFieldLoading>

?? <!-- Use Filter For Sorted Query

??????? A possible optimization that attempts to use a filter to

??????? satisfy a search.? If the requested sort does not include

??????? score, then the filterCache will be checked for a filter

??????? matching the query. If found, the filter will be used as the

??????? source of document ids, and then the sort will be applied to

??????? that.

??????? For most situations, this will not be useful unless you

??????? frequently get the same search repeatedly with different sort

??????? options, and none of them ever use "score"

???? -->

?? <!--

????? <useFilterForSortedQuery>true</useFilterForSortedQuery>

???? -->

?? <!-- Result Window Size

??????? An optimization for use with the queryResultCache.? When a search

??????? is requested, a superset of the requested number of document ids

??????? are collected.? For example, if a search for a particular query

??????? requests matching documents 10 through 19, and queryWindowSize is 50,

??????? then documents 0 through 49 will be collected and cached.? Any further

??????? requests in that range can be satisfied via the cache.?

???? -->

?? <queryResultWindowSize>20</queryResultWindowSize>

?? <!-- Maximum number of documents to cache for any entry in the

??????? queryResultCache.

???? -->

?? <queryResultMaxDocsCached>200</queryResultMaxDocsCached>

?? <!-- Query Related Event Listeners

??????? Various IndexSearcher related events can trigger Listeners to

??????? take actions.

??????? newSearcher - fired whenever a new searcher is being prepared

??????? and there is a current searcher handling requests (aka

??????? registered).? It can be used to prime certain caches to

??????? prevent long request times for certain requests.

??????? firstSearcher - fired whenever a new searcher is being

??????? prepared but there is no current registered searcher to handle

??????? requests or to gain autowarming data from.

???????

???? -->

??? <!-- QuerySenderListener takes an array of NamedList and executes a

???????? local query request for each NamedList in sequence.

????? -->

??? <listener event="newSearcher" class="solr.QuerySenderListener">

????? <arr name="queries">

??????? <!--

?????????? <lst><str name="q">solr</str><str name="sort">price asc</str></lst>

?????????? <lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>

????????? -->

????? </arr>

??? </listener>

??? <listener event="firstSearcher" class="solr.QuerySenderListener">

????? <arr name="queries">

??????? <lst>

????????? <str name="q">static firstSearcher warming in solrconfig.xml</str>

??????? </lst>

????? </arr>

??? </listener>

??? <!-- Use Cold Searcher

???????? If a search request comes in and there is no current

???????? registered searcher, then immediately register the still

???????? warming searcher and use it.? If "false" then all requests

???????? will block until the first searcher is done warming.

????? -->

??? <useColdSearcher>false</useColdSearcher>

??? <!-- Max Warming Searchers

????????

???????? Maximum number of searchers that may be warming in the

???????? background concurrently.? An error is returned if this limit

???????? is exceeded.

???????? Recommend values of 1-2 for read-only slaves, higher for

???????? masters w/o cache warming.

????? -->

??? <maxWarmingSearchers>2</maxWarmingSearchers>

? </query>

? <requestDispatcher handleSelect="false" >

??

??? <requestParsers enableRemoteStreaming="true"

??????????????????? multipartUploadLimitInKB="2048000"

??????????????????? formdataUploadLimitInKB="2048"/>

??? <httpCaching never304="true" />

??

? </requestDispatcher>

? <requestHandler name="/select" class="solr.SearchHandler">

????? <lst name="defaults">

?????? <str name="echoParams">explicit</str>

?????? <int name="rows">10</int>

?????? <str name="df">text</str>

???? </lst>

?

??? </requestHandler>

? <requestHandler name="/query" class="solr.SearchHandler">

???? <lst name="defaults">

?????? <str name="echoParams">explicit</str>

?????? <str name="wt">json</str>

?????? <str name="indent">true</str>

?????? <str name="df">text</str>

???? </lst>

? </requestHandler>

? <requestHandler name="/get" class="solr.RealTimeGetHandler">

???? <lst name="defaults">

?????? <str name="omitHeader">true</str>

?????? <str name="wt">json</str>

?????? <str name="indent">true</str>

???? </lst>

? </requestHandler>

? <requestHandler name="/browse" class="solr.SearchHandler">

???? <lst name="defaults">

?????? <str name="echoParams">explicit</str>

?????? <!-- VelocityResponseWriter settings -->

?????? <str name="wt">velocity</str>

?????? <str name="v.template">browse</str>

?????? <str name="v.layout">layout</str>

?????? <str name="title">Solritas</str>

?????? <!-- Query settings -->

?????? <str name="defType">edismax</str>

?????? <str name="qf">

????????? text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4

????????? title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0

?????? </str>

?????? <str name="df">text</str>

?????? <str name="mm">100%</str>

?????? <str name="q.alt">*:*</str>

?????? <str name="rows">10</str>

?????? <str name="fl">*,score</str>

?????? <str name="mlt.qf">

???????? text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4

???????? title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0

?????? </str>

?????? <str name="mlt.fl">text,features,name,sku,id,manu,cat,title,description,keywords,author,resourcename</str>

?????? <int name="mlt.count">3</int>

?????? <!-- Faceting defaults -->

?????? <str name="facet">on</str>

?????? <str name="facet.field">cat</str>

?????? <str name="facet.field">manu_exact</str>

?????? <str name="facet.field">content_type</str>

?????? <str name="facet.field">author_s</str>

?????? <str name="facet.query">ipod</str>

?????? <str name="facet.query">GB</str>

?????? <str name="facet.mincount">1</str>

?????? <str name="facet.pivot">cat,inStock</str>

?????? <str name="facet.range.other">after</str>

?????? <str name="facet.range">price</str>

?????? <int name="f.price.facet.range.start">0</int>

?????? <int name="f.price.facet.range.end">600</int>

?????? <int name="f.price.facet.range.gap">50</int>

?????? <str name="facet.range">popularity</str>

?????? <int name="f.popularity.facet.range.start">0</int>

?????? <int name="f.popularity.facet.range.end">10</int>

?????? <int name="f.popularity.facet.range.gap">3</int>

?????? <str name="facet.range">manufacturedate_dt</str>

?????? <str name="f.manufacturedate_dt.facet.range.start">NOW/YEAR-10YEARS</str>

?????? <str name="f.manufacturedate_dt.facet.range.end">NOW</str>

?????? <str name="f.manufacturedate_dt.facet.range.gap">+1YEAR</str>

?????? <str name="f.manufacturedate_dt.facet.range.other">before</str>

?????? <str name="f.manufacturedate_dt.facet.range.other">after</str>

?????? <!-- Highlighting defaults -->

?????? <str name="hl">on</str>

?????? <str name="hl.fl">content features title name</str>

?????? <str name="hl.encoder">html</str>

?????? <str name="hl.simple.pre">&lt;b&gt;</str>

?????? <str name="hl.simple.post">&lt;/b&gt;</str>

?????? <str name="f.title.hl.fragsize">0</str>

?????? <str name="f.title.hl.alternateField">title</str>

?????? <str name="f.name.hl.fragsize">0</str>

?????? <str name="f.name.hl.alternateField">name</str>

?????? <str name="f.content.hl.snippets">3</str>

?????? <str name="f.content.hl.fragsize">200</str>

?????? <str name="f.content.hl.alternateField">content</str>

?????? <str name="f.content.hl.maxAlternateFieldLength">750</str>

?????? <!-- Spell checking defaults -->

?????? <str name="spellcheck">on</str>

?????? <str name="spellcheck.extendedResults">false</str>??????

?????? <str name="spellcheck.count">5</str>

?????? <str name="spellcheck.alternativeTermCount">2</str>

?????? <str name="spellcheck.maxResultsForSuggest">5</str>??????

?????? <str name="spellcheck.collate">true</str>

?????? <str name="spellcheck.collateExtendedResults">true</str>?

?????? <str name="spellcheck.maxCollationTries">5</str>

?????? <str name="spellcheck.maxCollations">3</str>??????????

???? </lst>

???? <!-- append spellchecking to our list of components -->

???? <arr name="last-components">

?????? <str>spellcheck</str>

???? </arr>

? </requestHandler>

? <requestHandler name="/update" class="solr.UpdateRequestHandler">

? </requestHandler>

<requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler">

??????? <lst name="defaults">

???????? <str name="stream.contentType">application/json</str>

?????? </lst>

? </requestHandler>

? <requestHandler name="/update/csv" class="solr.CSVRequestHandler">

??????? <lst name="defaults">

???????? <str name="stream.contentType">application/csv</str>

?????? </lst>

? </requestHandler>

? <requestHandler name="/update/extract"

????????????????? startup="lazy"

????????????????? class="solr.extraction.ExtractingRequestHandler" >

??? <lst name="defaults">

????? <str name="lowernames">true</str>

????? <str name="uprefix">ignored_</str>

????? <!-- capture link hrefs but ignore div attributes -->

????? <str name="captureAttr">true</str>

????? <str name="fmap.a">links</str>

????? <str name="fmap.div">ignored_</str>

??? </lst>

? </requestHandler>

? <requestHandler name="/analysis/field"

????????????????? startup="lazy"

????????????????? class="solr.FieldAnalysisRequestHandler" />

? <requestHandler name="/analysis/document"

????????????????? class="solr.DocumentAnalysisRequestHandler"

????????????????? startup="lazy" />

? <requestHandler name="/admin/"

????????????????? class="solr.admin.AdminHandlers" />

? <requestHandler name="/admin/ping" class="solr.PingRequestHandler">

??? <lst name="invariants">

????? <str name="q">solrpingquery</str>

??? </lst>

??? <lst name="defaults">

????? <str name="echoParams">all</str>

??? </lst>

? </requestHandler>

? <!-- Echo the request contents back to the client -->

? <requestHandler name="/debug/dump" class="solr.DumpRequestHandler" >

??? <lst name="defaults">

???? <str name="echoParams">explicit</str>

???? <str name="echoHandler">true</str>

??? </lst>

? </requestHandler>

? <requestHandler name="/replication" class="solr.ReplicationHandler" >

? </requestHandler>

<!-- spell -->

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">

???? <lst name="spellchecker">

?????? <str name="name">direct</str>

?????? <str name="field">spell</str>

?????? <str name="classname">solr.DirectSolrSpellChecker</str>

?????? <str name="distanceMeasure">internal</str>

?????? <float name="accuracy">0.5</float>

?????? <int name="maxEdits">2</int>

?????? <int name="minPrefix">1</int>

?????? <int name="maxInspections">5</int>

?????? <int name="minQueryLength">2</int>

?????? <float name="maxQueryFrequency">0.001</float>

???????????? <str name="buildOnCommit">true</str>

??? </lst>

????

????????? <lst name="spellchecker">

????? <!--

?????????? Optional, it is required when more than one spellchecker is configured.

?????????? Select non-default name with spellcheck.dictionary in request handler.

name是可選的,如果只有一個spellchecker可以不寫name

如果有多個spellchecker,需要在Request Handler中指定spellcheck.dictionary

????? -->

????? <str name="name">default</str>

????? <!-- The classname is optional, defaults to IndexBasedSpellChecker -->

????? <str name="classname">solr.IndexBasedSpellChecker</str>

????? <!--

?????????????? Load tokens from the following field for spell checking,

?????????????? analyzer for the field's type as defined in schema.xml are used

下面這個field名字指的是拼寫檢查的依據(jù),也就是說要根據(jù)哪個Field來檢查用戶輸入。

????? -->

????? <str name="field">spell</str>

????? <!-- Optional, by default use in-memory index (RAMDirectory)

SpellCheck索引文件的存放位置,是可選的,如果不寫默認(rèn)使用內(nèi)存模式RAMDirectory。

./spellchecker1指的是:corex\data\spellchecker1

-->

????? <str name="spellcheckIndexDir">./spellchecker1</str>

????? <!-- Set the accuracy (float) to be used for the suggestions. Default is 0.5 -->

????? <str name="accuracy">0.7</str>

<!--何時創(chuàng)建拼寫索引:buildOnCommit/buildOnOptimize -->

????????? <str name="buildOnCommit">true</str>

??? </lst>

<!-- 另一個拼寫檢查器,使用JaroWinklerDistance距離算法 -->

???????? <lst name="spellchecker">

?????? <str name="name">jarowinkler</str>

?????? <str name="classname">solr.IndexBasedSpellChecker</str>

?????? <str name="field">spell</str>

?????? <str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>

?????? <str name="spellcheckIndexDir">./spellchecker2</str>

?????? <str name="buildOnCommit">true</str>

??? </lst>

<!-- 另一個拼寫檢查器,使用文件內(nèi)容為檢查依據(jù)

???? <lst name="spellchecker">

?????? <str name="classname">solr.FileBasedSpellChecker</str>

?????? <str name="name">file</str>

?????? <str name="sourceLocation">spellings.txt</str>

?????? <str name="characterEncoding">UTF-8</str>

?????? <str name="spellcheckIndexDir">./spellcheckerFile</str>

?????? <str name="buildOnCommit">true</str>

???? </lst>-->

<str name="queryAnalyzerFieldType">text_spell</str>

</searchComponent>

<queryConverter name="queryConverter" class="solr.SpellingQueryConverter"/>

<requestHandler name="/spell" class="solr.SearchHandler">

? <lst name="defaults">

??? <str name="spellcheck.dictionary">default</str>

???????? <str name="spellcheck.collate">true</str>

??? <str name="spellcheck.onlyMorePopular">true</str>

??? <str name="spellcheck.extendedResults">false</str>

??? <str name="spellcheck.count">10</str>

? </lst>

? <arr name="last-components">

??? <str>spellcheck</str>

? </arr>

</requestHandler>

<searchComponent? name="suggest" class="solr.SpellCheckComponent">

??? <str name="queryAnalyzerFieldType">string</str>

??? <lst name="spellchecker">

??????? <str name="name">suggest</str>

??????? <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>

??????? <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>

??????? <str name="field">text</str>

??????? <float name="threshold">0.0001</float>

??????? <str name="comparatorClass">freq</str>

??????? <str name="buildOnOptimize">true</str>

??????? <!--<str name="buildOnCommit">true</str>-->

??? </lst>

</searchComponent>

????????

<requestHandler? name="/suggest" class="solr.SearchHandler" startup="lazy">

??? <lst name="defaults">

??????? <str name="spellcheck">true</str>

??????? <str name="spellcheck.dictionary">suggest</str>

??????? <str name="spellcheck.onlyMorePopular">true</str>

?????????????????? <str name="spellcheck.extendedResults">false</str>

??????? <str name="spellcheck.count">10</str>

??????? <!--<str name="spellcheck.collate">true</str>-->

??? </lst>

??? <arr name="components">

??????????? <str>suggest</str>

??? </arr>

</requestHandler>

?

??

<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">

</requestHandler>

? <searchComponent name="tvComponent" class="solr.TermVectorComponent"/>

? <requestHandler name="/tvrh" class="solr.SearchHandler" startup="lazy">

??? <lst name="defaults">

????? <str name="df">text</str>

????? <bool name="tv">true</bool>

??? </lst>

??? <arr name="last-components">

????? <str>tvComponent</str>

??? </arr>

? </requestHandler>

?

? <searchComponent name="clustering"

?????????????????? enable="${solr.clustering.enabled:true}"

?????????????????? class="solr.clustering.ClusteringComponent" >

??? <!-- Declare an engine -->

??? <lst name="engine">

??? <str name="name">default</str>

??? <str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>

??? <!-- Engine-specific parameters -->

??? <str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>

?? </lst>

? </searchComponent>

? <requestHandler name="/clustering"

????????????????? startup="lazy"

????????????????? enable="${solr.clustering.enabled:true}"

????????????????? class="solr.SearchHandler">

?? <lst name="defaults">

??? <str name="echoParams">explicit</str>

??? <bool name="clustering">true</bool>

??? <str name="clustering.engine">default</str>

??? <bool name="clustering.results">true</bool>

??? <str name="carrot.title">category_s</str>

??????????? <str name="carrot.snippet">content</str>

???????? <str name="carrot.produceSummary">true</str>

? </lst>

? <arr name="last-components">

??? <str>clustering</str>

? </arr>

? </requestHandler>

? <searchComponent name="terms" class="solr.TermsComponent"/>

? <!-- A request handler for demonstrating the terms component -->

? <requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">

???? <lst name="defaults">

????? <bool name="terms">true</bool>

????? <bool name="distrib">false</bool>

??? </lst>????

??? <arr name="components">

????? <str>terms</str>

??? </arr>

? </requestHandler>

? <searchComponent name="elevator" class="solr.QueryElevationComponent" >

??? <!-- pick a fieldType to analyze queries -->

??? <str name="queryFieldType">string</str>

??? <str name="config-file">elevate.xml</str>

? </searchComponent>

? <!-- A request handler for demonstrating the elevator component -->

? <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">

??? <lst name="defaults">

????? <str name="echoParams">explicit</str>

????? <str name="df">text</str>

??? </lst>

??? <arr name="last-components">

????? <str>elevator</str>

??? </arr>

? </requestHandler>

?

? <searchComponent class="solr.HighlightComponent" name="highlight">

??? <highlighting>

????? <!-- Configure the standard fragmenter -->

????? <!-- This could most likely be commented out in the "default" case -->

????? <fragmenter name="gap"

????????????????? default="true"

????????????????? class="solr.highlight.GapFragmenter">

??????? <lst name="defaults">

????????? <int name="hl.fragsize">100</int>

??????? </lst>

????? </fragmenter>

????? <!-- A regular-expression-based fragmenter

?????????? (for sentence extraction)

??????? -->

????? <fragmenter name="regex"

????????????????? class="solr.highlight.RegexFragmenter">

??????? <lst name="defaults">

????????? <!-- slightly smaller fragsizes work better because of slop -->

????????? <int name="hl.fragsize">70</int>

????????? <!-- allow 50% slop on fragment sizes -->

????????? <float name="hl.regex.slop">0.5</float>

????????? <!-- a basic sentence pattern -->

????????? <str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str>

??????? </lst>

????? </fragmenter>

????? <!-- Configure the standard formatter -->

????? <formatter name="html"

???????????????? default="true"

???????????????? class="solr.highlight.HtmlFormatter">

??????? <lst name="defaults">

????????? <str name="hl.simple.pre"><![CDATA[<em>]]></str>

????????? <str name="hl.simple.post"><![CDATA[</em>]]></str>

??????? </lst>

????? </formatter>

????? <!-- Configure the standard encoder -->

????? <encoder name="html"

?????????????? class="solr.highlight.HtmlEncoder" />

????? <!-- Configure the standard fragListBuilder -->

????? <fragListBuilder name="simple"

?????????????????????? class="solr.highlight.SimpleFragListBuilder"/>

?????

????? <!-- Configure the single fragListBuilder -->

????? <fragListBuilder name="single"

?????????????????????? class="solr.highlight.SingleFragListBuilder"/>

?????

????? <!-- Configure the weighted fragListBuilder -->

????? <fragListBuilder name="weighted"

?????????????????????? default="true"

?????????????????????? class="solr.highlight.WeightedFragListBuilder"/>

?????

????? <!-- default tag FragmentsBuilder -->

????? <fragmentsBuilder name="default"

??????????????????????? default="true"

??????????????????????? class="solr.highlight.ScoreOrderFragmentsBuilder">

??

????? </fragmentsBuilder>

????? <!-- multi-colored tag FragmentsBuilder -->

????? <fragmentsBuilder name="colored"

??????????????????????? class="solr.highlight.ScoreOrderFragmentsBuilder">

??????? <lst name="defaults">

????????? <str name="hl.tag.pre"><![CDATA[

?????????????? <b style="background:yellow">,<b style="background:lawgreen">,

?????????????? <b style="background:aquamarine">,<b style="background:magenta">,

?????????????? <b style="background:palegreen">,<b style="background:coral">,

?????????????? <b style="background:wheat">,<b style="background:khaki">,

?????????????? <b style="background:lime">,<b style="background:deepskyblue">]]></str>

????????? <str name="hl.tag.post"><![CDATA[</b>]]></str>

??????? </lst>

????? </fragmentsBuilder>

?????

????? <boundaryScanner name="default"

?????????????????????? default="true"

?????????????????????? class="solr.highlight.SimpleBoundaryScanner">

??????? <lst name="defaults">

????????? <str name="hl.bs.maxScan">10</str>

????????? <str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str>

??????? </lst>

????? </boundaryScanner>

?????

????? <boundaryScanner name="breakIterator"

?????????????????????? class="solr.highlight.BreakIteratorBoundaryScanner">

??????? <lst name="defaults">

????????? <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->

????????? <str name="hl.bs.type">WORD</str>

????????? <!-- language and country are used when constructing Locale object.? -->

????????? <!-- And the Locale object will be used when getting instance of BreakIterator -->

????????? <str name="hl.bs.language">en</str>

????????? <str name="hl.bs.country">US</str>

??????? </lst>

????? </boundaryScanner>

??? </highlighting>

? </searchComponent>

??

? <queryResponseWriter name="json" class="solr.JSONResponseWriter">

???

??? <str name="content-type">text/plain; charset=UTF-8</str>

? </queryResponseWriter>

?

? <!--

???? Custom response writers can be declared as needed...

??? -->

??? <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy"/>

?

? <queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">

??? <int name="xsltCacheLifetimeSeconds">5</int>

? </queryResponseWriter>

??

? <admin>

??? <defaultQuery>*:*</defaultQuery>

? </admin>

</config>

參考資料及文獻(xiàn)

http://wiki.apache.org/solr/??? 所有的配置在這里都有說明,按需要配上就行了.


總結(jié)

以上是生活随笔為你收集整理的【转载】solr教程,值得刚接触搜索开发人员一看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

国产青草视频在线观看 | 成人四虎影院 | 亚洲精品乱码久久久久久高潮 | 精品国产一区二区三区四区在线观看 | 国产亚洲激情视频在线 | 中文字幕在线视频一区二区三区 | 国产在线中文字幕 | 中文字幕在线免费97 | av电影免费在线看 | 国产精品久久久久影视 | 久久美女电影 | 免费看三级网站 | 久久久久成人精品免费播放动漫 | 中文在线免费视频 | 成人在线电影观看 | 天天综合日 | 久久久精品小视频 | 亚洲视频第一页 | 伊人婷婷网 | 亚洲精品人人 | 国产亚州av | 午夜精品区 | 日韩av线观看 | 亚洲精品永久免费视频 | 欧美日韩在线播放一区 | 日日夜夜狠狠操 | 亚洲一区二区三区四区在线视频 | 2023av在线| a极黄色片 | 天天天天色综合 | 亚洲福利精品 | av片中文 | 极品中文字幕 | 免费在线成人av电影 | 色网站在线免费观看 | 九九久| 中文字幕av有码 | 日韩成人精品一区二区三区 | 成人免费看黄 | 99久久精品视频免费 | 韩国中文三级 | 天天操天天干天天干 | 日韩精品久久久久久 | 欧美日韩国产网站 | 天天干夜夜操视频 | 麻豆传媒视频观看 | 国产999精品久久久久久 | 久草视频在线播放 | 成人av网站在线观看 | 81精品国产乱码久久久久久 | 中文一二区| 国产色影院| 中文字幕一二三区 | 久久久久国产精品免费免费搜索 | 欧美a级在线免费观看 | 亚洲视频 一区 | 天天爱天天操 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 97超视频| 麻豆传媒视频在线播放 | 亚洲精品tv久久久久久久久久 | 免费av在线网 | 国产成人一区二区三区在线观看 | 亚洲女裸体 | 成人sm另类专区 | 精品乱码一区二区三四区 | 国产精品一区二区在线 | 欧美一级日韩三级 | 色综合网 | 娇妻呻吟一区二区三区 | 97香蕉久久超级碰碰高清版 | 久久视了 | 中文亚洲欧美日韩 | 99re8这里有精品热视频免费 | 天天爱av导航| 日韩精品极品视频 | 国产精品99久久久久久久久久久久 | 欧美大荫蒂xxx | 成人在线免费视频 | 在线观看国产福利片 | 久久久黄色av | 久艹视频免费观看 | 中文字幕视频在线播放 | 国产 欧美 在线 | 99免费在线观看 | 日韩一区二区免费在线观看 | 日韩伦理片一区二区三区 | 九九免费观看视频 | 欧美巨大荫蒂茸毛毛人妖 | 成人午夜网址 | 国产九九精品视频 | 色婷婷综合久色 | 天天干夜夜爽 | 欧美精品国产综合久久 | www.天天操.com | 欧美激情综合色 | 四虎影视久久久 | 成人免费观看在线视频 | 国产69精品久久久久久久久久 | 国产精品成久久久久三级 | 91免费观看网站 | 色网站黄 | 天天艹天天爽 | 欧美一级视频免费 | 国产精品乱码久久久久久1区2区 | 国产一区二区视频在线播放 | 日日操天天爽 | 日韩首页 | 99精品视频一区二区 | 蜜臀av性久久久久av蜜臀妖精 | 性日韩欧美在线视频 | 成人免费电影 | 久久中文字幕视频 | 99免费在线播放99久久免费 | 亚洲精品玖玖玖av在线看 | 五月婷婷影院 | 国产福利91精品 | 狠狠色狠狠色 | 激情大尺度视频 | 狠狠干夜夜操天天爽 | 中文字幕最新精品 | 午夜视频在线观看一区二区三区 | 亚洲无在线 | 麻豆91在线 | 97超碰人人| 91高清完整版在线观看 | 精品欧美一区二区三区久久久 | 麻豆系列在线观看 | 免费观看性生活大片3 | 涩涩伊人 | 国产又粗又猛又黄又爽 | 91九色国产在线 | 国产日韩一区在线 | 曰本免费av| 日韩高清一二三区 | 深爱五月激情五月 | 丁香六月婷婷开心 | av色影院 | 中文字幕国语官网在线视频 | 在线а√天堂中文官网 | 国产精品久久久久国产精品日日 | 色综合狠狠干 | 国产精品美女在线观看 | 久久久久亚洲精品成人网小说 | 亚洲日韩精品欧美一区二区 | 午夜久久福利视频 | 亚洲最大成人免费网站 | 一区中文字幕电影 | 91成版人在线观看入口 | 欧美视频日韩 | 一区二区精品久久 | 国产精品成人av在线 | 久久试看 | 国产精品一区久久久久 | 在线看国产精品 | 亚洲永久精品在线观看 | 中文字幕 国产精品 | 亚洲国产中文字幕在线观看 | 欧美精品国产精品 | 久久久久久电影 | 国产色一区 | 久久久久欧美精品999 | www.国产在线观看 | 一区二区三区久久 | 丁香婷婷深情五月亚洲 | 国产91在| 欧美精品一二三 | 在线观看视频国产 | 高清av中文在线字幕观看1 | 激情综合网五月激情 | 日韩在线观看a | 久久精品网站视频 | 日本特黄特色aaa大片免费 | 日韩超碰在线 | 丁香六月五月婷婷 | 天堂在线一区二区 | 日韩精品欧美专区 | 国产成人三级在线 | 欧美日韩69 | 亚洲激情视频 | 久久官网 | 一区二区三区四区不卡 | 69国产精品视频免费观看 | 国产精品18久久久久久久网站 | 婷婷国产一区二区三区 | 天天五月天色 | 亚洲精品国产免费 | 久久婷婷开心 | 亚洲国产经典视频 | 日韩午夜电影 | 四虎国产精品永久在线国在线 | 又爽又黄又无遮挡网站动态图 | 午夜美女av | 亚洲成人黄色网址 | 亚洲精品在线网站 | 天天干天天做天天爱 | 香蕉在线视频播放网站 | 日本午夜免费福利视频 | 国产精品淫 | 麻豆小视频在线观看 | 成人av片免费看 | 国产精品久久久久久久婷婷 | 国产手机视频在线观看 | 日韩精品在线一区 | 日韩羞羞| 一区二区三区国产欧美 | 免费av黄色 | 天天射天天干天天爽 | 成人午夜久久 | 天天操人人干 | av在线短片 | 国产自产高清不卡 | 欧洲精品码一区二区三区免费看 | 久草在线官网 | 91香蕉视频黄色 | 亚洲成av人片在线观看www | 精品久久福利 | 免费观看国产成人 | 天天射天天干天天插 | 手机在线中文字幕 | 日韩二区三区在线观看 | 国产一二三区在线观看 | 国外成人在线视频网站 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 免费又黄又爽的视频 | 日韩高清在线观看 | 精品久久久久久国产偷窥 | 欧美日韩免费看 | 中文字幕在线播放一区二区 | a天堂一码二码专区 | 久久99婷婷 | www.色午夜,com | 最新日韩中文字幕 | 黄网站色视频 | 国产日韩欧美综合在线 | 欧美亚洲国产精品久久高清浪潮 | 国产69精品久久app免费版 | 91香蕉视频色版 | 99久久99久久精品免费 | 中文字幕国产一区 | 精品999在线观看 | 日韩免费看 | 97超视频在线观看 | 91成熟丰满女人少妇 | www最近高清中文国语在线观看 | 亚洲精品久久久久中文字幕二区 | 国产 在线观看 | 久久久精品欧美一区二区免费 | 天天综合网天天 | 97在线影院 | 一级黄色片网站 | 天天躁日日躁狠狠躁 | 日本中文字幕电影在线免费观看 | 最近中文字幕在线播放 | 成人久久视频 | 国产精品黄 | 999毛片| 欧美亚洲一区二区在线 | 少妇bbb搡bbbb搡bbbb | 亚洲精品一区二区久 | 亚洲女人天堂成人av在线 | 九九热只有精品 | 免费电影一区二区三区 | 久久99国产综合精品 | 成人av免费在线观看 | 1024久久| 81精品国产乱码久久久久久 | av色综合| 97av在线| 久久久精品国产一区二区 | 在线看中文字幕 | 色欧美成人精品a∨在线观看 | 久久国产精品99精国产 | 亚洲国产欧洲综合997久久, | 久久免费视频一区 | 国精产品一二三线999 | 中文在线天堂资源 | 国产一区二区在线免费观看 | 97天堂网| 中文字幕三区 | 日韩精品影视 | 四虎成人av| 国产精品久久电影观看 | 欧美日韩国产成人 | 久久久精品午夜 | 精品福利网 | 国产免费久久av | 欧美性做爰猛烈叫床潮 | 欧美日韩中文在线 | 在线国产视频一区 | 亚洲伦理一区二区 | 欧美日韩一区二区三区在线免费观看 | 最近最新mv字幕免费观看 | 免费精品人在线二线三线 | 欧美日韩精品电影 | 成人午夜网 | 热re99久久精品国产66热 | 在线亚洲激情 | 一级欧美一级日韩 | 18性欧美xxxⅹ性满足 | 六月色婷婷 | 午夜视频播放 | 国产在线精品二区 | 亚洲精品免费在线观看视频 | 亚洲一区精品二人人爽久久 | 国产精品涩涩屋www在线观看 | 国产精品mm | 久久精品视频一 | 日日干夜夜干 | 日韩免费视频播放 | 久久精品第一页 | 亚洲国产欧美在线人成大黄瓜 | 久久不射网站 | 亚洲精品a区 | 中文字幕丝袜美腿 | 亚洲va欧美va人人爽春色影视 | 成人免费网视频 | 日日弄天天弄美女bbbb | 国产精品国产三级国产aⅴ无密码 | 在线黄色av | 国内精品久久久久久久影视麻豆 | 欧美极品久久 | 99精品视频在线观看播放 | 国产h片在线观看 | 天堂在线一区二区 | 精品美女久久 | 欧美日韩国产高清视频 | 国产在线精品福利 | 中文在线a∨在线 | 91久久电影 | 成人看片 | 婷婷日日 | 91探花视频 | 免费三级影片 | 成人中文字幕av | 日韩精品久久久免费观看夜色 | 国产手机在线 | 91视频免费| 在线观看免费黄色 | 日韩高清免费在线观看 | 亚洲精品色婷婷 | 亚洲精品www久久久久久 | 日韩免费电影 | 久久社区视频 | 狠狠久久伊人 | 亚洲视频免费在线观看 | 国产精品久久久久久久久久免费 | 国产精品麻豆免费版 | 91视频免费网址 | 四虎www.| 国产一区在线视频 | 在线亚洲小视频 | 亚洲自拍自偷 | 国产成人性色生活片 | 欧美午夜精品久久久久久孕妇 | 91人人爽久久涩噜噜噜 | 91成人网在线观看 | 97超碰人人澡人人 | 国产精品久久久久久久久免费 | 亚洲精品大片www | 亚洲精品777 | 江苏妇搡bbbb搡bbbb | 精品国产一二三四区 | 日韩在线 一区二区 | 国产精品亚 | 久久官网 | 福利视频一二区 | 久久精品在线免费观看 | 国产在线观看免费av | 亚洲一区二区精品在线 | 免费a级大片 | 五月天天av | 欧美一区二区三区在线看 | 色婷婷免费视频 | av成人在线看 | 蜜桃视频在线视频 | 91精选 | 免费成视频| a级黄色片视频 | 91你懂的 | 国产精品黄 | 国产成人精品a | 国产福利在线 | 丰满少妇麻豆av | 狠狠操精品 | 免费在线观看污网站 | 高清一区二区三区 | 欧美极度另类性三渗透 | 国产精品久久久久久久午夜片 | 欧美二区三区91 | 亚洲精品玖玖玖av在线看 | 亚洲视频一 | 国产午夜av | 色网站黄 | 国产精品久久久亚洲 | 精品在线观看视频 | 日韩中文字幕视频在线观看 | 亚洲国产成人精品在线 | 人人澡超碰碰97碰碰碰软件 | 国产999精品久久久久久绿帽 | 欧美色图亚洲图片 | 欧美一区二区三区在线看 | 亚洲精品色视频 | 亚洲五月| 日本一区二区高清不卡 | 伊人资源站 | 亚洲在线视频网站 | 免费观看一区二区三区视频 | 91毛片在线 | 久久国产欧美日韩精品 | 久久国产一区二区三区 | 久久综合九色综合97_ 久久久 | 国产福利小视频在线 | 亚洲精品国产自产拍在线观看 | 久久午夜精品影院一区 | 婷婷夜夜 | 久久精品免费观看 | 亚洲91中文字幕无线码三区 | 又色又爽的网站 | 国产精品18久久久久久久网站 | 久久免费电影网 | 国产黄色大全 | 久99久视频 | 久久久久国产精品www | 亚洲精品国偷拍自产在线观看蜜桃 | 久久国产午夜精品理论片最新版本 | 嫩草91影院| 草久在线| 国产精品久久二区 | 国产成人精品一区二区在线观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 日韩精选在线观看 | 色欲综合视频天天天 | 午夜av电影院 | 最近免费观看的电影完整版 | 中文字幕在线人 | 欧美一区影院 | 精品久久久久久久 | 久久久久免费 | 日韩精品高清视频 | .国产精品成人自产拍在线观看6 | 国产精品久久久777 成人手机在线视频 | 日韩久久精品一区二区三区下载 | 免费人成网ww44kk44 | 在线免费观看的av网站 | 中文在线8资源库 | 激情网第四色 | 久青草视频在线观看 | 欧美日韩中文国产 | 2019天天干夜夜操 | 免费男女羞羞的视频网站中文字幕 | 91精品国产成人www | 激情视频一区 | 久久伦理网| av蜜桃在线 | 久久久黄色免费网站 | 成人av在线一区二区 | 91麻豆产精品久久久久久 | 日韩精品中文字幕一区二区 | 激情伊人五月天久久综合 | 97国产大学生情侣白嫩酒店 | 99久久综合国产精品二区 | 激情久久久久久久久久久久久久久久 | 激情五月播播久久久精品 | 就要干b| 日韩高清免费电影 | 精品国产激情 | 久久精品精品 | 国产成人精品av久久 | 亚洲欧美乱综合图片区小说区 | 黄色成人av | 久久国产剧场电影 | 久久国内视频 | 欧美日韩不卡在线 | 特级毛片在线观看 | 国产高清久久久久 | 天天做天天爱夜夜爽 | 久久久网| 美女网站在线免费观看 | 亚洲二区精品 | 日韩精品免费在线播放 | 日韩69av| 开心激情婷婷 | 国产色小视频 | 黄色片网站免费 | 在线v片| 九七视频在线观看 | 色99色| 日韩在线一级 | 婷婷5月色 | sesese图片| 中国一级特黄毛片大片久久 | 免费久久99精品国产 | 久久精品国产亚洲精品 | www.香蕉视频 | 黄色的视频 | 国产色视频网站2 | 久久国产露脸精品国产 | 99精品区 | 白丝av免费观看 | 国产亚洲欧美在线视频 | 精品96久久久久久中文字幕无 | 日日摸日日添日日躁av | 五月天激情在线 | 黄色a在线观看 | 久久久久久看片 | 国产资源网 | 日韩成人高清在线 | 九九视频免费观看视频精品 | 精品国产一二三四区 | 黄色在线免费观看网站 | 高清国产午夜精品久久久久久 | 国产精品久久久av久久久 | 亚洲欧洲美洲av | 超薄丝袜一二三区 | 黄色资源在线观看 | 亚洲成熟女人毛片在线 | 亚洲成av人电影 | 色网免费观看 | 成人动漫一区二区 | 久久永久免费视频 | 91片黄在线观 | 亚洲精品1234区 | 久久亚洲欧美 | 久久精品一区二区国产 | 人人爽人人爱 | 黄色一级大片免费看 | 中文字幕在线免费看线人 | 日日夜夜中文字幕 | 欧美精品免费一区二区 | 中文字幕在线播放日韩 | 精品久久久久久久久久 | 精品成人久久 | 激情五月综合网 | 免费日韩在线 | 成人av免费在线播放 | 一区二区亚洲精品 | 国内亚洲精品 | 中文字幕日韩伦理 | 国产精品欧美在线 | 久久综合色综合88 | 欧美狠狠色 | 成人中文字幕在线观看 | 欧美一性一交一乱 | 日韩成人精品 | 中文字幕高清av | 日韩在线视频网 | 亚洲三级在线免费观看 | 中文字幕网址 | av电影一区二区 | 国产手机视频在线 | 亚洲精品中文在线观看 | 五月婷婷激情五月 | 亚洲成年片| 91成人久久 | 日本三级中文字幕在线观看 | 久久99在线| 亚洲理论在线观看电影 | 国产亚洲字幕 | 欧美日韩国产成人 | 中文字幕在线观看免费高清电影 | 亚洲免费精彩视频 | 伊人狠狠色 | www.一区二区三区 | 五月天伊人网 | 91精品无人成人www | 久久久久久综合网天天 | 国产精品久久 | 性色视频在线 | 久草手机视频 | 激情电影影院 | 国产传媒中文字幕 | 亚洲第一av在线播放 | 久久99网站 | 国产黑丝一区二区三区 | 97超碰在 | 人人干在线 | 久久视频这里只有精品 | 美女又爽又黄 | 日韩中文在线观看 | 国产毛片在线 | 国产精品中文字幕在线播放 | 欧美久久久影院 | 黄色av三级在线 | 性色av免费看 | 在线精品亚洲一区二区 | www.久久久.cum | 日韩午夜电影网 | 免费色视频网址 | 国产这里只有精品 | 伊人六月| 91av视频免费在线观看 | 99综合视频 | 韩国av免费观看 | 丁香激情综合国产 | 免费网站v | 色狠狠久久av五月综合 | 欧美日韩1区2区 | 国产高清精 | 最近高清中文字幕 | www.狠狠色.com | 国产一区二区成人 | 福利视频导航网址 | 国产中文 | 精品国产伦一区二区三区观看方式 | 亚洲a资源 | 久久国产精品偷 | 伊甸园永久入口www 99热 精品在线 | 久久视了 | 日本久久久久久久久久 | 国产偷在线 | 亚洲做受高潮欧美裸体 | 激情丁香久久 | 日日干天天操 | 久热色超碰 | 成人av在线观 | 日韩在线高清 | 456免费视频 | 国产精品免费久久久 | av一区二区三区在线播放 | 国产黄色资源 | 亚洲精品伦理在线 | 国内精品久久久久影院优 | 奇人奇案qvod| 九九免费在线观看视频 | 午夜色影院 | 日韩高清免费观看 | 在线观看中文字幕一区二区 | 韩国av免费观看 | 成人精品影视 | 久久极品| 国产一区二区在线免费 | 天天射天 | 97精品国产97久久久久久久久久久久 | 在线观看视频在线观看 | 亚洲最大成人网4388xx | 成年人视频在线免费观看 | 五月婷婷开心 | 亚洲精品免费播放 | 伊人色综合网 | 99在线视频播放 | 国产偷国产偷亚洲清高 | 成人久久免费 | 久久精品一区二区 | 久久er99热精品一区二区 | 日韩激情一二三区 | 四虎影视成人永久免费观看视频 | 在线一二区 | 中文字幕精品一区久久久久 | 在线观看国产高清视频 | www天天操 | 福利视频导航网址 | 久久久久久久久久福利 | 色窝资源 | 黄色一级大片在线免费看国产一 | 天天做日日爱夜夜爽 | 欧美日韩在线精品 | 激情欧美丁香 | 国产视频一区在线 | 黄色av成人在线 | 夜夜躁天天躁很躁波 | 亚洲人在线视频 | 乱子伦av | 97精品国自产拍在线观看 | 免费av网址大全 | 久久成人综合视频 | 亚洲国产成人精品电影在线观看 | 日韩在线一二三区 | 国产又粗又猛又黄 | 在线激情av电影 | 久久国产午夜精品理论片最新版本 | 在线观看国产永久免费视频 | 国产69熟 | 性色av免费在线观看 | 久久精品99国产国产精 | 久久综合之合合综合久久 | 91看片淫黄大片在线播放 | 亚洲精品美女在线观看播放 | 伊人伊成久久人综合网小说 | 国产网红在线观看 | 三上悠亚一区二区在线观看 | 国产精品欧美在线 | 亚洲四虎在线 | 久久综合久色欧美综合狠狠 | 黄色av电影一级片 | 999久久精品 | 国产淫片免费看 | 国产精品ⅴa有声小说 | 亚洲伊人成综合网 | 久久超级碰视频 | 夜夜操天天操 | 欧美日韩在线视频一区二区 | 精品视频在线观看 | 天天爱天天干天天爽 | 久久久99精品免费观看 | 乱子伦av| 久久国产精品区 | 播五月婷婷 | 日日碰狠狠添天天爽超碰97久久 | 三级黄色大片在线观看 | 午夜精品久久久久久久久久久久久久 | 欧美极品少妇xbxb性爽爽视频 | 国产精品女主播一区二区三区 | 国产成人在线网站 | 九九久久视频 | 一本—道久久a久久精品蜜桃 | 久久久久五月天 | 亚洲视频aaa| 国产香蕉视频 | 亚洲精品1234区 | 爱干视频 | 亚洲一级理论片 | 国产精品女人久久久 | 成人动态视频 | 日韩精品一区二区三区丰满 | 成人av片在线观看 | 在线天堂中文在线资源网 | 久久a级片| 国产一级视频免费看 | 久久久久综合精品福利啪啪 | 成人亚洲免费 | 高清有码中文字幕 | 久久99欧美| 欧美成人日韩 | 日韩理论电影网 | 亚洲一区黄色 | 色播五月婷婷 | 国产日韩视频在线 | 91免费观看视频网站 | 久久都是精品 | 97超级碰 | 高清av不卡| 婷婷在线播放 | 中文字幕日韩电影 | 高清不卡免费视频 | 久久久精品一区二区 | 18国产精品福利片久久婷 | 亚洲综合色网站 | www免费在线观看 | 国产在线观看黄 | 97在线成人 | 极品中文字幕 | 激情五月综合网 | 免费看亚洲毛片 | 99久久久久免费精品国产 | 在线观看一区 | 日韩天天综合 | 日韩高清精品免费观看 | 欧美国产高清 | 在线看不卡av | 三级a毛片 | 色婷婷成人| 99精品成人 | 五月av在线| 亚洲日本在线一区 | 国产手机视频精品 | 久操视频在线观看 | 免费成人黄色av | 96精品高清视频在线观看软件特色 | 在线观看一区 | 超碰在线cao | 456免费视频 | 一区二区视频在线播放 | 色姑娘综合网 | 奇米网网址 | 国产主播大尺度精品福利免费 | 夜添久久精品亚洲国产精品 | 99精品免费久久久久久日本 | 天天做天天爱夜夜爽 | 久久精品一二三区 | 亚洲欧美在线视频免费 | 国产一线二线三线在线观看 | 精品一二三四在线 | 人人干人人添 | 久久天天躁狠狠躁夜夜不卡公司 | 99精品国自产在线 | 免费99视频 | 日韩在线观看三区 | 久久久久99精品成人片三人毛片 | 欧美激情在线看 | 天天操天天干天天爽 | 国产明星视频三级a三级点| 久久精品视频在线 | 久久撸在线视频 | 欧美激精品| 国产视频精品久久 | 婷婷久久精品 | 三级av在线免费观看 | 狠狠干成人综合网 | 91你懂的 | 久久超碰在线 | 99久久超碰中文字幕伊人 | 日韩在线观看中文字幕 | 久久系列| 国产成人在线观看 | 亚洲黄色软件 | 九九热.com| 天堂资源在线观看视频 | 国产91av视频在线观看 | 欧美精品久久久久久久久免 | 国产精品久久久久久久久蜜臀 | 久久精品久久国产 | 99九九免费视频 | 永久黄网站色视频免费观看w | 欧美另类美少妇69xxxx | 91高清视频免费 | 久久热首页 | 99久久精品日本一区二区免费 | 中文字幕电影高清在线观看 | 精品国产一区二区在线 | 黄色软件在线观看 | 国产一级视频在线观看 | 国产精品久久99精品毛片三a | 久久久五月婷婷 | 久久午夜羞羞影院 | 天天激情天天干 | 国产一区免费在线 | 日韩精品视频在线观看网址 | 欧美日韩中文在线 | 日韩精品中字 | 色婷婷啪啪免费在线电影观看 | 亚洲精品h | 在线观看a视频 | 91福利视频网站 | 色在线网站| 2022中文字幕在线观看 | 麻豆国产在线播放 | 国产麻豆果冻传媒在线观看 | 91免费网址 | 日韩电影精品 | 麻豆国产精品一区二区三区 | 成 人 黄 色视频免费播放 | 人人干天天射 | 成人免费看电影 | www.com久久| 久久人人爽 | 午夜视频在线瓜伦 | 黄色av网站在线观看 | 日本久久精品 | 国产色黄网站 | 日韩欧美在线中文字幕 | 久操中文字幕在线观看 | 国产精品igao视频网入口 | 亚洲精品在线视频网站 | 开心色婷婷| 国产成人一区二区精品非洲 | 久免费 | 最近中文字幕久久 | 五月激情五月激情 | 日韩欧美v| 国产一区在线不卡 | 国产中文字幕视频 | 丁香色天天 | 日韩欧美精品一区 | 日日夜夜婷婷 | 丁香久久综合 | 欧美精品在线免费 | 韩国三级在线一区 | 在线看日韩 | 特级西西人体444是什么意思 | 水蜜桃亚洲一二三四在线 | 亚洲国产手机在线 | 色操插 | 午夜成人免费电影 | 91精品对白一区国产伦 | 亚洲国产av精品毛片鲁大师 | 久久久国产精品免费 | 亚洲黄色免费观看 | 99热播精品 | 国产91精品久久久久 | 国产在线一区二区三区播放 | 91九色视频 | 久久人操 | 五月在线视频 | 亚洲mv大片欧洲mv大片免费 | 亚洲精选在线观看 | 久久久精品日本 | 精品一二三区 | 激情综合网五月激情 | 91精品久久久久久综合五月天 | 久久久综合香蕉尹人综合网 | 国产成人av网址 | 成人试看120秒 | 伊人五月在线 | 日本视频久久久 | 91九色精品女同系列 | 国产成人黄色网址 | 欧美国产不卡 | 丁香免费视频 | 国产免费成人av | 中文字幕在线观看免费高清完整版 | 日韩欧美国产精品 | www天天干 | 免费看黄的视频 | 亚洲一二三久久 | 久久成人免费 | 制服丝袜在线 | 在线播放亚洲激情 | 在线观看不卡的av | 探花视频在线观看免费版 | 五月天婷婷综合 | 精品一区二区在线免费观看 | 91私密视频| 亚洲va天堂va欧美ⅴa在线 | a色视频 | 欧美精品久久久久久久久久白贞 | 中文字幕一区在线观看视频 | 成人在线视频免费观看 | 日韩欧美电影在线观看 | 欧美久草网| 国产人成一区二区三区影院 | 在线观看视频一区二区三区 | 九九热在线精品视频 | 精品少妇一区二区三区在线 | 国产亚洲aⅴaaaaaa毛片 | 丁香六月婷婷综合 | 欧美在线一级片 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美激情精品久久久久久免费 | 日韩v在线 | 91高清免费 | av成年人电影 | 久久免费激情视频 | 久久亚洲免费视频 | 美女搞黄国产视频网站 | 久草精品视频在线观看 | 久久久久国 | 综合久久网站 | 91丨porny丨九色 | 在线视频你懂得 | 欧美aa一级片 | 九九在线免费视频 | 免费日韩一区 | 国产福利一区在线观看 | 国产日韩欧美在线观看 | 91亚洲精| 国产精品久久久久久久午夜片 | 欧美精品被 | 午夜av片 | 狠狠色丁香婷婷综合最新地址 | 91九色国产| av大全在线看 | 在线视频一二三 | 国产精品二区三区 | 中文字幕免费高清在线观看 | 久久资源在线 | 玖玖玖影院 | 欧美精品999 | 国内精品二区 | 在线中文字母电影观看 | 婷婷丁香视频 | 欧美影片| 国产精品专区一 | 91精品视频免费看 | 91中文字幕在线 | 色综合夜色一区 | 999热线在线观看 | 香蕉视频久久久 | 激情久久伊人 | 免费又黄又爽视频 | 国产专区在线看 | 成人a免费看| 久久夜av| 久久久天堂 | 91久久丝袜国产露脸动漫 | 久久久精品一区二区三区 | 久久狠狠一本精品综合网 | av不卡在线看 | 狠狠色伊人亚洲综合网站野外 | 精品亚洲va在线va天堂资源站 | 人人澡人人草 | 狠狠干干 | 国产99久久久欧美黑人 | 伊人天天操| 人人爱夜夜操 | 日韩精品综合在线 | 久草在线在线精品观看 | 伊在线视频 | 免费网站v | av三级av| 97在线观视频免费观看 | 狠狠狠色丁香婷婷综合久久88 | 九九热免费在线视频 | av片子在线观看 | 久久开心激情 | 国产中文字幕一区二区 | 99热99re6国产在线播放 | 中文字幕第一 | 成人免费视频网站在线观看 | 国产精品福利在线播放 | 国产成人一区二区三区在线观看 | 天天舔天天射天天操 | 狂野欧美激情性xxxx欧美 | 亚洲欧美视频一区二区三区 | 国产视频久 | 日日射av | 91av小视频 | 一区二区视频在线播放 |