Solr4:设计数据结构,就是配置schema.xml
1. 概述
正常数据结构一个是需要考虑中文分词,二个是考虑是否索引,是否分词,是否存储等等。
下面的示范用到了三种类型的数据:
1). 字段需要分词、需要索引、需要存储,如:网页中的标题、内容等字段。
2). 字段需要索引,但不需要分词,需要存储,如:网页的发布时间等内容。
3). 字段不需要索引,不需要分词,但需要存储,如:引用的图片位置。
不存在不需要索引、也不需要分词,也不需要存储的字段,因为这样的字段在Lucene中无意义。
2. 示范配置
<?xml version="1.0" ?> <schema name="news" version="1.1"> <fields> <!--下面三个字段需要分词,索引,存储 --> <!-- 发布者 --> <field name="webUser" type="text_mm4j" indexed="true" stored="true"/> <!-- 标题 --> <field name="webTitle" type="text_mm4j" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> <!-- 内容 --> <field name="webContent" type="text_mm4j" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> <!--下面需要索引,不分词,需要存储 --> <!-- 来源ID --> <field name="webId" type="int" indexed="true" stored="true"/> <!-- 主键ObjectID --> <field name="objectId" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <!-- 论坛类型(txt/pic/video) --> <field name="webType" type="string" indexed="true" stored="true"/> <!-- 发布时间 --> <field name="webTime" type="date" indexed="true" stored="true"/> <!--下面信息仅存储 --> <!-- 网站描述 --> <field name="webCommit" type="string" indexed="false" stored="true"/> <!-- 网址 --> <field name="webUrl" type="string" indexed="false" stored="true"/> <!-- 生成网页地址 --> <field name="webHtml" type="string" indexed="false" stored="true"/> <!-- 视频 --> <field name="webVideo" type="string" indexed="false" stored="true"/> <!-- 图片 --> <field name="webImage" type="string" indexed="false" stored="true" multiValued="true"/> <!--下面信息为区别数据类型,索引,不分词,存储 --> <!-- 索引类型,bbs/news/blog --> <field name="indexType" type="string" indexed="true" stored="true"/> <!-- 拷贝字段 ,索引不存储 --> <field name="text" type="text_mm4j" indexed="true" stored="false" multiValued="true"/> <field name="_version_" type="long" indexed="true" stored="true"/> </fields> <copyField source="webUser" dest="text"/> <copyField source="webTitle" dest="text"/> <copyField source="webContent" dest="text"/> <uniqueKey>objectId</uniqueKey> <defaultSearchField>text</defaultSearchField> <solrQueryParser defaultOperator="OR"/> <types> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="date" class="solr.TrieDateField" 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" /> <!-- in this example, we will only use synonyms at query time <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> --> <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_ik" class="solr.TextField"> <analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <fieldType name="text_mm4j" class="solr.TextField" > <analyzer type="index"> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="C:/solr/mm4jdic"/> <!-- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/usr/local/solr/mm4jdic"/> --> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> </analyzer> <analyzer type="query"> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="C:/solr/mm4jdic"/> <!-- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/usr/local/solr/mm4jdic"/> --> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> </analyzer> </fieldType> </types> </schema>
注意:schema.xml文件中的主键,最好是string类型的,而不是int类型的(哪怕数据库中是int类型);否则在启动tomcat时有可能报错(Error initializing QueryElevationComponent?)。
3. 备注
termVectors="true" termPositions="true" termOffsets="true"
这几项参数是在项目中使用到FastVectorHighlighter时需要配置的,如果没有使用FastVectorHighlighter的话,可以忽略这些参数。
multiValued="true"
此项参数为是否允许多值,主键不允许多值。但图片等允许多值,另拷贝字段(如:text字段)默认也是多值。
type="string"
string类型的字段默认不分词,当作整体来看。
type="text_mm4j"
text_mm4j类型的即是中文分词组件,参考types下面关于name="text_mm4j"的具体配置。本项目中标题、内容等字段需要使用此类型。