在 Solr 中,使用一個或多個 Document 來構建索引。Document 包括一個或多個 Field。Field 包括名稱、內容以及告訴 Solr 如何處理內容的元數據。java
例如,Field 能夠包含字符串、數字、布爾值或者日期,也能夠包含你想添加的任何類型,只需用在solr的配置文件中進行相應的配置便可。Field 可使用大量的選項來描述,這些選項告訴 Solr 在索引和搜索期間如何處理內容。markdown
下面來挨個詳細介紹下這些屬性的含義。ui
一、模式配置Schema.xml
schema.xml這個配置文件能夠在你下載solr包的安裝解壓目錄的\solr\example\solr\collection1\conf中找到,也能夠在咱們上篇講到的solrhome\mycore\conf中找到,它就是solr模式關聯的文件。打開這個配置文件,你會發現有詳細的註釋。this
模式組織主要分爲三個重要配置。url
二、types 部分spa
fieldType 是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是添加到索引中的xml文件屬性中的類型,如int、text、date等..net
<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>
參數說明:code
屬性 | 描述 |
---|---|
name | 標識而已 |
class | 和其餘屬性決定了這個fieldType的實際行爲。 |
sortMissingLast | 設置成true沒有該field的數據排在有該field的數據以後,而無論請求時的排序規則, 默認是設置成false。 |
sortMissingFirst | 跟上面倒過來唄。 默認是設置成false |
analyzer | 字段類型指定的分詞器 |
type | 當前分詞用用於的操做,index表明生成索引時使用的分詞器,query表明在查詢時使用的分詞器 |
tokenizer | 分詞器類 |
filter | 分詞後應用的過濾器 過濾器調用順序和配置相同. |
words=」stopwords.txt」 | 用來配置中止詞的,stopwords.txt通常與schema.xml在同一個目錄,什麼叫中止詞呢,好比’在’、’的’、’了’等等這類在搜索時沒有實際意義的字詞,咱們在分詞的時候會忽略掉這些。 |
synonyms=」synonyms.txt」 | 是用來配置同義詞的,好比搜索’裙子’、’羣’,都會搜出裙子相關產品,搜’襪’,’襪子’就會搜出襪子相關產品大體就是這個意思了。 |
三、fileds 部分orm
filed是你添加到索引文件中出現的屬性名稱,也就是前文介紹的,select後面跟着的字段名,而聲明類型就須要用到上面的typesxml
<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" /> <copyField source="content" dest="pinyin"/> <copyField source="content" dest="text"/> <copyField source="pinyin" dest="text"/>
屬性 | 描述 |
---|---|
field | 固定的字段設置 |
dynamicField | 動態的字段設置,用於後期自定義字段,*號通配符.例如: test_i就是int類型的動態字段. |
copyField | 通常用於檢索時用的字段這樣就只對這一個字段進行索引分詞就好了copyField的dest字段若是有多個source必定要設置multiValued=true,不然會報錯的 |
copyField就引出了solr的一個全文檢索的概念,若是我要實現一個搜索,而我要搜索的屬性有不少個那麼應該使用以下配置方法:
<!-- 關鍵字搜索 --> <field name="keyword" type="text_general" indexed="true" stored="false" multiValued="true"/> <copyField source="seoTitle" dest="keyword"/> <copyField source="title" dest="keyword"/> <copyField source="subTitle" dest="keyword"/> <copyField source="shopName" dest="keyword"/> <copyField source="seoKeywords" dest="keyword"/> <copyField source="category_name_*" dest="keyword"/> <copyField source="descriptionForSearch" dest="keyword"/>
此時keyword的值就至關於包含了seoTitle、title、subTitle、shopName、seoKeywords、category_name_*、descriptionForSearch的全部內容。
若是這裏不理解,能夠看下這篇帖子裏面介紹的概念:全文索引概念
另外這裏你們必定會好奇,keyword使用的type=」text_general」會達到什麼效果,其實很簡單,text_general是我在上面定義的分詞器,可以根據必定的格式分詞,利於搜索,若是不實用text_general,那麼就達不到全文檢索,模糊搜索的目的了。
字段屬性說明:
屬性 | 描述 |
---|---|
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_ 是一個特殊字段,不能刪除,是記錄當前索引版本號的.
四、其餘配置
uniqueKey:惟一鍵,這裏配置的是上面出現的fileds,通常是id、url等不重複的。在更新、刪除的時候能夠用到。
defaultSearchField:默認搜索屬性,如q=solr就是默認的搜索那個字段
solrQueryParser:查詢轉換模式,是而且仍是或者(AND/OR必須大寫)