加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Solr03-schema.xml文件详细说明

发布时间:2020-12-16 23:45:35 所属栏目:百科 来源:网络整理
导读:目录 1 schema.xml文件详细说明 1.1 fieldType定义域的类型 1.2 field定义域 1.3 copyField定义复制域 1.4 DynamicField定义动态域 1.5 uniqueKey指定唯一约束 1.6 其他标签 2 关于schema.xml的优化 1 schema.xml文件详细说明 schema.xml文件在SolrCore的con

目录

  • 1 schema.xml文件详细说明
    • 1.1 fieldType定义域的类型
    • 1.2 field定义域
    • 1.3 copyField定义复制域
    • 1.4 DynamicField定义动态域
    • 1.5 uniqueKey指定唯一约束
    • 1.6 其他标签
  • 2 关于schema.xml的优化

1 schema.xml文件详细说明

schema.xml文件在SolrCore的conf目录(即collection1/conf)下,主要用于配置Solr的域(Field)以及域的类型(FieldType). 在Solr中,域要先配置再使用.

1.1 fieldType定义域的类型

fieldType供Solr内部使用,不支持自定义域的类型. 原始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" />
        <!-- 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" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>
  • 属性说明:
    • name: 域类型的名称;
    • class: 域的类型对应的Solr类型,org.apache.solr.analysis包中提供了多个域类型;
    • analyzer: 定义索引和搜索使用的分词器,属于核心配置(使用的分析器不同,索引和检索也将不同);
    • type: index(索引流程)和query(检索流程);
    • tokenizer: 指定具体使用的分词器;
    • filter: 指定使用的过滤器;
  • 可选属性:
    • sortMissingLast和sortMissingFirst:
      • 默认值均为false,用在可以内在使用String排序的类型上(包括: string,boolean,sint,slong,sfloat,sdouble,pdate);
      • sortMissingLast="true",没有该field的数据排在有该field的数据之后,忽略请求时的排序规则;
      • sortMissingFirst="true",与sortMissingLast作用相反.
    • positionIncrementGap: 和multiValued一起使用,定义在同一个文档中此类型数据的空白间隔,即设置多个值之间的虚拟空白的数量,避免短语匹配错误.
  • 域类型(class)的说明:
    • solr.StrField类型: 不被分析,将被逐字索引/存储;
    • solr.TextField类型: 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter).
    • StrField和TextField都有可选属性"compressThreshold": 是否使用gzip压缩.
  • 几个常用的域类型及过滤器
<!--
    空格分词器,精确匹配: 在向索引库添加text类型的索引时,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果才会加入到索引库中以备查询. 
    注意: Solr的analysis包并没有带支持中文的包,需要自己添加中文分词器.
-->
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
    </analyzer>
</fieldType>
<!-- 
    分隔符过滤器: 在分词和匹配时,考虑 "-"连字符,字母数字的界限,非字母数字字符,这样"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维护. 
-->
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

1.2 field定义域

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
  • 属性说明:
    • name: 域的名称;
    • type: 上面定义的FieldType域的类型;
    • indexed: 是否被索引(关系到搜索和排序);
    • stored: 是否被存储(如果不需要存储相应的字段,尽量设置为false);
    • required: 是否必须(若某个域设置为必须,在创建索引时,就必须包含该域);
    • multiValued: 是否有多个值(在Solr中允许一个域保存多个值,类比存储多个好友Id,多个商品细节图片).
  • 可选属性:
    • compressed: 是否使用gzip压缩(只有TextField和StrField可以压缩),默认为false;
    • omitNorms: 是否忽略掉Norm,可以节省内存空间: 只有全文本field和need an index-time boost的field需要norm;
    • termVectors: 默认false,为true时会存储term vector,使用MoreLikeThis时,用来作为相似词的field应该存储起来;
    • termPositions: 存储term vector中的地址信息,会增大存储开销;
    • termOffsets: 存储term vector的偏移量,会消耗存储开销;
    • default: 如果没有属性需要修改,可用这个标识之.

1.3 copyField定义复制域

在创建索引的时候,Solr会将源域的内容,复制给目标域.

<copyField source="cat" dest="text"/>
  • 属性说明:
    • source: 源域的名称;
    • dest: 目标域的名称,搜索时指定目标域为默认搜索域,可提高查询效率.

说明:

目标域的定义,必须要指定一个属性multiValued="true".

Solr允许将多个域的值,复制给一个域,目的是为了方便搜索,如搜索含有某一词组的文档(每个文档中包括标题,摘要信息,正文),有copyField域,就无需写全三个域的值.

1.4 DynamicField定义动态域

<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
  • 属性说明:
    • name: 动态域的名称,是一个表达式,*表示匹配任意字符,只能出现在模式的最前或最后; 较长的模式会先做匹配; 如果2个模式同时匹配上,最先定义的有限匹配.

说明:

使用时,只需要域的名称与表达式匹配即可. 如"product_i":"笔记本",直接使用product_i就可以,不需要再做其他定义.

<dynamicField name="*_i" type="ignored" multiValued="true"/>

如果通过上面的匹配都没找到,可以定义这个,然后定义一个type当String处理. 一般不会发生,但若不定义,找不到匹配会报错.

1.5 uniqueKey指定唯一约束

Solr中id域是必须的.

<uniqueKey>id</uniqueKey>

Solr中某个文档若未被标记为required="false",那么它必须要由 作唯一标识,否则Solr建立索引时将报错.

1.6 其他标签

? (1) 默认搜索域:

<defaultSearchField>text</defaultSearchField>

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

? (2) Solr查询解析器:

<!-- 从Solr 6.6版本开始,不再支持defaultOperator -->
<solrQueryParser defaultOperator="OR"/>

? 配置搜索参数短语间的逻辑,可以是"AND|OR".

2 关于schema.xml的优化

(1)  将所有只用于搜索、而不需要作为结果的field(特别是数据量比较大的field)的stored设置为false; 
(2)  将不需要被用于搜索、而只是作为结果返回的Field的indexed设置为false; 
(3)  删除所有不必要的copyField声明; 
(4)  为了索引字段的最小化和搜索的效率,将所有的text fields的index都设置为field,然后使用copyField将它们都复制到一个总的text field上,对该text  field进行搜索; 
(5)  为了最大化搜索效率,使用Java编写的客户端与Solr交互(使用流通信); 
(6)  在服务器端运行JVM(省去网络通信),使用尽可能高的Log输出等级,减少日志量.

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励,感谢您的阅读.

本文版权归博主所有,欢迎转载,但未经博主同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则博主保留追究法律责任的权利.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读