(转)Solr笔记 Schema.xml和solrconfig.xml分析
现在我们开始研究载入的数据部分(importing data)
在正式开始前,我们先介绍一个存储了大量音乐媒体的网站http://musicbrainz.org ,
这里的数据都是免费的,一个大型开放社区提供。
MusicBrainz每天都提供一个数据快照(snapshot)的SQL文件,这些数据可以被导入PostgreSQL数据库中。
一、字段配置(schema)
schema.xml位于solr/conf/目录下,类似于数据表配置文件,
定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。
1、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。
name:就是这个FieldType的名称。
class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
view plaincopy to clipboardprint?
<schema name="example" version="1.2"> <types> <fieldType name="string" sortMissingLast="true" omitNorms="true"/> <fieldType name="boolean" sortMissingLast="true" omitNorms="true"/> <fieldtype name="binary" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> <fieldType name="float" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> <fieldType name="long" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> <fieldType name="double" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> ... </types> ... </schema>必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤,如下:
view plaincopy to clipboardprint?<fieldType name="text_ws" positionIncrementGap="100"> <analyzer> <tokenizer positionIncrementGap="100"> <analyzer type="index"><!--这个分词包是空格分词,在向索引库添加text类型的索引时,Solr会首先用空格进行分词
--> <tokenizer 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 ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> <filter language="English" protected="protwords.txt"/> </analyzer> <analyzer type="query"> <tokenizer synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> <filter language="English" protected="protwords.txt"/> </analyzer> </fieldType>2、再来看下fields节点内定义具体的字段(类似数据库的字段),含有以下属性:
view plaincopy to clipboardprint?<fields> <field name="id" type="integer" indexed="true" stored="true" required="true" /> <field name="name" type="text" indexed="true" stored="true" /> <field name="summary" type="text" indexed="true" stored="true" /> <field name="author" type="string" indexed="true" stored="true" /> <field name="date" type="date" indexed="false" stored="true" /> <field name="content" type="text" indexed="true" stored="false" /> <field name="keywords" type="keyword_text" indexed="true" stored="false" multiValued="true" /> <!--拷贝字段--> <field name="all" type="text" indexed="true" stored="false" multiValued="true"/> </fields>
view plaincopy to clipboardprint?<copyField source="name" dest="all"/> <copyField source="summary" dest="all"/>
view plaincopy to clipboardprint?<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"/> <dynamicField name="*_t" type="text" indexed="true" stored="true"/> <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> <dynamicField name="*_f" type="float" indexed="true" stored="true"/> <dynamicField name="*_d" type="double" indexed="true" stored="true"/> <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
<fieldType name="string" sortMissingLast="true" omitNorms="true" />
<fieldType name="text" positionIncrementGap="100">solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括 一个分词器(tokenizer)和多个过滤器(filter)
<tokenizer />
<filter generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" />
<filter synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<field name="id" type="string" indexed="true" stored="true" required="true" />
<copyField source="cat" dest="text" /> <copyField source="name" dest="text" /> <copyField source="manu" dest="text" /> <copyField source="features" dest="text" /> <copyField source="includes" dest="text" />在添加索引时,将所有被拷贝field(如cat)中的数据拷贝到text field中
<dynamicField name="*_i" type="int" indexed="true" stored="true" />
<dynamicField name="*" type="ignored" multiValued="true" />
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="OR" />