久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

轉載:http://blog.csdn.net/awj3584/article/details/16963525

Solr調研總結

開發類型

全文檢索相關開發

Solr版本

4.2

文件內容

本文介紹solr的功能使用及相關注意事項;主要包括以下內容:環境搭建及調試;兩個核心配置文件介紹;維護索引;查詢索引,和在查詢中可以應用的高亮顯示、拼寫檢查、搜索建議、分組統計、拼音檢索等功能的使用方法。

版本

作者/修改人

日期

V1.0

gzk

2013-06-04

1. Solr 是什么?

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

  • 高級的全文搜索功能
  • 專為高通量的網絡流量進行的優化
  • 基于開放接口(XML和HTTP)的標準
  • 綜合的HTML管理界面
  • 可伸縮性-能夠有效地復制到另外一個Solr搜索服務器
  • 使用XML配置達到靈活性和適配性
  • 可擴展的插件體系

2. Lucene 是什么?

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

3. Solr vs Lucene

Solr與Lucene 并不是競爭對立關系,恰恰相反Solr 依存于Lucene,因為Solr底層的核心技術是使用Lucene 來實現的,Solr和Lucene的本質區別有以下三點:搜索服務器,企業級和管理。Lucene本質上是搜索庫,不是獨立的應用程序,而Solr是。Lucene專注于搜索底層的建設,而Solr專注于企業應用。Lucene不負責支撐搜索服務所必須的管理,而Solr負責。所以說,一句話概括 Solr: Solr是Lucene面向企業搜索應用的擴展。

Solr與Lucene架構圖:

Solr使用Lucene并且擴展了它!

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

4.搭建并調試Solr

4.1 安裝虛擬機

Solr 必須運行在Java1.6 或更高版本的Java 虛擬機中,運行標準Solr 服務只需要安裝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?)

安裝 步驟請參考相應的幫助文檔。

4.2下載Solr

本文針對Solr4.2版本進行調研的,下文介紹內容均針對Solr4.2版本,如與Solr 最新版本有出入請以官方網站內容為準。Solr官方網站下載地址:http://lucene.apache.org/solr/

4.3下載并設置Apache Ant

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

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

查看是否安裝成功,在命令行窗口中輸入命令ant,若出現結果:



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

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

黑窗口里提示這個。。。

失敗。。。為什么呢,最后我發現是因為下載的ant中少了一個jar就是這apache-ivy(下載地址:http://ant.apache.org/ivy/)這東東名子真怪 ivy是ant管理jar依賴關系的。當第一次bulid時ivy會自動把build中的缺少的依賴進行下載。網速慢的第一次build要好久的。。。

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

4.4配置并運行Solr代碼

不管用什么IDE首選都要設置Solr Home在IDE的JVM參數設置VM arguments寫入 -Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用絕對路徑.

solr使用StartSolrJetty文件作為入口文件進行調試代碼,在這里可以設置服務器使用的端口和solr的webapps目錄.一般都不用設置,默認的就可以進行調試.Solr Home也能可在代碼中設置一樣好用.? System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");

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

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

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

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

5.Solr基礎

因為 Solr 包裝并擴展了Lucene,所以它們使用很多相同的術語。更重要的是,Solr 創建的索引與 Lucene 搜索引擎庫完全兼容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程序中的索引。在 Solr 和 Lucene 中,使用一個或多個 Document 來構建索引。Document 包括一個或多個 Field。Field 包括名稱、內容以及告訴 Solr 如何處理內容的元數據。

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

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

屬性名稱

描述

Indexed

Indexed Field 可以進行搜索和排序。你還可以在 indexed Field 上運行 Solr 分析過程,此過程可修改內容以改進或更改結果。

Stored

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

5.1模式配置Schema.xml

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

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>

參數說明:

屬性

描述

name

標識而已

class

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

sortMissingLast

設置成true沒有該field的數據排在有該field的數據之后,而不管請求時的排序規則, 默認是設置成false。

sortMissingFirst

跟上面倒過來唄。 默認是設置成false

analyzer

字段類型指定的分詞器

type

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

tokenizer

分詞器類

filter

分詞后應用的過濾器? 過濾器調用順序和配置相同.

5.1.2. fileds

是你添加到索引文件中出現的屬性名稱,而聲明類型就需要用到上面的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: 固定的字段設置
  • dynamicField: 動態的字段設置,用于后期自定義字段,*號通配符.例如: test_i就是int類型的動態字段.

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

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

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

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

字段屬性說明:

屬性

描述

name

字段類型名

class

java類名

indexed

缺省true。 說明這個數據應被搜索和排序,如果數據沒有indexed,則stored應是true。

stored

缺省true。說明這個字段被包含在搜索結果中是合適的。如果數據沒有stored,則indexed應是true。

omitNorms

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

一般文本字段不設置為true。

termVectors

如果字段被用來做more like this 和highlight的特性時應設置為true。

compressed

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

multiValued

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

positionIncrementGap

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

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

5.1.3. 其他配置

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

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

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

5.2. solr配置solrconfig.xml

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

5.2.1索引indexConfig

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

屬性

描述

useCompoundFile

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

ramBufferSizeMB

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

maxBufferedDocs

mergeFactor

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

maxIndexingThreads

indexWriter生成索引時使用的最大線程數

unlockOnStartup

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

lockType

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

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

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

5.2.2 查詢配置query

屬性

描述

maxBooleanClauses

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

filterCache

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

queryResultCache

緩存搜索結果,一個文檔ID列表

documentCache

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

fieldValueCache

字段緩存使用文檔ID進行快速訪問。默認情況下創建fieldValueCache即使這里沒有配置。

enableLazyFieldLoading

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

queryResultWindowSize

一次查詢中存儲最多的doc的id數目.

queryResultMaxDocsCached

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

listener

選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定實例化新搜索程序或第一個搜索程序時應該執行哪些查詢。如果應用程序期望請求某些特定的查詢,那么在創建新搜索程序或第一個搜索程序時就應該反注釋這些部分并執行適當的查詢。

useColdSearcher

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

maxWarmingSearchers

最大自熱searcher數量

5.3Solr加入中文分詞器

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

?????? 下面給出兩種分詞器的安裝方法,任選其一即可,推薦第一種,因為smartcn就在solr發行包的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 分詞器的安裝

??? 首選將發行包的contrib/analysis-extras/lucene-libs/ lucene-analyzers-smartcn-4.2.0.jar復制到\solr\contrib\analysis-extras\lib下,在solr本地應用文件夾下,打開/solr/conf/scheme.xml,編輯text字段類型如下,添加以下代碼到scheme.xml中的相應位置,就是找到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要實現中文檢索的話,就要做如下的配置:

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

5.3.2. IK 分詞器的安裝

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

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

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

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

Stopword.dic?????????????????????????? 分詞器停詞字典,可自定義添加內容

復制后就可以像smartcn一樣的進行配置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"/>

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

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

6.Solr功能應用

?????? 我這里主要使用SolrJ進行介紹一下Solr的一些基本應用,使用SolrJ加上EmbeddedSolrServer(嵌入式服務器),方便進行代碼跟蹤調試.在功能上和其它服務器都是一樣的,它們都是繼承的SolrServer來提供服務API的. EmbeddedSolrServer優點是不用起http協議,直接加載SolrCore進行操作,性能上應該是最快的,方便用于把Solr單結點服務嵌入到項目中使用.下面開始介紹Solr的功能的應用.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維護索引

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

6.1.1增加索引

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

SolrInputDocument doc = new SolrInputDocument();

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

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

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

server.add(doc);

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

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

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

6.1.2刪除索引

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

通過ID刪除方式代碼:

server.deleteById(id);

//或是使用批量刪除

server.deleteById(ids);

通過查詢刪除方式代碼:

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

//”*.*”就查詢所有內容的,介紹查詢時會詳細說明.

6.1.2優化索引

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

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

6.2查詢索引

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

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

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

返回結果如下:

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

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

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

? …

</result>

</response>

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

如果使用SolrJ進行調用的話代碼如下:

SolrQuery query = new SolrQuery();

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

QueryResponse rsp =server.query(query)

SolrDocumentList list = rsp.getResults();

返回結果在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查詢參數

名稱

描述

q

查詢字符串,必須的。

fq

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

fl

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

start

用于分頁定義結果起始記錄數,默認為0。

rows

用于分頁定義結果每頁返回記錄數,默認為10。

sort

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

df

默認的查詢字段,一般默認指定。

q.op

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

wt

writer type。指定查詢輸出結構格式,默認為“xml”。在solrconfig.xml中定義了查詢輸出格式:xml、json、python、ruby、php、phps、custom。

qt

query type,指定查詢使用的Query Handler,默認為“standard”。

explainOther

設置當debugQuery=true時,顯示其他的查詢說明。

defType

設置查詢解析器名稱。

timeAllowed

設置查詢超時時間。

omitHeader

設置是否忽略查詢結果返回頭信息,默認為“false”。

indent

返回的結果是否縮進,默認關閉,用 indent=true|on 開啟,一般調試json,php,phps,ruby輸出才有必要用這個參數。

version

查詢語法的版本,建議不使用它,由服務器指定默認值。

debugQuery

設置返回結果是否顯示Debug信息。

6.2.2查詢語法

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

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

1)??? Mandatory:查詢結果中必須包括的(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不可以達到期望的結果,因為AND兩邊的操作都是mandatory的。

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

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

5.子表達式查詢中阻止查詢的限制:

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

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

示例:entryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c

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

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

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

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

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

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

setAllowLeadingWildcard為true)

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

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

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

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

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

示例:

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)?????? 數字: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)可以被標志成日期。

示例:

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

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

6.2.3函數查詢(Function Query)

?????? 函數查詢 可以利用 numeric字段的值 或者 與字段相關的的某個特定的值的函數,來對文檔進行評分。

1.??? 使用函數查詢的方法

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

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

2)??? 使用“_val_”內嵌方法

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

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

3)??? 使用dismax中的bf參數

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

示例:

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

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

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

3.??? 使用函數查詢注意事項

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

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

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

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

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

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

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

格式: rord(myIndexedField)。

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

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

6)??? product:product(x,y,...)將會返回多個函數的乘積。格式: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)將返回表達式的絕對值。格式:abs(-5)、 abs(x)

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

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

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

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

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

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

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

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

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

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

16)? Recip:recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是變量或者一個函數。當a=b,并且x>=0的時候,這個函數的最大值是1,值的大小隨著x的增大而減小。例如:recip(rord(creationDate),1,1000,1000)

17)? Max: max(x,c)將會返回一個函數和一個常量之間的最大值。

例如:max(myfield,0)

6.3高亮顯示

????? 我們經常使用搜索引擎,比如在baidu 搜索 java ,會出現如下結果,結果中與關鍵字匹配的地方是紅色顯示與其他內容區別開來。

solr 默認已經配置了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

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

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

查詢結果如下:

<?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">  本報訊 中國銀聯股份有限公司和中國電信集團日前在北京簽署全面戰略合作協議。這標志著中國銀聯和中國電信將在通信服務、信息增值服務、新型支付產品合作開發等領域建立全面合作伙伴關系。  據悉,雙方簽署的全面戰略合作協議主要內容是:中國銀聯將選擇中國電信作為通信信息服務的主要提供商,雙方圍繞提高中國銀聯內部通信的水平和銷售網絡的服務水平開展全面、深入的合作;中國電信選擇中國銀聯作為銀行卡轉接支付服務的主要提供商,并圍繞開發、推廣新型支付終端產品和增值服務開展全面合作。(辛華)</str></doc> </result> <lst name="highlighting"> <lst name="7D919C61-03B3-4B6F-2D10-9E3CC92D2852"> <arr name="content"> <str>  本報訊 <em>中國</em>銀聯股份有限公司和<em>中國</em>電信集團日前在北京簽署全面戰略合作協議。這標志著<em>中國</em>銀聯和<em>中國</em>電信將在通信服務、信息增值服務、新型支付產品合作開發等領域建立全面合作伙伴關系。  據悉,雙方簽署</str> </arr> </lst> </lst> </response>

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

SolrQuery query = new SolrQuery();

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

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

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

query.setHighlightSimplePre(PRE_TAG);// 標記

query.setHighlightSimplePost(POST_TAG);

QueryResponse rsp =server.query(query)

//…上面取結果的代碼

//取出高亮結果

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

? if (rsp.getHighlighting().get(id) != null) {//先通過結果中的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,文件可能已經有這兩個元素(如果沒有添加即可),需要根據我們自己的系統環境做些適當的修改。

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

配置完成之后,我們進行一下測試,重啟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時也同樣加入參數就可以

SolrQuery query = new SolrQuery();

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

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

QueryResponse rsp =server.query(query)

//…上面取結果的代碼

SpellCheckResponse spellCheckResponse = rsp.getSpellCheckResponse();

if (spellCheckResponse != null) {

? String collation = spellCheckResponse.getCollatedResult();

}

6.5檢索建議

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

?????? 現在我們開始配置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>

配置完成之后,我們進行一下測試,重啟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>中國證監會</str> <str>中國足協</str> <str>中國銀行</str> </arr> </lst> </lst> </lst> </response>

使用SolrJ時也同樣加入參數就可以

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參數來限制一些不常用的詞不出現在智能提示列表中,當這個值設置過大時,可能導致結果太少,需要引起注意。目前主要存在的問題是使用freq排序算法,返回的結果完全基于索引中字符的出現次數,沒有兼顧用戶搜索詞語的頻率,因此無法將一些熱門詞排在更靠前的位置。這塊可定制SuggestWordScoreComparator來實現,目前還沒有著手做這件事情。

6.6分組統計

?????? 我這里實現分組統計的方法是使用了Solr的Facet組件, Facet組件是Solr默認集成的一個組件.

6.6.1 Facet簡介

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

6.6.2 Facet字段

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

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

2.??? Facet字段的要求

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

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

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

3.??? 特殊情況

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

<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的默認requestHandler已經包含了Facet組件(solr.FacetComponent).如果自定義requestHandler或者對默認的requestHandler自定義組件列表,那么需要將Facet加入到組件列表中去.

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

……

<arr name="components">

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

<str>facet</str>

……

</arr>

</requestHandler>

6.6.2 Facet查詢

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

1.??? Field Facet

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

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

返回結果:

<?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字段設置查詢參數.以下介紹的參數既可以應用于所有的Facet字段,也可以應用于每個單獨的Facet字段.應用于單獨的字段時通過

f.字段名.參數名=參數值

這種方式調用.比如facet.prefix參數應用于cpu字段,可以采用如下形式

f.cpu.facet.prefix=Intel

1.1? facet.prefix

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

1.2? facet.sort

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

1.3? facet.limit

?????? 限制Facet字段返回的結果條數.默認值為100.如果此值為負數,表示不限制.

1.4? facet.offset

?????? 返回結果集的偏移量,默認為0.它與facet.limit配合使用可以達到分頁的效果.

1.5? facet.mincount

?????? 限制了Facet字段值的最小count,默認為0.合理設置該參數可以將用戶的關注點集中在少數比較熱門的領域.

1.6? facet.missing

?????? 默認為””,如果設置為true或者on,那么將統計那些該Facet字段值為null的記錄.

1.7? facet.method

?????? 取值為enum或fc,默認為fc.該字段表示了兩種Facet的算法,與執行效率相關.

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

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

1.8? facet.enum.cache.minDf

?????? 當facet.method=enum時,此參數其作用,minDf表示minimum document frequency.也就是文檔內出現某個關鍵字的最少次數.該參數默認值為0.設置該參數可以減少filterCache的內存消耗,但會增加總的查詢時間(計算交集的時間增加了).如果設置該值的話,官方文檔建議優先嘗試25-50內的值.

6.6.3 Date Facet

?????? 日期類型的字段在文檔中很常見,如商品上市時間,貨物出倉時間,書籍上架時間等等.某些情況下需要針對這些字段進行Facet.不過時間字段的取值有無限性,用戶往往關心的不是某個時間點而是某個時間段內的查詢統計結果. Solr為日期字段提供了更為方便的查詢統計方式.當然,字段的類型必須是DateField(或其子類型).

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

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

facet.date.start:起始時間,時間的一般格式為1995-12-31T23:59:59Z,另外可以使用NOW\YEAR\ MONTH等等,具體格式可以參考DateField的java doc.

facet.date.end:結束時間.

facet.date.gap:時間間隔.如果start為2009-1-1,end為2010-1-1.gap設置為+1MONTH表示間隔1個月,那么將會把這段時間劃分為12個間隔段.

注意+因為是特殊字符所以應該用%2B代替.

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

舉例:

&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

返回結果:

<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參數,可以對任意字段進行篩選.

例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]

返回結果:

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

返回結果:

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

返回結果:

<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

返回結果:

<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操作符

?????? 當查詢使用filter query的時候,如果filter query的字段正好是Facet字段,那么查詢結果往往被限制在某一個值內.

例:

&fq=screenSize:14

&facet=on

&facet.field=screenSize

返回結果:

<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寸的產品共有107件,其它尺寸的產品的數目都是0,這是因為在filter里已經限制了screenSize:14.這樣,查詢結果中,除了screenSize=14的這一項之外,其它項目沒有實際的意義.有些時候,用戶希望把結果限制在某一范圍內,又希望查看該范圍外的概況.比如上述情況,既要把查詢結果限制在14寸屏的筆記本,又想查看一下其它屏幕尺寸的筆記本有多少產品.這個時候需要用到tag和ex操作符.tag就是把一個filter標記起來,ex(exclude)是在Facet的時候把標記過的filter排除在外.

例:

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

&facet=on

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

返回結果:

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

這樣其它屏幕尺寸的統計信息就有意義了.

6.6.7 SolrJ對Facet的支持

//初始化查詢對象

String q = “*.*”;

SolrQuery query = new SolrQuery(q);

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

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

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

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

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

QueryResponse rsp = server.query(query);

//取出結果

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

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

6.7自動聚類

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

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

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

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

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

6.8相似匹配

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

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

MoreLikeThisComponent 參數:

參數

 說明

  值域

mlt

在查詢時,打開/關閉 MoreLikeThisComponent 的布爾值。

true|false

mlt.count

可選。每一個結果要檢索的相似文檔數。          

> 0

mlt.fl  

用于創建 MLT 查詢的字段。               

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

mlt.maxqt

可選。查詢詞語的最大數量。由于長文檔可能會有很多關鍵詞語,這樣 MLT 查詢可能會很大,從而導致反應緩慢或可怕的 TooManyClausesException,該參數只保留關鍵的詞語。

> 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時也同樣加入參數就可以

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拼音檢索

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

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

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

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

?????? 想要Solr支持拼音檢索就要先把拼音分詞(PinyinAnalyzer)的jar復制到\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:最小中文詞長度,意思是小于這個值的中文詞不會做拼音轉換。

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

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

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

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

?????? 由于上面minTermLenght和minGram設置的值,現在出現了人沒有進行拼音轉換并且最小拼音切分是從1個開始的。

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

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

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

到現在就可以使用拼音檢索了。

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

6.10 SolrCloud

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

基本可以用上面這幅圖來概述,這是一個擁有4個Solr節點的集群,索引分布在兩個Shard里面,每個Shard包含兩個Solr節點,一個是Leader節點,一個是Replica節點,此外集群中有一個負責維護集群狀態信息的Overseer節點,它是一個總控制器。集群的所有狀態信息都放在Zookeeper集群中統一維護。從圖中還可以看到,任何一個節點都可以接收索引更新的請求,然后再將這個請求轉發到文檔所應該屬于的那個Shard的Leader節點,Leader節點更新結束完成,最后將版本號和文檔轉發給同屬于一個Shard的replicas節點。這里就不多說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名字指的是拼寫檢查的依據,也就是說要根據哪個Field來檢查用戶輸入。

????? -->

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

????? <!-- Optional, by default use in-memory index (RAMDirectory)

SpellCheck索引文件的存放位置,是可選的,如果不寫默認使用內存模式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>

<!--何時創建拼寫索引: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>

<!-- 另一個拼寫檢查器,使用文件內容為檢查依據

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

參考資料及文獻

http://wiki.apache.org/solr/??? 所有的配置在這里都有說明,按需要配上就行了.


總結

以上是生活随笔為你收集整理的【转载】solr教程,值得刚接触搜索开发人员一看的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

小sao货水好多真紧h无码视频 | 精品无码成人片一区二区98 | 午夜精品久久久久久久 | 99久久久国产精品无码免费 | 精品国产aⅴ无码一区二区 | 东京热一精品无码av | 国产精品人妻一区二区三区四 | 波多野结衣av一区二区全免费观看 | 综合激情五月综合激情五月激情1 | 精品国产一区二区三区av 性色 | 亚洲精品综合一区二区三区在线 | 一本久久a久久精品亚洲 | 伊人久久大香线蕉av一区二区 | 精品成人av一区二区三区 | 粗大的内捧猛烈进出视频 | 国产高清av在线播放 | 国产免费久久精品国产传媒 | 久久99久久99精品中文字幕 | 中文字幕无码日韩欧毛 | 中文字幕+乱码+中文字幕一区 | 麻豆国产97在线 | 欧洲 | 亚洲va中文字幕无码久久不卡 | a在线观看免费网站大全 | 影音先锋中文字幕无码 | 内射老妇bbwx0c0ck | 精品无人区无码乱码毛片国产 | 亚洲男人av香蕉爽爽爽爽 | 久激情内射婷内射蜜桃人妖 | 国产卡一卡二卡三 | 7777奇米四色成人眼影 | 国产亚洲美女精品久久久2020 | 少妇被粗大的猛进出69影院 | 欧美日韩在线亚洲综合国产人 | 亚洲国产日韩a在线播放 | 亚洲伊人久久精品影院 | 久久99精品久久久久婷婷 | 人妻少妇精品无码专区二区 | 国产口爆吞精在线视频 | 久激情内射婷内射蜜桃人妖 | 精品国产av色一区二区深夜久久 | 少妇被黑人到高潮喷出白浆 | 国产乱人伦偷精品视频 | 久久99精品久久久久久动态图 | 中文字幕精品av一区二区五区 | 麻豆md0077饥渴少妇 | 亚洲一区av无码专区在线观看 | 国产手机在线αⅴ片无码观看 | 精品乱码久久久久久久 | 日韩精品a片一区二区三区妖精 | 日韩欧美群交p片內射中文 | 国内揄拍国内精品少妇国语 | 日日天日日夜日日摸 | 成人动漫在线观看 | 99久久精品无码一区二区毛片 | 欧美激情综合亚洲一二区 | 18精品久久久无码午夜福利 | 三级4级全黄60分钟 | 最近的中文字幕在线看视频 | 精品国产麻豆免费人成网站 | 国产色精品久久人妻 | 中文亚洲成a人片在线观看 | 99久久精品国产一区二区蜜芽 | 伊人久久大香线蕉亚洲 | 亚洲精品久久久久中文第一幕 | 日日碰狠狠丁香久燥 | 中文字幕无码免费久久99 | 两性色午夜免费视频 | 精品一区二区不卡无码av | 欧美精品无码一区二区三区 | 国内精品人妻无码久久久影院 | 高潮毛片无遮挡高清免费视频 | 领导边摸边吃奶边做爽在线观看 | 无遮挡国产高潮视频免费观看 | 欧美 日韩 人妻 高清 中文 | 成人精品视频一区二区三区尤物 | 久久精品国产一区二区三区肥胖 | 午夜肉伦伦影院 | 亚洲理论电影在线观看 | 久久 国产 尿 小便 嘘嘘 | 无码播放一区二区三区 | 欧美日韩视频无码一区二区三 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 少妇无码一区二区二三区 | 国产精品鲁鲁鲁 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 人人澡人人透人人爽 | 国产绳艺sm调教室论坛 | 强辱丰满人妻hd中文字幕 | 国产偷国产偷精品高清尤物 | 国产乱码精品一品二品 | 一本久久伊人热热精品中文字幕 | 国产偷抇久久精品a片69 | 老太婆性杂交欧美肥老太 | 国产乱子伦视频在线播放 | 欧美三级不卡在线观看 | 成年美女黄网站色大免费全看 | 久久综合九色综合欧美狠狠 | 图片区 小说区 区 亚洲五月 | 国产麻豆精品精东影业av网站 | 久久久久久a亚洲欧洲av冫 | 国产麻豆精品一区二区三区v视界 | 大地资源网第二页免费观看 | 亚洲精品综合一区二区三区在线 | 东京热无码av男人的天堂 | 福利一区二区三区视频在线观看 | 人妻无码αv中文字幕久久琪琪布 | 少妇无码吹潮 | 最近中文2019字幕第二页 | 国产av剧情md精品麻豆 | 精品无码一区二区三区爱欲 | 丰满诱人的人妻3 | 免费无码午夜福利片69 | 国产后入清纯学生妹 | 日本爽爽爽爽爽爽在线观看免 | 成人一在线视频日韩国产 | 亚洲一区二区三区无码久久 | 国产无套粉嫩白浆在线 | 国产小呦泬泬99精品 | 高潮毛片无遮挡高清免费视频 | 97色伦图片97综合影院 | 少女韩国电视剧在线观看完整 | 久久亚洲精品中文字幕无男同 | 天堂а√在线中文在线 | 欧美亚洲国产一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 丁香啪啪综合成人亚洲 | 永久黄网站色视频免费直播 | 夜夜高潮次次欢爽av女 | 粗大的内捧猛烈进出视频 | 亚洲高清偷拍一区二区三区 | 99精品视频在线观看免费 | 日日摸天天摸爽爽狠狠97 | 亚洲乱亚洲乱妇50p | 天天综合网天天综合色 | 麻豆精产国品 | 亚洲日本一区二区三区在线 | 一本无码人妻在中文字幕免费 | 亚洲熟妇色xxxxx欧美老妇 | 强伦人妻一区二区三区视频18 | 色妞www精品免费视频 | av无码久久久久不卡免费网站 | 成人精品视频一区二区三区尤物 | 久久精品无码一区二区三区 | 国产精品久久久 | 精品无码成人片一区二区98 | 女人被爽到呻吟gif动态图视看 | 夜夜影院未满十八勿进 | 野外少妇愉情中文字幕 | 国产成人人人97超碰超爽8 | 国产又爽又黄又刺激的视频 | 亚洲人成网站免费播放 | 久久久www成人免费毛片 | 中文无码伦av中文字幕 | 欧美xxxxx精品 | 欧美成人午夜精品久久久 | 亚洲啪av永久无码精品放毛片 | 亚洲色欲久久久综合网东京热 | 中文字幕无码av波多野吉衣 | 强伦人妻一区二区三区视频18 | 成人免费无码大片a毛片 | 久久99热只有频精品8 | 国产香蕉尹人综合在线观看 | 国产精品久久国产三级国 | 国产精品美女久久久久av爽李琼 | 日本饥渴人妻欲求不满 | 亚洲精品一区二区三区在线 | 国产国语老龄妇女a片 | 爆乳一区二区三区无码 | 色五月五月丁香亚洲综合网 | 中文字幕av伊人av无码av | 老熟女乱子伦 | 狂野欧美性猛交免费视频 | 全球成人中文在线 | 少妇被粗大的猛进出69影院 | 无码一区二区三区在线 | 老司机亚洲精品影院无码 | 亚洲 日韩 欧美 成人 在线观看 | 国产真实夫妇视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲aⅴ无码成人网站国产app | 香港三级日本三级妇三级 | 国产97在线 | 亚洲 | 日韩精品久久久肉伦网站 | 无码av中文字幕免费放 | 国产av人人夜夜澡人人爽麻豆 | 乱码av麻豆丝袜熟女系列 | 国产成人精品优优av | 乱人伦人妻中文字幕无码久久网 | 亚洲中文字幕va福利 | 欧美熟妇另类久久久久久多毛 | 丰满少妇弄高潮了www | 久久久久久九九精品久 | 国产三级久久久精品麻豆三级 | 亚洲区小说区激情区图片区 | 国产精品二区一区二区aⅴ污介绍 | 窝窝午夜理论片影院 | 亚洲中文字幕无码一久久区 | 一本久道久久综合狠狠爱 | 亚洲熟妇色xxxxx亚洲 | 国产成人一区二区三区在线观看 | 男女作爱免费网站 | 人人爽人人爽人人片av亚洲 | 日产精品高潮呻吟av久久 | 性做久久久久久久免费看 | 亚洲国产一区二区三区在线观看 | 高清国产亚洲精品自在久久 | 亚洲高清偷拍一区二区三区 | 亚洲国产精品一区二区美利坚 | 中文字幕日产无线码一区 | 国产莉萝无码av在线播放 | 国产人妻精品一区二区三区不卡 | 在线看片无码永久免费视频 | 中文无码伦av中文字幕 | 无码任你躁久久久久久久 | 国产免费观看黄av片 | 久久久久久九九精品久 | 国产猛烈高潮尖叫视频免费 | 偷窥日本少妇撒尿chinese | 狠狠色噜噜狠狠狠7777奇米 | 亚洲毛片av日韩av无码 | 久久久精品456亚洲影院 | 亚洲毛片av日韩av无码 | 久久精品丝袜高跟鞋 | 7777奇米四色成人眼影 | 亚洲日韩av一区二区三区中文 | 丰满诱人的人妻3 | av人摸人人人澡人人超碰下载 | 妺妺窝人体色www在线小说 | 日韩精品a片一区二区三区妖精 | 日韩精品无码一区二区中文字幕 | 免费网站看v片在线18禁无码 | 国产综合色产在线精品 | 国产区女主播在线观看 | 中国大陆精品视频xxxx | 国产成人精品久久亚洲高清不卡 | 日本饥渴人妻欲求不满 | 国产精品无码永久免费888 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品久久久av久久久 | 午夜精品久久久内射近拍高清 | 亚欧洲精品在线视频免费观看 | 国产精品久久国产精品99 | 久久久精品成人免费观看 | 欧美怡红院免费全部视频 | 麻豆蜜桃av蜜臀av色欲av | 俺去俺来也在线www色官网 | 漂亮人妻洗澡被公强 日日躁 | 亚洲成av人片在线观看无码不卡 | 无码av免费一区二区三区试看 | 精品无码成人片一区二区98 | 亚洲日本va中文字幕 | 成人无码精品一区二区三区 | 人人妻人人澡人人爽人人精品 | 久久久精品456亚洲影院 | aa片在线观看视频在线播放 | 男人和女人高潮免费网站 | a片在线免费观看 | 性欧美牲交xxxxx视频 | 日本精品久久久久中文字幕 | 久久精品国产一区二区三区肥胖 | 久久97精品久久久久久久不卡 | 青青青爽视频在线观看 | 国产一区二区不卡老阿姨 | 免费乱码人妻系列无码专区 | 中文字幕av无码一区二区三区电影 | 亚洲熟妇色xxxxx欧美老妇y | 人人澡人摸人人添 | 老熟女乱子伦 | 久激情内射婷内射蜜桃人妖 | 内射白嫩少妇超碰 | 欧美自拍另类欧美综合图片区 | 俺去俺来也www色官网 | 久久国产精品二国产精品 | 亚洲精品美女久久久久久久 | 国产成人精品一区二区在线小狼 | 精品久久久久久亚洲精品 | 亚洲春色在线视频 | 丰满人妻精品国产99aⅴ | 蜜臀aⅴ国产精品久久久国产老师 | 精品亚洲成av人在线观看 | 国产精品va在线播放 | 亚洲国产欧美国产综合一区 | 亚洲欧洲日本无在线码 | 精品人妻中文字幕有码在线 | 精品国产成人一区二区三区 | 午夜福利一区二区三区在线观看 | 亚洲区小说区激情区图片区 | 大色综合色综合网站 | 国产亚洲日韩欧美另类第八页 | 亚洲 另类 在线 欧美 制服 | 玩弄少妇高潮ⅹxxxyw | 亚洲人成网站免费播放 | 久久99精品久久久久久动态图 | 久久视频在线观看精品 | 97夜夜澡人人双人人人喊 | 国产精品-区区久久久狼 | 亚洲国产精品久久久久久 | 在线观看国产午夜福利片 | 天天燥日日燥 | 亚洲一区二区三区在线观看网站 | 又粗又大又硬毛片免费看 | 日本又色又爽又黄的a片18禁 | 一本色道久久综合狠狠躁 | 色偷偷人人澡人人爽人人模 | 精品国产福利一区二区 | 中文字幕无码av波多野吉衣 | 久久精品国产一区二区三区肥胖 | 国产人妻久久精品二区三区老狼 | 中文字幕+乱码+中文字幕一区 | 中国大陆精品视频xxxx | 日日天干夜夜狠狠爱 | 欧美日韩在线亚洲综合国产人 | 露脸叫床粗话东北少妇 | 正在播放东北夫妻内射 | 色婷婷av一区二区三区之红樱桃 | 久久人人爽人人爽人人片av高清 | 国产精品久久久久久亚洲影视内衣 | aⅴ亚洲 日韩 色 图网站 播放 | 搡女人真爽免费视频大全 | 免费国产黄网站在线观看 | 欧美35页视频在线观看 | 欧洲美熟女乱又伦 | 波多野结衣乳巨码无在线观看 | 久久亚洲国产成人精品性色 | 久久久久99精品成人片 | 人妻互换免费中文字幕 | 国产午夜手机精彩视频 | 欧美乱妇无乱码大黄a片 | 偷窥日本少妇撒尿chinese | 亚洲精品一区二区三区在线观看 | 亚洲精品中文字幕久久久久 | 国产亚洲精品久久久久久久 | 人人澡人摸人人添 | 18黄暴禁片在线观看 | 国产精品久久久久影院嫩草 | 国产真实夫妇视频 | 国产成人无码a区在线观看视频app | 久久久久se色偷偷亚洲精品av | 国产免费久久精品国产传媒 | 久久精品99久久香蕉国产色戒 | 女人高潮内射99精品 | 国精产品一品二品国精品69xx | 动漫av一区二区在线观看 | 欧洲极品少妇 | 国产亚洲日韩欧美另类第八页 | 欧美激情综合亚洲一二区 | 免费乱码人妻系列无码专区 | 波多野结衣一区二区三区av免费 | 强伦人妻一区二区三区视频18 | 青青草原综合久久大伊人精品 | 伊人色综合久久天天小片 | 免费无码的av片在线观看 | 国产片av国语在线观看 | 东京热无码av男人的天堂 | 亚洲国产一区二区三区在线观看 | 青青久在线视频免费观看 | 久久国产精品偷任你爽任你 | 狠狠色欧美亚洲狠狠色www | 国产一区二区三区日韩精品 | 精品日本一区二区三区在线观看 | 亚洲人成无码网www | 少妇人妻大乳在线视频 | 久久99热只有频精品8 | 无码帝国www无码专区色综合 | 中文字幕无线码 | 国产极品视觉盛宴 | 欧美精品一区二区精品久久 | 日本爽爽爽爽爽爽在线观看免 | 中文字幕乱码人妻二区三区 | 色狠狠av一区二区三区 | 午夜无码人妻av大片色欲 | 日本欧美一区二区三区乱码 | 天天做天天爱天天爽综合网 | 日本一区二区三区免费高清 | 成人一在线视频日韩国产 | 男女下面进入的视频免费午夜 | 国产熟妇高潮叫床视频播放 | 国产香蕉97碰碰久久人人 | 日韩精品成人一区二区三区 | 清纯唯美经典一区二区 | 国产suv精品一区二区五 | 婷婷综合久久中文字幕蜜桃三电影 | 精品成在人线av无码免费看 | 青春草在线视频免费观看 | 色诱久久久久综合网ywww | 亚洲va中文字幕无码久久不卡 | 欧美日韩一区二区三区自拍 | 久久无码专区国产精品s | 九九热爱视频精品 | 又色又爽又黄的美女裸体网站 | 国产内射爽爽大片视频社区在线 | 日韩av无码一区二区三区不卡 | 丰满护士巨好爽好大乳 | 久久久久久久女国产乱让韩 | 四虎国产精品免费久久 | 亚洲国产av精品一区二区蜜芽 | 国产无av码在线观看 | 日韩人妻系列无码专区 | 波多野结衣乳巨码无在线观看 | 久久久久久九九精品久 | 樱花草在线社区www | 午夜无码人妻av大片色欲 | 国产美女极度色诱视频www | 国产精品无码永久免费888 | 大肉大捧一进一出好爽视频 | 少妇人妻偷人精品无码视频 | 亚洲国产一区二区三区在线观看 | 国产在线精品一区二区高清不卡 | 乌克兰少妇xxxx做受 | 国精品人妻无码一区二区三区蜜柚 | 久久99精品久久久久婷婷 | 人人妻人人澡人人爽人人精品 | 日本高清一区免费中文视频 | 人妻少妇精品无码专区二区 | 中文字幕无码日韩欧毛 | 少妇高潮喷潮久久久影院 | 亚洲另类伦春色综合小说 | √天堂中文官网8在线 | 婷婷综合久久中文字幕蜜桃三电影 | 狠狠色色综合网站 | 无码精品国产va在线观看dvd | 久久久久久久人妻无码中文字幕爆 | 国产精品免费大片 | 欧美日韩一区二区免费视频 | 牲欲强的熟妇农村老妇女视频 | 日本乱偷人妻中文字幕 | 无码人妻少妇伦在线电影 | 欧美自拍另类欧美综合图片区 | 99久久精品日本一区二区免费 | 熟女俱乐部五十路六十路av | 粗大的内捧猛烈进出视频 | 亚洲精品中文字幕久久久久 | 熟妇人妻激情偷爽文 | 中文无码精品a∨在线观看不卡 | 蜜桃臀无码内射一区二区三区 | 亚洲精品一区二区三区大桥未久 | 中文字幕无码视频专区 | 亚洲国产精品毛片av不卡在线 | 国产精品第一国产精品 | 亚洲精品中文字幕久久久久 | 国产一区二区三区影院 | 亚洲国产一区二区三区在线观看 | 成人免费视频在线观看 | 亚洲娇小与黑人巨大交 | 人人爽人人澡人人高潮 | 日本饥渴人妻欲求不满 | 在线观看欧美一区二区三区 | 性色av无码免费一区二区三区 | 精品久久综合1区2区3区激情 | 天天爽夜夜爽夜夜爽 | 日日橹狠狠爱欧美视频 | 久久久久人妻一区精品色欧美 | 午夜嘿嘿嘿影院 | 色综合久久久无码网中文 | 国产精品久久精品三级 | 精品国产一区二区三区av 性色 | 欧洲极品少妇 | 麻豆蜜桃av蜜臀av色欲av | 日本熟妇大屁股人妻 | 国内精品人妻无码久久久影院蜜桃 | 日本精品高清一区二区 | 丝袜足控一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 中文字幕+乱码+中文字幕一区 | 大胆欧美熟妇xx | 色窝窝无码一区二区三区色欲 | 国产乱人偷精品人妻a片 | 乱人伦人妻中文字幕无码 | 精品无码av一区二区三区 | 亚洲国产高清在线观看视频 | 内射巨臀欧美在线视频 | 2020最新国产自产精品 | 成人精品一区二区三区中文字幕 | 欧美日本精品一区二区三区 | 最近免费中文字幕中文高清百度 | 色老头在线一区二区三区 | 又大又硬又黄的免费视频 | 97夜夜澡人人爽人人喊中国片 | 国产成人综合在线女婷五月99播放 | 午夜福利不卡在线视频 | 玩弄少妇高潮ⅹxxxyw | 日韩精品久久久肉伦网站 | 亚洲另类伦春色综合小说 | 蜜臀aⅴ国产精品久久久国产老师 | 国产另类ts人妖一区二区 | 国内精品人妻无码久久久影院蜜桃 | 亚洲欧美精品伊人久久 | 亚洲另类伦春色综合小说 | av在线亚洲欧洲日产一区二区 | 亚洲精品国偷拍自产在线麻豆 | 99精品视频在线观看免费 | 午夜无码人妻av大片色欲 | 日韩精品无码一本二本三本色 | 小泽玛莉亚一区二区视频在线 | 97夜夜澡人人爽人人喊中国片 | 欧美自拍另类欧美综合图片区 | 爆乳一区二区三区无码 | 欧美日本免费一区二区三区 | 久久综合激激的五月天 | 中文无码伦av中文字幕 | 亚洲国产欧美日韩精品一区二区三区 | 野外少妇愉情中文字幕 | 牲欲强的熟妇农村老妇女视频 | 欧美肥老太牲交大战 | 精品久久久久久人妻无码中文字幕 | 日本丰满熟妇videos | 国产成人无码专区 | 天天拍夜夜添久久精品 | 综合激情五月综合激情五月激情1 | 免费观看激色视频网站 | 九九久久精品国产免费看小说 | 国产成人亚洲综合无码 | 性欧美大战久久久久久久 | 人妻中文无码久热丝袜 | 亚洲国产高清在线观看视频 | 无码国产乱人伦偷精品视频 | 最近免费中文字幕中文高清百度 | 国产 浪潮av性色四虎 | 色综合久久中文娱乐网 | 国产两女互慰高潮视频在线观看 | 国产精品无码永久免费888 | 99久久精品国产一区二区蜜芽 | 动漫av一区二区在线观看 | 国产电影无码午夜在线播放 | 国产人妻久久精品二区三区老狼 | 中文毛片无遮挡高清免费 | 亚洲欧美精品aaaaaa片 | 搡女人真爽免费视频大全 | 亚洲熟妇色xxxxx亚洲 | 天堂亚洲2017在线观看 | 国产精品高潮呻吟av久久 | 伦伦影院午夜理论片 | 日韩视频 中文字幕 视频一区 | 天堂一区人妻无码 | 亚洲国产精品一区二区美利坚 | 国产亚av手机在线观看 | 波多野结衣aⅴ在线 | 无码国产乱人伦偷精品视频 | 成在人线av无码免观看麻豆 | 亚洲精品午夜国产va久久成人 | 亚洲精品美女久久久久久久 | 免费观看的无遮挡av | 午夜时刻免费入口 | 超碰97人人做人人爱少妇 | 偷窥日本少妇撒尿chinese | 欧美人与动性行为视频 | 樱花草在线社区www | 国产成人无码a区在线观看视频app | 国产偷国产偷精品高清尤物 | 国产激情一区二区三区 | 狂野欧美激情性xxxx | 国产香蕉尹人综合在线观看 | 国精品人妻无码一区二区三区蜜柚 | 亚洲а∨天堂久久精品2021 | 久久99精品国产麻豆蜜芽 | 成人免费视频视频在线观看 免费 | 精品久久久中文字幕人妻 | 国产精品久久久久久久9999 | 捆绑白丝粉色jk震动捧喷白浆 | 东北女人啪啪对白 | 天堂а√在线地址中文在线 | 欧美国产日产一区二区 | 亚洲欧美精品伊人久久 | 99在线 | 亚洲 | 免费国产成人高清在线观看网站 | 无码乱肉视频免费大全合集 | 亚洲国产一区二区三区在线观看 | 欧美精品无码一区二区三区 | 日本精品久久久久中文字幕 | 熟女俱乐部五十路六十路av | 欧美黑人性暴力猛交喷水 | 免费无码肉片在线观看 | 国产成人精品优优av | 亚洲中文字幕va福利 | 中文精品久久久久人妻不卡 | 免费乱码人妻系列无码专区 | 亚洲成熟女人毛毛耸耸多 | 中文字幕人妻丝袜二区 | 久久久久久av无码免费看大片 | 亚洲伊人久久精品影院 | 小sao货水好多真紧h无码视频 | 国产偷自视频区视频 | 最近的中文字幕在线看视频 | 真人与拘做受免费视频一 | 国产一区二区三区四区五区加勒比 | 欧美日韩一区二区免费视频 | 国产一区二区三区精品视频 | 成在人线av无码免费 | 性欧美熟妇videofreesex | 亚洲成av人片天堂网无码】 | 人妻无码久久精品人妻 | 国产片av国语在线观看 | 偷窥村妇洗澡毛毛多 | 国産精品久久久久久久 | 窝窝午夜理论片影院 | 动漫av网站免费观看 | 久久99精品国产.久久久久 | 亚洲爆乳大丰满无码专区 | 精品无码成人片一区二区98 | 国产莉萝无码av在线播放 | 欧美激情一区二区三区成人 | 内射老妇bbwx0c0ck | 国产偷抇久久精品a片69 | 97夜夜澡人人爽人人喊中国片 | 少妇无套内谢久久久久 | аⅴ资源天堂资源库在线 | 欧美精品一区二区精品久久 | 中文字幕无码av激情不卡 | 爆乳一区二区三区无码 | 真人与拘做受免费视频 | 国产精品无码一区二区三区不卡 | 四虎国产精品免费久久 | 国产乱人无码伦av在线a | 亚洲国产精华液网站w | 国产高潮视频在线观看 | 久久视频在线观看精品 | 性色av无码免费一区二区三区 | 免费人成在线视频无码 | 99riav国产精品视频 | 少妇无套内谢久久久久 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品国产精品乱码视色 | 欧美性猛交xxxx富婆 | 国产特级毛片aaaaaaa高清 | 国产精品鲁鲁鲁 | 午夜精品久久久久久久久 | 亚洲七七久久桃花影院 | 久久久久久a亚洲欧洲av冫 | 性生交大片免费看女人按摩摩 | 国产精品二区一区二区aⅴ污介绍 | 免费国产黄网站在线观看 | 青青青爽视频在线观看 | 国产精品资源一区二区 | 国产舌乚八伦偷品w中 | 亚洲午夜久久久影院 | 精品成人av一区二区三区 | 亚洲一区二区三区无码久久 | 成人aaa片一区国产精品 | 7777奇米四色成人眼影 | 亚无码乱人伦一区二区 | 亚拍精品一区二区三区探花 | 欧洲熟妇精品视频 | 人人妻人人澡人人爽人人精品 | 妺妺窝人体色www婷婷 | 国产人妖乱国产精品人妖 | 野外少妇愉情中文字幕 | 亚洲精品一区二区三区四区五区 | 国产无遮挡又黄又爽免费视频 | 日日橹狠狠爱欧美视频 | 欧美肥老太牲交大战 | 久久99精品久久久久婷婷 | 亚洲精品无码国产 | 国产av一区二区三区最新精品 | 国产精品毛片一区二区 | 色综合久久久久综合一本到桃花网 | 国产精品国产三级国产专播 | 国精产品一品二品国精品69xx | 国产激情精品一区二区三区 | 国产偷国产偷精品高清尤物 | 午夜肉伦伦影院 | 亚洲国产日韩a在线播放 | 亚洲s码欧洲m码国产av | 97无码免费人妻超级碰碰夜夜 | 牛和人交xxxx欧美 | 国产内射老熟女aaaa | 亚洲精品久久久久久久久久久 | 一本色道婷婷久久欧美 | 国产高清av在线播放 | 成年女人永久免费看片 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久人人爽人人人人片 | 免费播放一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 久久zyz资源站无码中文动漫 | 国产乱子伦视频在线播放 | 中文字幕无码视频专区 | 亚洲爆乳无码专区 | 国内精品一区二区三区不卡 | 国产精品.xx视频.xxtv | 午夜精品久久久内射近拍高清 | 熟女体下毛毛黑森林 | 国产做国产爱免费视频 | 夜精品a片一区二区三区无码白浆 | 中文字幕乱码人妻二区三区 | 特级做a爰片毛片免费69 | 欧美 丝袜 自拍 制服 另类 | 亚洲中文字幕无码中文字在线 | 精品国产一区av天美传媒 | 激情内射亚州一区二区三区爱妻 | 国产av一区二区三区最新精品 | 亚洲国产午夜精品理论片 | 国产精品免费大片 | 国产另类ts人妖一区二区 | 亚洲 欧美 激情 小说 另类 | 少妇人妻大乳在线视频 | 亚洲综合无码久久精品综合 | 51国偷自产一区二区三区 | 亚洲国产精品一区二区美利坚 | 伊人久久大香线蕉午夜 | 亚洲国产精品一区二区美利坚 | 麻豆国产97在线 | 欧洲 | 精品成在人线av无码免费看 | 无码精品人妻一区二区三区av | 天堂а√在线地址中文在线 | 色妞www精品免费视频 | 亚洲日韩一区二区三区 | 久久综合九色综合97网 | 国产亚洲视频中文字幕97精品 | 久久久久久九九精品久 | 久在线观看福利视频 | 亚洲自偷自拍另类第1页 | 亚洲国产av精品一区二区蜜芽 | 久久熟妇人妻午夜寂寞影院 | 2020久久香蕉国产线看观看 | 人妻中文无码久热丝袜 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲熟悉妇女xxx妇女av | 无码任你躁久久久久久久 | 奇米影视888欧美在线观看 | 久久www免费人成人片 | 久久成人a毛片免费观看网站 | 成人无码视频在线观看网站 | 国产明星裸体无码xxxx视频 | 少妇人妻av毛片在线看 | 桃花色综合影院 | 欧美日韩综合一区二区三区 | 玩弄中年熟妇正在播放 | 日产国产精品亚洲系列 | 中文无码成人免费视频在线观看 | 久久午夜无码鲁丝片秋霞 | 亚洲天堂2017无码 | 国产乱人伦偷精品视频 | 97久久精品无码一区二区 | 国产无套粉嫩白浆在线 | 天天av天天av天天透 | 免费人成在线视频无码 | 国内精品人妻无码久久久影院蜜桃 | 日本一区二区更新不卡 | 国产精品手机免费 | 国产人妻精品午夜福利免费 | 日韩亚洲欧美精品综合 | 成人无码影片精品久久久 | 噜噜噜亚洲色成人网站 | 成人精品一区二区三区中文字幕 | 在线亚洲高清揄拍自拍一品区 | 熟妇人妻无乱码中文字幕 | 久久久久亚洲精品中文字幕 | 熟女少妇在线视频播放 | 亚洲日本一区二区三区在线 | 国产热a欧美热a在线视频 | 欧洲极品少妇 | 伊人久久婷婷五月综合97色 | 亚洲国产日韩a在线播放 | 麻豆蜜桃av蜜臀av色欲av | 曰韩少妇内射免费播放 | www国产精品内射老师 | 精品日本一区二区三区在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 丝袜足控一区二区三区 | 日本护士毛茸茸高潮 | 在线视频网站www色 | 真人与拘做受免费视频 | 在线观看国产午夜福利片 | 亚洲人成人无码网www国产 | 欧美freesex黑人又粗又大 | 久久久中文字幕日本无吗 | 亚欧洲精品在线视频免费观看 | 一本久久a久久精品亚洲 | 丝袜美腿亚洲一区二区 | 国产色视频一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 亚洲成av人综合在线观看 | 99久久99久久免费精品蜜桃 | 真人与拘做受免费视频 | 少妇被粗大的猛进出69影院 | 香蕉久久久久久av成人 | 偷窥日本少妇撒尿chinese | 日本熟妇浓毛 | 无码人妻丰满熟妇区五十路百度 | 亚洲伊人久久精品影院 | 国产精品久久久久久久9999 | 国产乡下妇女做爰 | 夜精品a片一区二区三区无码白浆 | 成人三级无码视频在线观看 | 少妇无套内谢久久久久 | 国产超碰人人爽人人做人人添 | 欧洲熟妇精品视频 | 无人区乱码一区二区三区 | 亚洲一区av无码专区在线观看 | 中文毛片无遮挡高清免费 | 少妇久久久久久人妻无码 | 国产成人精品三级麻豆 | 亚洲欧美精品aaaaaa片 | 少妇厨房愉情理9仑片视频 | 国产特级毛片aaaaaa高潮流水 | 妺妺窝人体色www婷婷 | 人人妻人人澡人人爽精品欧美 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产精品人人妻人人爽 | 1000部啪啪未满十八勿入下载 | 亚洲啪av永久无码精品放毛片 | 丰满人妻翻云覆雨呻吟视频 | 无码国模国产在线观看 | 精品 日韩 国产 欧美 视频 | 亚洲中文字幕va福利 | а天堂中文在线官网 | 水蜜桃亚洲一二三四在线 | 久久亚洲a片com人成 | 东京一本一道一二三区 | 国产麻豆精品精东影业av网站 | 久久久婷婷五月亚洲97号色 | 曰韩无码二三区中文字幕 | 欧美第一黄网免费网站 | 亚洲天堂2017无码 | 强伦人妻一区二区三区视频18 | 97色伦图片97综合影院 | 黑人巨大精品欧美一区二区 | 久久精品中文闷骚内射 | 中文字幕色婷婷在线视频 | 欧美日韩一区二区三区自拍 | 国内精品人妻无码久久久影院蜜桃 | 国内老熟妇对白xxxxhd | 亚洲色欲色欲天天天www | 欧洲欧美人成视频在线 | 久久婷婷五月综合色国产香蕉 | 麻豆成人精品国产免费 | 粉嫩少妇内射浓精videos | 熟妇人妻激情偷爽文 | 中国女人内谢69xxxxxa片 | 正在播放老肥熟妇露脸 | 国产精品永久免费视频 | 小sao货水好多真紧h无码视频 | 无码一区二区三区在线 | 国产精品无码一区二区三区不卡 | 国内精品人妻无码久久久影院蜜桃 | 精品无码一区二区三区的天堂 | 巨爆乳无码视频在线观看 | 国产电影无码午夜在线播放 | 国産精品久久久久久久 | 国内精品久久久久久中文字幕 | 欧美人与物videos另类 | 无码av免费一区二区三区试看 | 精品夜夜澡人妻无码av蜜桃 | 强伦人妻一区二区三区视频18 | 国产真实乱对白精彩久久 | 亚洲一区二区三区国产精华液 | 欧美 丝袜 自拍 制服 另类 | 久久精品一区二区三区四区 | 中文字幕av无码一区二区三区电影 | 亚洲の无码国产の无码影院 | 思思久久99热只有频精品66 | 夜精品a片一区二区三区无码白浆 | 亚洲熟妇色xxxxx欧美老妇y | 精品国产青草久久久久福利 | 亚洲日本一区二区三区在线 | 国产免费久久久久久无码 | 国产亚av手机在线观看 | 兔费看少妇性l交大片免费 | 亚洲日韩av一区二区三区中文 | 理论片87福利理论电影 | 老太婆性杂交欧美肥老太 | 色婷婷欧美在线播放内射 | 色婷婷av一区二区三区之红樱桃 | 波多野结衣高清一区二区三区 | 在线欧美精品一区二区三区 | 亚洲成a人片在线观看日本 | 少妇一晚三次一区二区三区 | 久久99精品国产.久久久久 | 久久久中文久久久无码 | 18精品久久久无码午夜福利 | 18精品久久久无码午夜福利 | 丰满人妻被黑人猛烈进入 | 色五月五月丁香亚洲综合网 | 久热国产vs视频在线观看 | 欧美日韩一区二区免费视频 | 久久久亚洲欧洲日产国码αv | 亚洲中文字幕在线无码一区二区 | 亚洲一区二区三区播放 | 亚洲欧洲日本无在线码 | 少妇的肉体aa片免费 | 粗大的内捧猛烈进出视频 | 国产sm调教视频在线观看 | 四虎4hu永久免费 | 女人色极品影院 | 久久久久久a亚洲欧洲av冫 | 全黄性性激高免费视频 | 久久精品国产一区二区三区肥胖 | 久久国产精品偷任你爽任你 | 亚洲阿v天堂在线 | 最新版天堂资源中文官网 | 亚洲色无码一区二区三区 | 日本护士毛茸茸高潮 | 97精品人妻一区二区三区香蕉 | 性生交大片免费看女人按摩摩 | 国产高清不卡无码视频 | 亚洲一区二区三区播放 | 国精产品一品二品国精品69xx | 日产精品高潮呻吟av久久 | 欧美日韩综合一区二区三区 | 亚洲经典千人经典日产 | 国产在线aaa片一区二区99 | 中文精品无码中文字幕无码专区 | 成人免费视频在线观看 | 亚洲成av人影院在线观看 | 无码人妻黑人中文字幕 | 欧美肥老太牲交大战 | 日日干夜夜干 | 国产综合在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日韩人妻无码一区二区三区久久99 | 日韩无套无码精品 | 国产亚洲美女精品久久久2020 | 久久99久久99精品中文字幕 | 岛国片人妻三上悠亚 | 亚洲精品午夜国产va久久成人 | 国产综合久久久久鬼色 | 男女下面进入的视频免费午夜 | 爆乳一区二区三区无码 | 久久久成人毛片无码 | 强开小婷嫩苞又嫩又紧视频 | 无码av岛国片在线播放 | 性色欲网站人妻丰满中文久久不卡 | 7777奇米四色成人眼影 | 久久国内精品自在自线 | 97无码免费人妻超级碰碰夜夜 | 久久成人a毛片免费观看网站 | 55夜色66夜色国产精品视频 | 亚洲毛片av日韩av无码 | 黑人大群体交免费视频 | 精品亚洲成av人在线观看 | 欧美日本精品一区二区三区 | 激情人妻另类人妻伦 | 成年美女黄网站色大免费视频 | 国产精品99爱免费视频 | 亚洲国产精品久久久久久 | 国产成人无码专区 | av在线亚洲欧洲日产一区二区 | 国产免费久久精品国产传媒 | 乱人伦人妻中文字幕无码 | 国产在线aaa片一区二区99 | 亚洲国产av精品一区二区蜜芽 | 亚洲国产精品无码久久久久高潮 | 亚洲一区二区三区播放 | aⅴ亚洲 日韩 色 图网站 播放 | 欧美人与物videos另类 | 日韩人妻无码中文字幕视频 | 国产激情一区二区三区 | 狂野欧美性猛交免费视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 性欧美疯狂xxxxbbbb | 强开小婷嫩苞又嫩又紧视频 | 中文字幕人妻丝袜二区 | 日韩精品无码一区二区中文字幕 | 国产精品沙发午睡系列 | 无人区乱码一区二区三区 | 真人与拘做受免费视频一 | 亚洲人交乣女bbw | 亚洲精品成a人在线观看 | 亚洲日本一区二区三区在线 | 澳门永久av免费网站 | 99久久精品午夜一区二区 | 又色又爽又黄的美女裸体网站 | 日本一卡2卡3卡四卡精品网站 | 好男人社区资源 | 国产亚洲精品精品国产亚洲综合 | 精品久久久久久人妻无码中文字幕 | 18无码粉嫩小泬无套在线观看 | 成在人线av无码免费 | 俄罗斯老熟妇色xxxx | 成人精品天堂一区二区三区 | 麻豆国产丝袜白领秘书在线观看 | 亚洲午夜无码久久 | 国产卡一卡二卡三 | 亚洲欧美日韩成人高清在线一区 | 九九热爱视频精品 | 久久aⅴ免费观看 | 狂野欧美激情性xxxx | 久久综合九色综合97网 | 国产手机在线αⅴ片无码观看 | 鲁鲁鲁爽爽爽在线视频观看 | 欧美亚洲日韩国产人成在线播放 | 美女扒开屁股让男人桶 | 超碰97人人射妻 | 性色欲情网站iwww九文堂 | 亚洲中文字幕成人无码 | 久久国产精品二国产精品 | 国产一区二区三区四区五区加勒比 | 久久久久成人精品免费播放动漫 | 国产精品99爱免费视频 | 亚洲a无码综合a国产av中文 | 国产免费久久精品国产传媒 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成人影院yy111111在线观看 | 免费观看激色视频网站 | 国内少妇偷人精品视频 | 日本一卡二卡不卡视频查询 | 极品尤物被啪到呻吟喷水 | 成年美女黄网站色大免费全看 | 国产成人一区二区三区在线观看 | 欧美性猛交xxxx富婆 | 久久久国产一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 国产人妻精品一区二区三区 | 亚洲国产高清在线观看视频 | 欧美精品国产综合久久 | 牲交欧美兽交欧美 | 欧美兽交xxxx×视频 | 亚洲国产精品无码久久久久高潮 | 国产女主播喷水视频在线观看 | 图片小说视频一区二区 | 大肉大捧一进一出好爽视频 | 四虎永久在线精品免费网址 | 亚洲大尺度无码无码专区 | 中文无码成人免费视频在线观看 | 好男人www社区 | 日本一区二区更新不卡 | 水蜜桃亚洲一二三四在线 | 人妻少妇被猛烈进入中文字幕 | 亚洲狠狠婷婷综合久久 | 亚洲最大成人网站 | 99久久精品国产一区二区蜜芽 | 亚洲国产成人a精品不卡在线 | 激情综合激情五月俺也去 | 久久综合九色综合欧美狠狠 | 牲欲强的熟妇农村老妇女 | 精品国产成人一区二区三区 | 久久人人爽人人爽人人片ⅴ | 沈阳熟女露脸对白视频 | 亚洲中文字幕无码中字 | 熟妇人妻中文av无码 | 18禁黄网站男男禁片免费观看 | 免费观看又污又黄的网站 | 性欧美牲交在线视频 | 国产区女主播在线观看 | 97人妻精品一区二区三区 | 日韩欧美中文字幕在线三区 | 熟妇人妻无乱码中文字幕 | 欧美老熟妇乱xxxxx | 国产99久久精品一区二区 | 中文字幕无码av波多野吉衣 | 亚洲精品一区二区三区四区五区 | 成人欧美一区二区三区 | 老司机亚洲精品影院 | 午夜精品久久久久久久 | 久久精品人妻少妇一区二区三区 | 亚洲一区av无码专区在线观看 | 久久精品视频在线看15 | 亚洲国产精品一区二区美利坚 | 精品国产一区av天美传媒 | 荫蒂被男人添的好舒服爽免费视频 | 日韩精品a片一区二区三区妖精 | 男人的天堂2018无码 | 亚洲欧美国产精品久久 | 久久人妻内射无码一区三区 | 欧洲美熟女乱又伦 | 国产亚洲人成在线播放 | 精品人妻人人做人人爽 | 亚洲男人av香蕉爽爽爽爽 | 久久人人97超碰a片精品 | 亚洲色成人中文字幕网站 | 欧美zoozzooz性欧美 | 亚洲七七久久桃花影院 | 三上悠亚人妻中文字幕在线 | 国产精品欧美成人 | 免费乱码人妻系列无码专区 | 亚洲精品一区二区三区在线 | 亚洲乱码日产精品bd | 老熟妇乱子伦牲交视频 | 性欧美熟妇videofreesex | 美女扒开屁股让男人桶 | 亚洲乱亚洲乱妇50p | 久久无码专区国产精品s | 亚洲精品一区二区三区大桥未久 | 蜜桃无码一区二区三区 | 欧美激情一区二区三区成人 | 麻豆md0077饥渴少妇 | 国産精品久久久久久久 | 国产在线精品一区二区三区直播 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲 另类 在线 欧美 制服 | 六月丁香婷婷色狠狠久久 | 99久久亚洲精品无码毛片 | 一本精品99久久精品77 | 又粗又大又硬毛片免费看 | 国内揄拍国内精品少妇国语 | 久久国产精品偷任你爽任你 | 国产乱码精品一品二品 | 日日橹狠狠爱欧美视频 | 国产精品第一国产精品 | 任你躁国产自任一区二区三区 | 午夜精品久久久内射近拍高清 | 亚洲综合久久一区二区 | 久久久久久av无码免费看大片 | 国产办公室秘书无码精品99 | 欧美成人免费全部网站 | 国产亚洲美女精品久久久2020 | 嫩b人妻精品一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 欧美三级不卡在线观看 | 性欧美疯狂xxxxbbbb | 噜噜噜亚洲色成人网站 | 日日碰狠狠躁久久躁蜜桃 | 久久久久成人精品免费播放动漫 | 免费国产成人高清在线观看网站 | 青青草原综合久久大伊人精品 | 两性色午夜视频免费播放 | 国产极品美女高潮无套在线观看 | 国产色视频一区二区三区 | 九九久久精品国产免费看小说 | 中文亚洲成a人片在线观看 | 欧美日本日韩 | 国产精品永久免费视频 | 久久人妻内射无码一区三区 | 久久综合激激的五月天 | 在线观看欧美一区二区三区 | 97久久超碰中文字幕 | 激情五月综合色婷婷一区二区 | 亚洲成在人网站无码天堂 | 午夜精品一区二区三区在线观看 | 无码免费一区二区三区 | 国产无遮挡又黄又爽免费视频 | 日产精品99久久久久久 | 六十路熟妇乱子伦 | 亚洲色偷偷男人的天堂 | 又紧又大又爽精品一区二区 | 亚洲精品国偷拍自产在线麻豆 | 乱人伦中文视频在线观看 | 玩弄中年熟妇正在播放 | 国产在线精品一区二区三区直播 | 国内精品久久毛片一区二区 | 狠狠噜狠狠狠狠丁香五月 | 色欲av亚洲一区无码少妇 | 亚洲熟女一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 日本精品少妇一区二区三区 | 真人与拘做受免费视频 | 久久久成人毛片无码 | 亚洲欧美国产精品久久 | 精品国精品国产自在久国产87 | 国产成人无码av在线影院 | 香港三级日本三级妇三级 | 18无码粉嫩小泬无套在线观看 | 97久久国产亚洲精品超碰热 | 久久久中文久久久无码 | 日韩精品一区二区av在线 | 未满成年国产在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 国产激情无码一区二区 | 牲欲强的熟妇农村老妇女视频 | 国产精品久久久久9999小说 | 国产成人一区二区三区在线观看 | 99麻豆久久久国产精品免费 | 岛国片人妻三上悠亚 | 熟女体下毛毛黑森林 | 国产成人无码一二三区视频 | 曰本女人与公拘交酡免费视频 | 男人的天堂2018无码 | 成人无码精品1区2区3区免费看 | 好屌草这里只有精品 | 国产精品久久久久9999小说 | 国产熟妇另类久久久久 | 亚洲 a v无 码免 费 成 人 a v | 天天躁日日躁狠狠躁免费麻豆 | 亚洲综合另类小说色区 | 日韩人妻系列无码专区 | 男人扒开女人内裤强吻桶进去 | 欧美黑人巨大xxxxx | 国产特级毛片aaaaaa高潮流水 | 乱人伦人妻中文字幕无码久久网 | 亚洲色大成网站www国产 | 亚洲精品国产a久久久久久 | 欧美精品无码一区二区三区 | 亚洲大尺度无码无码专区 | 久久国产精品精品国产色婷婷 | 午夜成人1000部免费视频 | 亚洲小说春色综合另类 | 日本肉体xxxx裸交 | 国产在线精品一区二区高清不卡 | 黑人巨大精品欧美一区二区 | 中文字幕 人妻熟女 | 无码成人精品区在线观看 | 国产精品久久久久久久9999 | 狠狠亚洲超碰狼人久久 | 精品一区二区三区无码免费视频 | 亚洲成av人片天堂网无码】 | 少妇无套内谢久久久久 | 日本又色又爽又黄的a片18禁 | 欧美肥老太牲交大战 | 人人爽人人爽人人片av亚洲 | 福利一区二区三区视频在线观看 | 亚洲中文字幕在线无码一区二区 | yw尤物av无码国产在线观看 | 最近的中文字幕在线看视频 | 亚洲s码欧洲m码国产av | 成熟女人特级毛片www免费 | 久久久精品国产sm最大网站 | 久久国产精品偷任你爽任你 | 欧美日韩久久久精品a片 | 国产性生大片免费观看性 | 久久天天躁夜夜躁狠狠 | 高清无码午夜福利视频 | 国产精品久免费的黄网站 | 精品久久综合1区2区3区激情 | 国产精品久久久久久亚洲影视内衣 | 在线看片无码永久免费视频 | 理论片87福利理论电影 | 免费无码的av片在线观看 | 久9re热视频这里只有精品 | 久久综合九色综合97网 | 亚洲国产欧美国产综合一区 | 精品国产av色一区二区深夜久久 | 国产午夜视频在线观看 | 亚洲国产av精品一区二区蜜芽 | 无码人妻少妇伦在线电影 | 国产欧美精品一区二区三区 | 亚洲色欲色欲欲www在线 | 亚洲自偷自偷在线制服 | 久久视频在线观看精品 | 国产精品久久久久久久影院 | 亚洲精品无码人妻无码 | 国产午夜无码视频在线观看 | 国语自产偷拍精品视频偷 | 国产精品99爱免费视频 | 久久综合狠狠综合久久综合88 | 亚洲色欲色欲欲www在线 | 欧美 日韩 人妻 高清 中文 | 无码av免费一区二区三区试看 | 红桃av一区二区三区在线无码av | 国产三级久久久精品麻豆三级 | 曰韩少妇内射免费播放 | 国产艳妇av在线观看果冻传媒 | 偷窥日本少妇撒尿chinese | 国产农村妇女高潮大叫 | 99麻豆久久久国产精品免费 | 欧美国产亚洲日韩在线二区 | 国产sm调教视频在线观看 | 成人无码影片精品久久久 | 水蜜桃亚洲一二三四在线 | 99精品国产综合久久久久五月天 | 无码吃奶揉捏奶头高潮视频 | 国产亚洲欧美日韩亚洲中文色 | 男人的天堂2018无码 | 欧美高清在线精品一区 | 未满小14洗澡无码视频网站 | 麻豆国产人妻欲求不满 | 久久久久99精品国产片 | 国产办公室秘书无码精品99 | 中文字幕人妻无码一区二区三区 | 极品尤物被啪到呻吟喷水 | 无码播放一区二区三区 | 国产成人一区二区三区别 | 一本无码人妻在中文字幕免费 | 噜噜噜亚洲色成人网站 | 久久久精品国产sm最大网站 | 亚洲国产成人av在线观看 | 综合人妻久久一区二区精品 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 少妇厨房愉情理9仑片视频 | 好男人社区资源 | 亚洲国产成人av在线观看 | 亚洲第一网站男人都懂 | 未满小14洗澡无码视频网站 | 国产综合久久久久鬼色 | 亚洲国产精品无码久久久久高潮 | 亚洲人成人无码网www国产 | 久久无码专区国产精品s | 强开小婷嫩苞又嫩又紧视频 | 图片区 小说区 区 亚洲五月 | 国产精品亚洲а∨无码播放麻豆 | 中文字幕无码人妻少妇免费 | 无码人妻精品一区二区三区不卡 | 欧美午夜特黄aaaaaa片 | 亚洲精品成a人在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久亚洲中文字幕精品一区 | 亚洲中文字幕无码中文字在线 | 亚洲午夜久久久影院 | 天天摸天天碰天天添 | 精品偷拍一区二区三区在线看 | 欧洲熟妇精品视频 | 亚洲欧美国产精品专区久久 | 久久无码专区国产精品s | 国产精品亚洲а∨无码播放麻豆 | 国产成人无码一二三区视频 | 久久精品成人欧美大片 | 国产人妖乱国产精品人妖 | 2019午夜福利不卡片在线 | 成人欧美一区二区三区黑人 | 国产亚洲欧美在线专区 | 久久精品国产日本波多野结衣 | 四虎永久在线精品免费网址 | 国产艳妇av在线观看果冻传媒 | 国产手机在线αⅴ片无码观看 | 99国产精品白浆在线观看免费 | 亚洲国产精品久久人人爱 | 国语精品一区二区三区 | 国产在热线精品视频 | 国产又粗又硬又大爽黄老大爷视 | 东北女人啪啪对白 | 欧美国产日韩亚洲中文 | 精品国偷自产在线视频 | 亚洲国产成人av在线观看 | 精品日本一区二区三区在线观看 | 一个人看的www免费视频在线观看 | 久久久久亚洲精品男人的天堂 | 国产明星裸体无码xxxx视频 | 两性色午夜免费视频 | 高潮毛片无遮挡高清免费 | 亚洲国产日韩a在线播放 | 亚洲人成无码网www | 少妇高潮一区二区三区99 | 色综合久久网 | 妺妺窝人体色www婷婷 | 亚洲 a v无 码免 费 成 人 a v | 亚洲の无码国产の无码步美 | 亚洲欧洲无卡二区视頻 | 无码国产乱人伦偷精品视频 | 在线a亚洲视频播放在线观看 | 中文字幕无码乱人伦 | 欧美自拍另类欧美综合图片区 | 亚洲国产高清在线观看视频 | 精品一区二区三区波多野结衣 | 四虎影视成人永久免费观看视频 | 中文字幕精品av一区二区五区 | 奇米影视888欧美在线观看 | 亚洲 高清 成人 动漫 | 色狠狠av一区二区三区 | 亚拍精品一区二区三区探花 | 国产特级毛片aaaaaa高潮流水 | 色综合久久网 | 丰满妇女强制高潮18xxxx | 亚洲爆乳无码专区 | 亚洲综合伊人久久大杳蕉 | 久久国产36精品色熟妇 | 天天av天天av天天透 | 日日橹狠狠爱欧美视频 | 国产精品人人爽人人做我的可爱 | 精品亚洲韩国一区二区三区 | 久久久久久久久888 | 76少妇精品导航 | 亚洲高清偷拍一区二区三区 | 强伦人妻一区二区三区视频18 | 精品少妇爆乳无码av无码专区 | 精品久久久久久亚洲精品 | 亚洲人亚洲人成电影网站色 | 国产精品第一区揄拍无码 | 免费国产黄网站在线观看 | 久久婷婷五月综合色国产香蕉 | 国产香蕉尹人综合在线观看 | 色噜噜亚洲男人的天堂 | 青草视频在线播放 | 天堂无码人妻精品一区二区三区 | 老太婆性杂交欧美肥老太 | 狠狠综合久久久久综合网 | 成人精品一区二区三区中文字幕 | 水蜜桃亚洲一二三四在线 | 国产成人综合美国十次 | 夜精品a片一区二区三区无码白浆 | 特黄特色大片免费播放器图片 | 我要看www免费看插插视频 | 伊人久久婷婷五月综合97色 | 少妇高潮一区二区三区99 | 精品国产青草久久久久福利 | 国产两女互慰高潮视频在线观看 | 性欧美videos高清精品 | 色欲av亚洲一区无码少妇 | 国产成人精品视频ⅴa片软件竹菊 | 色欲人妻aaaaaaa无码 | 四虎国产精品一区二区 | 少妇激情av一区二区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亚洲精品久久久ai换 | 国产亚洲人成在线播放 | 欧美丰满少妇xxxx性 | 正在播放老肥熟妇露脸 | 日本精品人妻无码免费大全 | 国产成人亚洲综合无码 | 欧美日韩人成综合在线播放 | 欧美丰满老熟妇xxxxx性 | 日本va欧美va欧美va精品 | 精品一区二区不卡无码av | 亚洲色欲色欲天天天www | 性欧美熟妇videofreesex | 波多野42部无码喷潮在线 | 国产亚洲人成在线播放 | 综合激情五月综合激情五月激情1 | 大屁股大乳丰满人妻 | 久久精品国产精品国产精品污 | 精品国产一区二区三区av 性色 | 玩弄少妇高潮ⅹxxxyw | 中文字幕av伊人av无码av | 亚洲日韩av一区二区三区四区 | 国产午夜手机精彩视频 | 久久午夜无码鲁丝片午夜精品 | 国产乱码精品一品二品 | 精品国产精品久久一区免费式 | 未满小14洗澡无码视频网站 | 麻豆精产国品 | 国产精品.xx视频.xxtv | 亚洲の无码国产の无码步美 | 精品欧洲av无码一区二区三区 | 国产乱码精品一品二品 | 一本大道伊人av久久综合 | 中文字幕av无码一区二区三区电影 | 精品国产一区二区三区av 性色 | 午夜精品久久久内射近拍高清 | 牲欲强的熟妇农村老妇女 | 少女韩国电视剧在线观看完整 | 国产成人人人97超碰超爽8 | 亚洲成色在线综合网站 | 亚洲欧美综合区丁香五月小说 | 久久亚洲中文字幕无码 | 国产亚洲精品久久久久久大师 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 午夜嘿嘿嘿影院 | 亚洲欧美综合区丁香五月小说 | 亚洲综合久久一区二区 | 精品国产乱码久久久久乱码 | 国产色视频一区二区三区 | 国产精品.xx视频.xxtv | 久久综合久久自在自线精品自 | 亚洲精品无码人妻无码 | 激情国产av做激情国产爱 | 久久久久av无码免费网 | 久久精品人妻少妇一区二区三区 | 99久久人妻精品免费一区 | 亚洲 a v无 码免 费 成 人 a v | 无码人妻少妇伦在线电影 | 久久亚洲日韩精品一区二区三区 | 老熟妇仑乱视频一区二区 | 在教室伦流澡到高潮hnp视频 | 97精品国产97久久久久久免费 | 中国女人内谢69xxxxxa片 | 免费人成在线观看网站 | 激情综合激情五月俺也去 | 亚洲国产av精品一区二区蜜芽 | av香港经典三级级 在线 | 亚洲欧洲无卡二区视頻 | 国产精品人人爽人人做我的可爱 | 国产亚洲日韩欧美另类第八页 | 久久综合狠狠综合久久综合88 | 撕开奶罩揉吮奶头视频 | 亚洲乱码中文字幕在线 | 色综合天天综合狠狠爱 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产人成高清在线视频99最全资源 | 人妻熟女一区 | 中文字幕 亚洲精品 第1页 | 一个人免费观看的www视频 | 成人精品一区二区三区中文字幕 | 亚洲爆乳大丰满无码专区 | 六十路熟妇乱子伦 | 天天躁夜夜躁狠狠是什么心态 | 国产精品资源一区二区 | 成年美女黄网站色大免费全看 | 精品国产精品久久一区免费式 | 亚洲毛片av日韩av无码 | 国产精品亚洲lv粉色 | 亚洲欧美国产精品久久 | 狂野欧美性猛xxxx乱大交 | 国产成人无码专区 | 国产超碰人人爽人人做人人添 | 亚洲精品久久久久久久久久久 | 欧美精品无码一区二区三区 | 国产免费无码一区二区视频 | 欧洲vodafone精品性 | 中文字幕无码视频专区 | 午夜肉伦伦影院 | 免费视频欧美无人区码 | 成人精品一区二区三区中文字幕 | 99久久久国产精品无码免费 | 黑人粗大猛烈进出高潮视频 | 色窝窝无码一区二区三区色欲 | 牛和人交xxxx欧美 | 无人区乱码一区二区三区 | 国产精品高潮呻吟av久久 | 中文字幕无码热在线视频 | 日韩精品无码一本二本三本色 | 88国产精品欧美一区二区三区 | 免费看少妇作爱视频 | 久久久久成人精品免费播放动漫 | 人妻无码久久精品人妻 | 人人妻人人澡人人爽人人精品 | 无码av最新清无码专区吞精 | 亚洲成av人综合在线观看 | 国产成人精品优优av | 98国产精品综合一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 国产精品国产自线拍免费软件 | 在线天堂新版最新版在线8 | 亚洲精品中文字幕乱码 | 亚洲熟女一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 亚洲精品国产精品乱码不卡 | 国产精品久久久久久久影院 | 四虎4hu永久免费 | 双乳奶水饱满少妇呻吟 | 国产亚洲欧美日韩亚洲中文色 | 图片小说视频一区二区 | 成人无码视频免费播放 | 亚洲国产精品毛片av不卡在线 | 国产av无码专区亚洲awww | 国产热a欧美热a在线视频 | 国产av剧情md精品麻豆 | 国产精品第一国产精品 | 精品国精品国产自在久国产87 | 一本久道高清无码视频 | 3d动漫精品啪啪一区二区中 | 国精品人妻无码一区二区三区蜜柚 | 好屌草这里只有精品 | 夜夜高潮次次欢爽av女 | 天天摸天天透天天添 | 国产福利视频一区二区 | 久久亚洲国产成人精品性色 | 精品无码国产自产拍在线观看蜜 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲精品国产精品乱码视色 | 免费乱码人妻系列无码专区 | 波多野结衣乳巨码无在线观看 | 亚洲中文字幕无码一久久区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成人一在线视频日韩国产 | 国产精品久久久一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲精品一区二区三区在线观看 | 中文字幕无码av波多野吉衣 | 国产精品内射视频免费 | 天堂久久天堂av色综合 | 精品午夜福利在线观看 | 波多野结衣aⅴ在线 | 精品成人av一区二区三区 | 久久精品99久久香蕉国产色戒 | 亚洲s色大片在线观看 | 人妻少妇精品无码专区二区 | 国产午夜无码视频在线观看 | 最新国产乱人伦偷精品免费网站 | 欧美 丝袜 自拍 制服 另类 | 国产两女互慰高潮视频在线观看 | 少妇被粗大的猛进出69影院 | 中文字幕无码热在线视频 | 日韩av无码中文无码电影 | 男人的天堂av网站 | 久久久精品人妻久久影视 | 久久久久免费看成人影片 | 亚洲成av人在线观看网址 | 国产成人综合在线女婷五月99播放 | 日韩人妻系列无码专区 | 台湾无码一区二区 | 牲欲强的熟妇农村老妇女视频 | 国产手机在线αⅴ片无码观看 | 乱人伦人妻中文字幕无码 | 一本久道久久综合狠狠爱 | 波多野结衣乳巨码无在线观看 | 最新国产麻豆aⅴ精品无码 | 中文久久乱码一区二区 | 国产亚洲精品久久久久久大师 | 色欲久久久天天天综合网精品 | 伊人色综合久久天天小片 | 无人区乱码一区二区三区 | 国产人妻久久精品二区三区老狼 | 一区二区三区乱码在线 | 欧洲 | 又色又爽又黄的美女裸体网站 | 精品久久久久香蕉网 | 国产真实乱对白精彩久久 | 1000部啪啪未满十八勿入下载 | 丰满少妇熟乱xxxxx视频 | 波多野结衣高清一区二区三区 | 中文毛片无遮挡高清免费 | 97久久精品无码一区二区 | 欧美精品一区二区精品久久 | 女人色极品影院 | 午夜精品一区二区三区的区别 | 九月婷婷人人澡人人添人人爽 | 性欧美videos高清精品 | 国产熟妇高潮叫床视频播放 | 欧美日韩久久久精品a片 | 中文字幕乱妇无码av在线 | 日本大香伊一区二区三区 | 久久精品国产日本波多野结衣 | 欧美精品无码一区二区三区 | 水蜜桃亚洲一二三四在线 | 国产精品久久久久久亚洲毛片 | aa片在线观看视频在线播放 | 特级做a爰片毛片免费69 | 亚洲中文无码av永久不收费 | 亚洲自偷自偷在线制服 | 午夜福利试看120秒体验区 | 无码人妻出轨黑人中文字幕 | 国产av无码专区亚洲awww | 午夜福利一区二区三区在线观看 | 国内老熟妇对白xxxxhd | 欧美三级a做爰在线观看 | 无码中文字幕色专区 | 澳门永久av免费网站 | 亚洲精品久久久久avwww潮水 | 熟妇人妻中文av无码 | 欧美精品国产综合久久 | 极品尤物被啪到呻吟喷水 | 欧美亚洲国产一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 国色天香社区在线视频 | 欧美精品免费观看二区 | 永久免费观看美女裸体的网站 | 午夜精品一区二区三区的区别 | 天堂а√在线地址中文在线 | 国产精品久久久久9999小说 | 日本饥渴人妻欲求不满 | 在线观看免费人成视频 | 牲交欧美兽交欧美 | 高潮毛片无遮挡高清免费视频 | 亚洲精品午夜无码电影网 | 欧美性猛交xxxx富婆 | 久久久精品456亚洲影院 | 久久久精品456亚洲影院 | 国内少妇偷人精品视频免费 | 亚洲国产欧美日韩精品一区二区三区 | 国产亚洲视频中文字幕97精品 | 精品国产国产综合精品 | 少妇被黑人到高潮喷出白浆 | 婷婷丁香六月激情综合啪 | 亚洲另类伦春色综合小说 | 久久精品中文闷骚内射 | 亚洲熟女一区二区三区 | 国产xxx69麻豆国语对白 | 人人妻人人澡人人爽欧美一区 | 亚洲精品一区二区三区在线观看 | 四虎永久在线精品免费网址 | 欧美肥老太牲交大战 | 中文字幕人妻丝袜二区 | 亚洲一区二区观看播放 | 成人亚洲精品久久久久 | 日产精品99久久久久久 | 狂野欧美性猛xxxx乱大交 | www国产精品内射老师 | 少妇厨房愉情理9仑片视频 | 一本无码人妻在中文字幕免费 | 亚洲欧美日韩成人高清在线一区 | 无遮无挡爽爽免费视频 | 丰满护士巨好爽好大乳 | 亚洲国产欧美在线成人 | 300部国产真实乱 | 亚洲s色大片在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品中文字幕 | 99久久久无码国产精品免费 | 爆乳一区二区三区无码 | 亚洲小说图区综合在线 | 亚洲国产精品毛片av不卡在线 | 国产精品亚洲lv粉色 | 青青草原综合久久大伊人精品 | 国产亚洲tv在线观看 | 色妞www精品免费视频 | 国产偷国产偷精品高清尤物 | 伊人久久大香线蕉午夜 | 国产又粗又硬又大爽黄老大爷视 | 国产人妻精品午夜福利免费 | 青青青手机频在线观看 | 国产三级精品三级男人的天堂 | 国产亚洲日韩欧美另类第八页 | 国产真实乱对白精彩久久 | 成人无码视频免费播放 | 少妇的肉体aa片免费 | 日产精品99久久久久久 | 曰韩少妇内射免费播放 | 免费无码午夜福利片69 | 成人精品一区二区三区中文字幕 | 欧美性猛交内射兽交老熟妇 | 99久久精品午夜一区二区 | 好爽又高潮了毛片免费下载 | 亚洲日韩乱码中文无码蜜桃臀网站 | 免费国产成人高清在线观看网站 | www国产亚洲精品久久久日本 | 亚洲成色在线综合网站 | 97无码免费人妻超级碰碰夜夜 | 日韩人妻无码一区二区三区久久99 |