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"的具体配置。本项目中标题、内容等字段需要使用此类型。

posted @ 2013-02-20 15:57  那些年的事儿  阅读(1983)  评论(0编辑  收藏  举报