zoukankan      html  css  js  c++  java
  • Solr入门之(5)配置文件schema.xml

    该配置文件中的标签:<fileTypes>、<fields>、<uniqueKey>、<copyField>


     fieldType说明

    标签types中定义了field可以使用的类型,类型定义中可以指定document中字段的常用属性及分词规则
    solr中提供了多个预定义的fieldType,另外用户也可以自定义fieldType(比如中文分词的配置)。

    一、fieldType常用属性

    A、name:    字段类型名    
    B、class:    java类名    
    C、indexed:    缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。    
    D、stored:    缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。    
    E、sortMissingLast:    指没有该指定字段数据的document排在有该指定字段数据的document的后面    
    F、sortMissingFirst:    指没有该指定字段数据的document排在有该指定字段数据的document的前面    
    G、omitNorms:    字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。    
    H、termVectors:    如果字段被用来做more like this 和highlight的特性时应设置为true。    
    I、compressed:    字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。    
    J、multiValued:    字段多于一个值的时候,可设置为true。详细说明参见:http://blog.csdn.net/alen1985/article/details/8538942
    K、positionIncrementGap:    和multiValued一起使用,设置多个值之间的虚拟空白的数量   

    二、fieldType子标签analyzer

      定义该类型字段的分词规则、过滤规则等。type:index/query。
      A、tokenizer:指定该类型的文本分词器,如何切分为tokens。
      B、filter:过滤器,常用的有停用词、同义词、大小写等过滤。可以定义多个。

    三、fileType示例

    <types>
          <!--
              string类型不分词,但是索引、存储。支持doc values,但是要保证该field是单值并且该field有值。
          -->
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    
        <!-- boolean type: "true" or "false" -->
        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> 
    
        <!--
          默认的数字类型,如果想要更快的范围查询,考虑使用tint/tfloat/tlong/tdouble类型.
          支持doc values,但是要保证该field是单值并且该field有值。
        -->
        <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
        <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
        <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
    
        <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
        <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
        <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
        <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
    
        <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    
        <!-- A Trie based date field for faster date range queries and date faceting. -->
        <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
    
    
        <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
        <fieldtype name="binary" class="solr.BinaryField"/>
    
        <fieldType name="pint" class="solr.IntField"/>
        <fieldType name="plong" class="solr.LongField"/>
        <fieldType name="pfloat" class="solr.FloatField"/>
        <fieldType name="pdouble" class="solr.DoubleField"/>
        <fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
    
        <!-- 只按空格分词的分词器 -->
        <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
          <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          </analyzer>
        </fieldType>
    
        <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_en" class="solr.TextField" positionIncrementGap="100">
          <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <!-- in this example, we will only use synonyms at query time
            <filter class="solr.SynonymFilterFactory" 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 class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    enablePositionIncrements="true"
                    />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
            <filter class="solr.EnglishMinimalStemFilterFactory"/>
        -->
            <filter class="solr.PorterStemFilterFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    enablePositionIncrements="true"
                    />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
            <filter class="solr.EnglishMinimalStemFilterFactory"/>
        -->
            <filter class="solr.PorterStemFilterFactory"/>
          </analyzer>
        </fieldType>
    
     </types>

       其余详细请参照solr提供的默认schema.xml文件,solr中提供了许多预制的类型。


     fields标签说明

    fields中有两种字段定义方式:field和dynamicField。此两种方式的区别就是绝对匹配和模糊匹配,其属性相同。
    一、field和dynamicField的常用属性

    A、name:     必须定义。 - 字段的名称   
    B、class:    必须定义。 - 只能引用fieldTypes中定义的fieldType。   
    C、indexed:    缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。    
    D、stored:    缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。    
    E、sortMissingLast:    指没有该指定字段数据的document排在有该指定字段数据的document的后面    
    F、sortMissingFirst:    指没有该指定字段数据的document排在有该指定字段数据的document的前面    
    G、omitNorms:    字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。    
    H、termVectors:    如果字段被用来做more like this 和highlight的特性时应设置为true。    
    I、compressed:    字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。    
    J、multiValued:    字段多于一个值的时候,可设置为true。详细说明参见:http://blog.csdn.net/alen1985/article/details/8538942
    K、positionIncrementGap:    和multiValued一起使用,设置多个值之间的虚拟空白的数量   
    L、docValues: 默认[true]。是否使用doc values. doc values 在 facet、group、sort和function queries时很有用。当前只支持StrField、UUIDField、所有的Trie*Fields。
    M、omitNorms: 可以通过将omitNorms=“true”来减少indexed fields数量增加所带来的影响。
    N、termVectors: 默认[false]。是否保存该字段的term vector。当使用MoreLikeThis时,为了有比较的效果,应该保存。
    O、termPositions: 是否保存term vector的位置信息,如果保持会增加存储的消耗。效果详见下图。
    P、termOffsets: 是否保存term vector的偏移信息。
    Q、required: 必选。当该值不存在时抛出异常。
    R、default: 默认值。

     

    二、动态字段说明

    动态字段(Dynamic fields)允许 solr 索引没有在 schema 中明确定义的字段。这个在忘记定义一些字段时很有用。动态字段可以让系统更灵活,通用性更强。
    动态字段和成规字段类似,除了它名字中包含一个通配符外,在索引文档时,一个字段如果在常规字段中没有匹配时,将到动态字段中匹配。
    假设schema中定义了一个叫*_i的动态动态字段,如果要索引一个叫 cost_i 的字段,但是 schema 中不存在 cost_i 的字段,这样 cost_i  将被索引到 *_i 字段中。
    动态字段也是定义在 schema.xml 文件中,和其他字段一样,它也有个名词,字段类型,和属性。
    三、schema.xml示例
     <fields>
       <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
       <field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
       <field name="name" type="text_general" indexed="true" stored="true"/>
       <field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>
       <field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
       <field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
       <field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
       <field name="weight" type="float" indexed="true" stored="true"/>
       <field name="price"  type="float" indexed="true" stored="true"/>
       <field name="popularity" type="int" indexed="true" stored="true" />
       <field name="inStock" type="boolean" indexed="true" stored="true" />
       <field name="store" type="location" indexed="true" stored="true"/>
    
        <!--动态字段-->
       <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
       <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
       <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
     </fields>

    uniqueKey

    相当于数据库中主键的定义。
    <uniqueKey>id</uniqueKey>


    copyField说明

      对于查询来说,如果查询字段要来自多个字段,一种选择是使用CopyField,化多个字段为一个字段,缺点是不能区分各个字段的重要度差别。比如文章的标题和摘要,标题就要比摘要重要性更强,如果有这方面的要求,可以选择查询多个字段的做法。

    CopyField示例:

    <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"/>
    <copyField source="manu" dest="manu_exact"/>

     

  • 相关阅读:
    react 入坑笔记(五)
    练习
    高级指令
    进阶指令
    基础指令
    VMware 备份操作系统
    Ubuntu 用户的切换
    形态学转换
    图像模糊
    域名拆分 tld
  • 原文地址:https://www.cnblogs.com/tq03/p/3604604.html
Copyright © 2011-2022 走看看