schema配置文件

目录java

1、字段配置(schema)... 2web

一、type节点... 2数据库

二、fields节点... 4apache

三、拷贝字段... 4服务器

四、动态字段... 6网络

二. schema.xml文档注释中的信息... 6app

一、改进性能措施:... 6函数

二、schema名字... 6性能

三、filedType. 7ui

四、fields. 8

五、其余一些标签... 9

附录... 10

 

 

 

 

 

 

 

 

 

 

1、字段配置(schema)

schema.xml位于solr/conf/目录下,相似于数据表配置文件,

定义了加入索引的数据的数据类型,主要包括typefields和其余的一些缺省设置。

一、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。

  • name:就是这个FieldType的名称。
  • class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
<types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
    <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"/>
    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
    <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="text_general" class="solr.TextField" positionIncrementGap="100">
          <analyzer type="index">
                    <tokenizer class="solr.StandardTokenizerFactory" />
                    <filter class="solr.LowerCaseFilterFactory" />
          </analyzer>
          <analyzer type="query">
                    <tokenizer class="solr.StandardTokenizerFactory" />
                    <filter class="solr.LowerCaseFilterFactory" />
          </analyzer>
     </fieldType>
</types>

必要的时候fieldType还须要本身定义这个类型的数据在创建索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤,以下:

<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">  
  <analyzer>   
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
  </analyzer>   
</fieldType>   
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">   
  <analyzer type="index">   
    <!--这个分词包是空格分词,在向索引库添加text类型的索引时,Solr会首先用空格进行分词   
         而后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果,才会加入到索引库中以备查询。   
      注意:Solr的analysis包并无带支持中文的包,须要本身添加中文分词器,google下。     
     -->   
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
        <!-- 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="stopwords.txt"   
                enablePositionIncrements="true"   
                />   
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1"   
              generateNumberParts="1" catenateWords="1" catenateNumbers="1"   
              catenateAll="0" splitOnCaseChange="1"/>   
      <filter class="solr.LowerCaseFilterFactory"/>   
      <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
    </analyzer>   
    <analyzer type="query">   
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true"   
                                                                          expand="true"/>  
        <filter class="solr.StopFilterFactory"   
                ignoreCase="true"   
                words="stopwords.txt"   
                enablePositionIncrements="true"   
                />   
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>  
        <filter class="solr.LowerCaseFilterFactory"/>   
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
      </analyzer>   
</fieldType>  

二、再来看下fields节点内定义具体的字段(相似数据库的字段)

   含有如下属性:

  • name:字段名
  • type:以前定义过的各类FieldType
  • indexed:是否被索引
  • stored:是否被存储(若是不须要存储相应字段值,尽可能设为false)
  • multiValued:是否有多个值(对可能存在多值的字段尽可能设置为true,避免建索引时抛出错误)

三、建议创建一个拷贝字段,将全部的 全文本 字段复制到一个字段中,以便进行统一的检索:

<fields>
   <field name="_version_" type="long" indexed="true" stored="true"/>
   <field name="_type" type="int" stored="true" indexed="true"/>
   <field name="id" type="string" indexed="true" stored="true" required="true"/>
   <field name="website" type="string" indexed="true" stored="true"/>
   <field name="author" type="string" indexed="true" stored="true"/>
   <field name="editDate" type="long" indexed="true" stored="true"/>
   <!-- CAMPAIGN -->
   <field name="campaign_name" type="string" indexed="true" stored="true"/>
   <field name="campaign_startTime" type="long" indexed="true" stored="true"/>
   <field name="campaign_endTime" type="long" indexed="true" stored="true"/>
   <field name="campaign_isDeploy" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_active" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_isNewVisitor" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_isReturnVisitor" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_page" type="string" indexed="true" stored="true"/>
   <field name="campaign_page_url1" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_page_url2" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_page_url3" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_eleSelector" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_types" type="int" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="campaign_name" dest="campaign_search" maxChars="256" />
      <!-- RESOURCE -->
   <field name="resource_name" type="string" indexed="true" stored="true"/>
   <field name="resource_exclude" type="boolean" indexed="true" stored="true"/>
   <field name="resource_ruletype" type="int" indexed="true" stored="true"/>
   <field name="resource_value" type="string" indexed="true" stored="true"/>
   <field name="resource_page_url1" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_page_url2" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_page_url3" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="resource_name" dest="resource_search" maxChars="256" />
   <!-- TEMPLATE -->
   <field name="template_name" type="string" indexed="true" stored="true"/>
   <field name="template_type" type="int" indexed="true" stored="true"/>
   <field name="template_category" type="string" indexed="true" stored="true"/>
   <field name="template_active" type="boolean" indexed="true" stored="true"/>
   <field name="template_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="template_name" dest="template_search" maxChars="256" />
 </fields>
 
 <uniqueKey>id</uniqueKey>

以上代码是我从AdSystem三期项目中摘抄出来的配置文件, 其中uniqueKey为指定的ID字段,Solr根据此字段进行文档的更新操做.

 

 

 

 

四、动态字段,没有具体名称的字段,用dynamicField字段

如:name*_i,定义它的typeint,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i, school_i

<dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>  
<dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>  
<dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>  
<dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>  
<dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>  
<dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>  
<dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>  
<dynamicField name="*_dt" type="date"    indexed="true"  stored="true"/>  

 

二. schema.xml文档注释中的信息

一、为了改进性能,能够采起如下几种措施:

  • 将全部只用于搜索的,而不须要做为结果的field(特别是一些比较大的field)的stored设置为false
  • 将不须要被用于搜索的,而只是做为结果返回的field的indexed设置为false
  • 删除全部没必要要的copyField声明
  • 为了索引字段的最小化和搜索的效率,将全部的 text fields的index都设置成field,而后使用copyField将他们都复制到一个总的 text field上,而后对他进行搜索。
  • 为了最大化搜索效率,使用java编写的客户端与solr交互(使用流通讯)
  • 在服务器端运行JVM(省去网络通讯),使用尽量高的Log输出等级,减小日志量。

二、schema名字

<schema name="example" version="1.5">

  • name:标识这个schema的名字
  • version:如今版本是1.5

 

三、filedType

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
  • name:标识而已。
  • class和其余属性决定了这个fieldType的实际行为。(class以solr开始的,都是在org.appache.solr.analysis包下)

可选的属性:

  • sortMissingLast和sortMissingFirst两个属性是用在能够内在使用String排序的类型上(包括:string,boolean,sint,slong,sfloat,sdouble,pdate)。
  • sortMissingLast="true",没有该field的数据排在有该field的数据以后,而无论请求时的排序规则。
  • sortMissingFirst="true",跟上面倒过来呗。
  • 2个值默认是设置成false

StrField类型不被分析,而是被逐字地索引/存储。

StrField和TextField都有一个可选的属性“compressThreshold”,保证压缩到不小于一个大小(单位:char)

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">

solr.TextField 容许用户经过分析器来定制索引和查询,分析器包括 一个分词器(tokenizer)和多个过滤器(filter)

  • positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。

空格分词,精确匹配。

<tokenizer class="solr.WhitespaceTokenizerFactory" />

在分词和匹配时,考虑 "-"连字符,字母数字的界限,非字母数字字符,这样 "wifi"或"wi fi"都能匹配"Wi-Fi"。

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1"catenateAll="0" splitOnCaseChange="1" />

 

同义词

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

在禁用字(stopword)删除后,在短语间增长间隔

stopword:即在创建索引过程当中(创建索引和搜索)被忽略的词,好比is this等经常使用词。在conf/stopwords.txt维护。

<filterclass="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

四、fields

  • <field name="id" type="string" indexed="true" stored="true" required="true" />
  • name:标识而已。
  • type:先前定义的类型。
  • indexed:是否被用来创建索引(关系到搜索和排序)
  • stored:是否储存
  • compressed:[false],是否使用gzip压缩(只有TextField和StrField能够压缩)
  • mutiValued:是否包含多个值
  • omitNorms:是否忽略掉Norm,能够节省内存空间,只有全文本field和need an index-time boost的field须要norm。(具体没看懂,注释里有矛盾)
  • termVectors:[false],当设置true,会存储 term vector。当使用MoreLikeThis,用来做为类似词的field应该存储起来。
  • termPositions:存储 term vector中的地址信息,会消耗存储开销。
  • termOffsets:存储 term vector 的偏移量,会消耗存储开销。
  • default:若是没有属性须要修改,就能够用这个标识下。

 

<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="resource_name" type="string" indexed="true" stored="true"/>
<field name="resource_exclude" type="boolean" indexed="true" stored="true"/>
<field name="resource_ruletype" type="int" indexed="true" stored="true"/>
<field name="resource_search" type="text_general" indexed="true" stored="true"/>

 

 

一应俱全(有点夸张)的field,包含全部可搜索的text fields,经过copyField实现。

<field name="text" type="text" indexed="true" stored="false" multiValued="true" />
<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" />

在添加索引时,将全部被拷贝field(如cat)中的数据拷贝到text field中

做用:

  • 将多个field的数据放在一块儿同时搜索,提供速度
  • 将一个field的数据拷贝到另外一个,能够用2种不一样的方式来创建索引。
<dynamicField name="*_i" type="int" indexed="true" stored="true" />

若是一个field的名字没有匹配到,那么就会用动态field试图匹配定义的各类模式。

  • "*"只能出如今模式的最前和最后
  • 较长的模式会被先去作匹配
  • 若是2个模式同时匹配上,最早定义的优先
<dynamicField name="*" type="ignored" multiValued="true" />

若是经过上面的匹配都没找到,能够定义这个,而后定义个type,当String处理。(通常不会发生)

但若不定义,找不到匹配会报错。

五、其余一些标签

<uniqueKey>id</uniqueKey>

文档的惟一标识, 必须填写这个field(除非该field被标记required="false"),不然solr创建索引报错。

<defaultSearchField>text</defaultSearchField>

若是搜索参数中没有指定具体的field,那么这是默认的域。

<solrQueryParser defaultOperator="OR" />

配置搜索参数短语间的逻辑,能够是"AND|OR"。

 

附录

 

<?xml version="1.0" encoding="UTF-8" ?>

  ...

<!--  

这是Solrschema文件,应该命名为schema.xml,而且在solr homeconf目录下

(如,默认在./solr/conf/schema.xml.

 

 有关如何根据须要定制化该文件,请参照:

 http://wiki.apache.org/solr/SchemaXml  性能须知: 这里包含了不少实际应用不须要的可选项。 为改善性能,你能够:

  - 尽可能将全部仅用于搜索,而不用于实际返回的字段设置stored="false"

  - 尽可能将全部仅用于返回,而不用于搜索的字段设置indexed="false"

  - 去掉全部不须要的copyField 语句;

  - 为了达到最佳的索引大小和搜索性能,对全部的文本字段设置indexed="false"

    使用copyField将他们拷贝到整合字段”name="text"的字段中,使用整合字段进行搜索;

  - 使用server模式来运行JVM,同时将log级别调高, 避免输出全部请求的日志。

-->

 

<schema name="example" version="1.5">

  ...

 

 <fields>

   <!-- fields各个属性说明:

     name: 必须属性 - 字段名

     type: 必须属性 - <types>中定义的字段类型

     indexed: 若是字段须要被索引(用于搜索或排序),属性值设置为true

     stored: 若是字段内容须要被返回,值设置为true

     docValues: 若是这个字段应该有文档值(doc values),设置为true。文档值在门

           面搜索,分组,排序和函数查询中会很是有用。虽然不是必须的,并且会致使生成

           索引变大变慢,但这样设置会使索引加载更快,更加NRT友好,更高的内存使用效率。

           然而也有一些使用限制:目前仅支持StrField, UUIDField和全部 Trie*Fields,

           而且依赖字段类型, 可能要求字段为单值(single-valued)的,必须的或者有默认值。

     multiValued: 若是这个字段在每一个文档中可能包含多个值,设置为true

     termVectors: [false] 设置为true后,会保存所给字段的相关向量(vector

           当使用MoreLikeThis, 用于类似度判断的字段须要设置为stored来达到最佳性能.

     termPositions: 保存和向量相关的位置信息,会增长存储开销

     termOffsets: 保存 offset 和向量相关的信息,会增长存储开销

     required: 字段必须有值,不然会抛异常

     default: 在增长文档时,能够根据须要为字段设置一个默认值,防止为空

   -->

 

   <!-- 字段名由字母数字下划线组成,且不能以数字开头。两端为下划线的字段为保留字段,

      (_version_)

    -->

        

   <field name="id" type="string" indexed="true" stored="true"

           required="true" multiValued="false" />

 

   <field name="title" type="text_general" indexed="true"

           stored="true" multiValued="true"/>

   <field name="description" type="text_general" indexed="true" stored="true"/>

   <field name="author" type="text_general" indexed="true" stored="true"/>

   <field name="keywords" type="text_general" indexed="true" stored="true"/>

   <field name="category" type="text_general" indexed="true" stored="true"/>

   <field name="url" type="text_general" indexed="true" stored="true"/>

   <field name="last_modified" type="date" indexed="true" stored="true"/>

   <!-- 注意: 为了节省空间,这个字段默认不被索引, 因使用copyField被拷贝到了名为text的字段中

      。用于内容返回和高亮。搜索时使用text字段

   -->

   <field name="content" type="text_general" indexed="false"

           stored="true" multiValued="true"/>

   

   <!-- 整合字段(catchall field), 包含其余可搜索的字段 (经过copyField实现) -->

   <field name="text" type="text_general" indexed="true"

           stored="false" multiValued="true"/>

 

   <!-- 保留字段,不能删除,不然报错 -->

   <field name="_version_" type="long" indexed="true" stored="true"/>

   

 </fields>

 

 

 <!-- 文档的惟一标识,可理解为主键,除非标识为required="false", 不然值不能为空-->

 <uniqueKey>id</uniqueKey>

 

  <!-- 拷贝须要索引的字段到整合字段中  -->

   <copyField source="title" dest="text"/>

   <copyField source="author" dest="text"/>

   <copyField source="description" dest="text"/>

   <copyField source="keywords" dest="text"/>

   <copyField source="content" dest="text"/>

   <copyField source="url" dest="text"/>

 

  <types>

    <!-- 字段类型定义 -->

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

    <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="date" class="solr.TrieDateField" precisionStep="0"

        positionIncrementGap="0"/>

      ...

    <!-- Thai,泰语类型字段 -->

    <fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">

      <analyzer>

        <tokenizer class="solr.StandardTokenizerFactory"/>

        <filter class="solr.LowerCaseFilterFactory"/>

        <filter class="solr.ThaiWordFilterFactory"/>

        <filter class="solr.StopFilterFactory" ignoreCase="true"

            words="lang/stopwords_th.txt" />

      </analyzer>

    </fieldType>

    

    <!-- Turkish,土耳其语类型字段 -->

    <fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">

      <analyzer>

        <tokenizer class="solr.StandardTokenizerFactory"/>

        <filter class="solr.TurkishLowerCaseFilterFactory"/>

        <filter class="solr.StopFilterFactory" ignoreCase="false"

            words="lang/stopwords_tr.txt" />

        <filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>

      </analyzer>

    </fieldType>

    

    <!-- Chinese,须要咱们本身配置,整合mmseg4j就配置在这里 -->

 </types>

 

  <!-- 文档类似度判断依赖于文档类似度得分。 一个自定义的 Similarity SimilarityFactory

     能够在这里指定, 可是默认的设置已经适合大多数应用。能够参考:

     http://wiki.apache.org/solr/SchemaXml#Similarity

    -->

  <!--

     <similarity class="com.example.solr.CustomSimilarityFactory">

       <str name="paramkey">param value</str>

     </similarity>

    -->

 

</schema>

相关文章
相关标签/搜索