schema.xml是Solr一个配置文件,它包含了你的文档全部的字段,以及当文档被加入索引或查询字段时,这些字段是如何被处理的。这个文件被存储在Solr主文件夹下的conf目录下,默认的路径./solr/conf/schema.xml,也能够是Solr webapp的类加载器所能肯定的路径。在下载的Solr包里,有一个schema的样例文件,用户能够从那个文件出发,来观察如何编写本身的Schema.xml。 ##type节点 先来看下type节点,这里面定义FieldType子节点,包括name、class、positionIncrementGap等一些参数。必选参数:html
其余可选的属性:web
在配置中,string类型的class是solr.StrField,而这个字段是不会被分析存储的,也就是说不会被分词。apache
而对于文章或者长文原本说,咱们必须对其进行分词才能保证搜索某些字段时可以给出正确的结果。这时咱们就能够用到另一个class,solr.TextField。它容许用户经过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter) 。app
一个标准的分词:webapp
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.LowerCaseFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.LowerCaseFilterFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> </analyzer> </fieldType>
分词用的依旧是fieldType,为的是在下面的field中可以用到。有两个analyzer,一个是index,一个是query,index是针对于全部,query是针对于搜索。code
tokenizer节点固然就是对应分析链中的起点Tokenizer。接下来串联了2个filter,分别是solr.StopFilterFactory,solr.LowerCaseFilterFactory。stop word filter就是把那些the、 of、 on之类的词从token中去除掉,因为这类词在文档中出现的频率很是高,而对文档的特征又没什么影响,因此这类词对查询没什么意义。Lower case filter的做用是将全部的token转换成小写,也就是在最终的index中保存的都是小写orm
你也能够定义一个analyzer,例如使用mmseg4j进行中文分词:xml
<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" /> </analyzer> </fieldType>
filed节点用于定义数据源字段所使用的搜索类型与相关设置。含有如下属性htm
举例:blog
<field name="manu_exact" type="string" indexed="false" stored="false" docValues="true" />
若是咱们的搜索须要搜索多个字段该怎么办呢?这时候,咱们就可使用copyField。代码以下:
<copyField source="name" dest="all" maxChars="30000"/> <copyField source="address" dest="all" maxChars="30000"/>
做用:
咱们将全部的中文分词字段所有拷贝至all中,当咱们进行全文检索是,只用搜索all字段就OK了。
其包含属性:
注意,这里的目标字段必须支持多值,最好不要存储,由于他只是作搜索。indexed为true,stored为false。
copyField节点和field节点都在fields节点以内。
动态字段,没有具体名称的字段,用dynamicField字段
如:name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i、 school_i
<dynamicField name="*_i" type="int" indexed="true" stored="true"/> <dynamicField name="*_s" type="string" indexed="true" stored="true"/> <dynamicField name="*_l" type="long" indexed="true" stored="true"/>
solr必须设置一个惟一字段,常设置为id,此惟一一段有uniqueKey节点指定。
例如:
<uniqueKey>id</uniqueKey>
默认搜索的字段,咱们已经将须要搜索的字段拷贝至all字段了,在这里设为all便可。
<defaultSearchField>all</defaultSearchField>
默认搜索操做符参数,及搜索短语间的逻辑,用AND增长准确率,用OR增长覆盖面,建议用AND,也可在搜索语句中定义。例如搜索“手机 苹果”,使用AND默认搜索为“手机AND苹果“。
<solrQueryParser defaultOperator="OR"/>
Similarity式lucene中的一个类,用来在搜索过程当中对一个文档进行评分。该类能够作些修改以支持自定义的排序。在Solr4中,你能够为每个field配置一个不一样的similarity,你也能够在schema.xml中使用DefaultSimilarityFactory类配置一个全局的similarity。
你可使用默认的工厂类来建立一个实例,例如:
<similarity class="solr.DefaultSimilarityFactory"/>
你也可使用其余的工厂类,而后设置一些可选的初始化参数:
<similarity class="solr.DFRSimilarityFactory"> <str name="basicModel">P</str> <str name="afterEffect">L</str> <str name="normalization">H2</str> <float name="c">7</float> </similarity>
在Solr 4中,你能够为每个field配置:
<fieldType name="text_ib"> <analyzer/> <similarity class="solr.IBSimilarityFactory"> <str name="distribution">SPL</str> <str name="lambda">DF</str> <str name="normalization">H2</str> </similarity> </fieldType>
上面例子中,使用了DFRSimilarityFactory和IBSimilarityFactory,这里还有一些其余的实现类。在Solr 4.2中加入了SweetSpotSimilarityFactory。其余还有:BM25SimilarityFactory、SchemaSimilarityFactory等。 ##参考文章