schema.xml - solr的域
solr中的域用来表示document的某一部分信息,而一个document可能有多个域组成。
以下为Field配置属性:
- name:域的名称,每个域都需要一个名称,且域的名称需要在同一个schema文件中保持唯一性
- type:域类型的名称,需要能够在<fieldType>的那么属性中找到
- default:域的默认值,当创建索引时,若域的域值没有赋值,那么默认值就派上用场了
Field与FieldType共同可选配置属性(若同时指定,Field会覆盖FieldType的设置)
- indexed:表示是否需要索引,若配置为true,域才能被查询,默认值true
- stored: 表示是否需要存储,若配置为true,域的原始值才能被提取,如果你需要使用Highlight或MoreLikeThis功能,那么stored必须设置true,默认值true
- compressed:表示是否对域值进行压缩,只有stored=true时,compressed
设置为true才能有意义,且compressed属性值只适用于TextField和StrField,默认为false - docValues:若设置为true,那么域值会被放入一个column-doc的docValues结构中,对facet查询,group分组,排序,function查询有好处,景观这个属性不是必须的,但他能假哭奥索引数据加载,对NRT近实时搜索比较友好,且更节省内存,但他也有一些限制,比如当前docValues域只支持strField,UUIDField,Trie*Field等域,且要求域的域值是单值不能是多值域,默认值为false
- sortMissingFirst:表示当一个排序域的值为null时,该如何对其排序,设置为true,表示排在最前面,默认为false
- sortMissingLast:表示当一个排序域的值为null时,该如何对其排序,设置为true,表示排在最后面,默认为false
- multiValued:表示当前域是否为多值域,默认为false
- omitNorms:此属性若设置为true,即表示将忽略域值的标准化因子,忽略在索引过程中对当前域的权重设置,且会节省内存。只有全文本域或者你需要在索引创建过程中设置域的权重是才需要把这个值设置为false,对于基本数据类型且不分词的域,如intField,longField,StrField等默认此属性值就是true,否则默认就是false
- omitTermFreqAndPositions:表示是否忽略term的频率,term的位置信息,term的payload信息
- omitPositions:跟omitTermFreAnd'Position类似,但此属性会保存term的频率信息
- termVectors:表示是否启用term的空间向量模型
- termPositions:表示是否保存term的position位置信息
- termOffsets:表示是否保存term的便宜量
- termPayloads:表示是否保存term的payload信息(存储以上四个属性信息会增大索引体积)
- required:表示某个域对于document是否必须的,若设置为true,但document中却不存在该域,那么索引添加失败,默认值为false
- useDocValuesAsStored:若配置为true,则会将该域当作stored field即便它的stored设置为false,前提是docValues设置为true配置才有效
Solr复制域
有时候,某个域的域值可能已经在其他域中存储,你可能不希望不再重复提取数据并复制,而是期望能不能从其他域上复制过来。CopyField的一个典型应用场景就是创建一个单一的搜索域来满足用户的各种查询需求。比如,用户搜索一本书籍时,title、author、keywords、description这几个域都应该被查询,但我们设计搜索功能的时候,有不能强制用户指定在那些域上进行搜索,即搜索域对于用户来书是完全透明的,此时我们可以定义一个copyField,将title、author、keywords、description这几个域的域值全部copy到新定义的复制域上,之后通过默认搜索对这个copyfile进行查询。
<copyField source="cat" dest="text" maxChars="30000"/>
<copyField source="vct" dest="text" maxChars="30000"/>
在示例中,text域的域值是从cat和vct这两个域复制过来的,source表示复制的源域名称,dest表示复制的目标域名称。source和dest的属性值都是支持通配符的。
solr动态域
动态域的name属性支持模糊匹配,他需要为name属性指定一个通配符表达式,当你索引文档时,如果一个field找不到,那么就会尝试根据通配符去匹配动态域。这样可以在索引数据需要添加新的域时,避免频繁修改schema.xml。
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
其他schema元素
I. uniqueKey:
<uniqueKey>id</uniqueKey>
uniqueKey用来配置Document的唯一标示域,即solr使用此域来决定增量导入时是否重复导入。copyField不能作为uniqueKey。
II.defaultSearchField:
配置默认搜索域,已过时。推荐通过df参数来代替。
III.索引文档评分器:
可以配置在<schema>元素下,进行全局配置;也可以配置在<fieldType>元素下,则只对该域类型有效。
<similarity class="solr.BM25Similarity"/>
<similarity class="solr.SchemaSimilarityFactory">
<str name="defaultSimFromFieldType">text_dfr</str>
</similarity>
<similarity class="solr.DFRSimilarityFactory">
<str name="basicModel">I(F)</str>
<str name="afterEffect">B</str>
<str name="normalization">H3</str>
<float name="mu">900</float>
</similarity>
<fieldType>
IV.solrQueryParser:
<solrQueryParser defaultOperator="OR"/>
设置queryParser默认操作符OR,已过时。推荐使用q.op请求参数来代替。