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

  • 相关阅读:
    LeetCode-034-在排序数组中查找元素的第一个和最后一个位置
    LeetCode-033-搜索旋转排序数组
    [leetcode]22. Generate Parentheses生成括号
    [leetcode]19. Remove Nth Node From End of List删除链表倒数第N个节点
    [leetcode]13. Roman to Integer罗马数字转整数
    [leetcode]12. Integer to Roman整数转罗马数字
    [leetcode]16. 3Sum Closest最接近的三数之和
    [leetcode]11. Container With Most Water存水最多的容器
    [leetcode]14. Longest Common Prefix 最长公共前缀
    [leetcode]9. Palindrome Number 回文数
  • 原文地址:https://www.cnblogs.com/nayitian/p/2918841.html
Copyright © 2020-2023  润新知