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

  • 相关阅读:
    背包问题
    標準差、方差、正太分佈公式
    C#實現XML的增刪查改
    XML的基礎結構
    微信小程序入門學習資料鏈接
    微信小程序wxml無法實現頁面跳轉的問題
    088_jsp转成成servle所在的路径?
    075_jsp如何debug?
    028_Mybatis返回int类型为空时报错 attempted to return null from a method with a primitive return type (int)
    087_数据库类型
  • 原文地址:https://www.cnblogs.com/nayitian/p/2918841.html
Copyright © 2011-2022 走看看