Solr03-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(马瘦风)

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

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

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

猜你喜欢

转载自www.cnblogs.com/shoufeng/p/9463917.html
今日推荐