Solr主配置文件
schema.xml,在SolrCore的conf目錄下,它是Solr數據表配置文件,它定義了加入索引的數據的數據類型的。主要包括FieldTypes、Fields和其他的一些缺省設置。
fieldType
打開這個配置文件,我們可以看到許多fieldType標簽,string、int什么的,其中我們拿text_general來舉例分析:
1 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
2 <analyzer type="index">
3 <tokenizer class="solr.StandardTokenizerFactory"/>
4 <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
5 <filter class="solr.LowerCaseFilterFactory"/>
6 </analyzer>
7 <analyzer type="query">
8 <tokenizer class="solr.StandardTokenizerFactory"/>
9 <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
10 <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
11 <filter class="solr.LowerCaseFilterFactory"/>
12 </analyzer>
13 </fieldType>
FieldType子結點包括:name,class,positionIncrementGap等一些參數:
1、name:是這個FieldType的名稱
2、class:是Solr提供的包solr.TextField,solr.TextField允許用戶通過分析器來定制索引和查詢,分析器包括一個分詞器(tokenizer)和多個過濾器(filter)
3、positionIncrementGap:可選屬性,定義在同一個文檔中此類型數據的空白間隔,避免短語匹配錯誤,此值相當於Lucene的短語查詢設置slop值,根據經驗設置為100。
在FieldType定義的時候最重要的就是定義這個類型的數據在建立索引和進行查詢的時候要使用的分析器analyzer,包括
1、分詞和過濾索引分析器中:使用solr.StandardTokenizerFactory標准分詞器,solr.StopFilterFactory停用詞過濾器,solr.LowerCaseFilterFactory小寫過濾器。
2、搜索分析器中:使用solr.StandardTokenizerFactory標准分詞器,solr.StopFilterFactory停用詞過濾器,這里還用到了solr.SynonymFilterFactory同義詞過濾器。
field
在schema.xml中除了fieldType占有大量篇幅外,還有field,以下是一部分
1 <field name="name" type="text_general" indexed="true" stored="true"/>
2 <field name="features" type="text_general" indexed="true" stored="true"multiValued="true"/>
在fields結點內定義具體的Field,filed定義包括name,type(為之前定義過的各種FieldType),indexed(是否被索引),stored(是否被儲存),multiValued(是否存儲多個值)等屬性。
multiValued:該Field如果要存儲多個值時設置為true,solr允許一個Field存儲多個值,比如存儲一個用戶的好友id(多個),商品的圖片(多個,大圖和小圖),通過使用solr查詢要看出返回給客戶端是數組:
UniqueKey
Solr中默認定義唯一主鍵key為id域,Solr在刪除、更新索引時使用id域進行判斷,也可以自定義唯一主鍵。
1 <uniqueKey>id</uniqueKey>
copyField
copyField復制域,可以將多個Field復制到一個Field中,以便進行統一的檢索:
1 <copyField source="title" dest="text"/>
2 <copyField source="author" dest="text"/>
3 <copyField source="description" dest="text"/>
4 <copyField source="keywords" dest="text"/>
5 <copyField source="content" dest="text"/>
比如,輸入關鍵字搜索title標題內容content,定義title、content、text的域,根據關鍵字只搜索text域的內容就相當於搜索title和content,將title和content復制到text中。
dynamicField
動態字段就是不用指定具體的名稱,只要定義字段名稱的規則,例如定義一個 dynamicField,name為*_i,定義它的type為text,那么在使用這個字段的時候,任何以_i結尾的字段都被認為是符合這個定義的,例如:name_i,gender_i,school_i等。
配置中文分詞器
網上下載好相應版本的IKAnalyzer,拷貝IKAnalyzer的文件到Web容器下,以tomcat為例,Solr目錄中將IKAnalyzer2012FF_u1.jar拷貝到 Tomcat的webapps/solr/WEB-INF/lib 下。在Tomcat的webapps/solr/WEB-INF/下創建classes目錄,將IKAnalyzer.cfg.xml、stopword.dic ext.dic 復制到 Tomcat的webapps/solr/WEB-INF/classes,stopword.dic 和ext.dic必須保存成無BOM的utf-8類型(一般默認就這樣)。
IKAnalyzer.cfg.xml修改字典引用
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
3 <properties>
4 <comment>IK Analyzer 擴展配置</comment>
5 <!--用戶可以在這里配置自己的擴展字典 -->
6 <entry key="ext_dict">ext.dic;</entry>
7 <!--用戶可以在這里配置自己的擴展停止詞字典-->
8 <entry key="ext_stopwords">stopword.dic;</entry>
9 </properties>
修改Solr的schema.xml文件,添加FieldType:
1 <!-- IKAnalyzer-->
2 <fieldType name="text_ik" class="solr.TextField">
3 <analyzer type="index" isMaxWordLength="false"class="org.wltea.analyzer.lucene.IKAnalyzer"/>
4 <analyzer type="query" isMaxWordLength="true"class="org.wltea.analyzer.lucene.IKAnalyzer"/>
5 </fieldType>
solr配置文件中有的域我們才能進行update提交數據,不然插不進數據也便無法為這類數據建立索引。根據需求配置自定義域,這樣我們才能夠插入字段product_name。
1 <!--IKAnalyzer Field-->
2 <field name="product_name" type="text_ik" indexed="true" stored="true" />
未配置product_name前插入數據:
配置域后,就能插product_name了:
接下來測試中文分詞(),可流暢分詞,如果有需要,可以在ext.dic設置自定義詞匯。