关于 Solr的schema.xml
目录
schema.xml 是 Solr 一个配置文件,它包含了你的文档所有的字段,以及当文档被加入索引或查询字段时,这些字段是如何被处理的。这个文件被存储在 Solr 主文件夹下的 conf 目录下。
一、 f iled 节点
filed 节点用于定义数据源字段所使用的搜索类型与相关设置。含有以下属性
name :数据源字段名,搜索使用到。
type :搜索类型名例如中文 ika 搜索名 text_ika ,对应于 fieldType 中的 name 。不需要分词的字符串类型, string 即可,如果需要分词,用上面配置好的分词 type 。
indexed :是否被索引,只有设置为 true 的字段才能进行搜索排序分片 (earchable 、 sortable 、 facetable) 。
stored :是否存储内容,如果不需要存储字段值,尽量设置为 false 以提高效率。
multiValued :是否为多值类型, SOLR 允许配置多个数据源字段存储到一个搜索字段中。多个值必须为 true ,否则有可能抛出异常。
omitNorms :是否忽略掉 Norm ,可以节省内存空间,只有全文本 field 和 need an index-time boost 的 field 需要 norm 。(具体没看懂,注释里有矛盾)
termVectors :当设置 true ,会存储 term vector 。当使用 MoreLikeThis ,用来作为相似词的 field 应该存储起来。
termPositions :存储 term vector 中的地址信息,会消耗存储开销。
termOffsets :存储 term vector 的偏移量,会消耗存储开销。
default :如果没有属性需要修改,就可以用这个标识下。
docValues : Solr 4.2 中加入了该属性
docValuesFormat :可选的值为 Disk 或者 Memory
二、 copyField 节点
作用:
将多个 field 的数据放在一起同时搜索,提供速度
将一个 field 的数据拷贝到另一个,可以用 2 种不同的方式来建立索引
我们将所有的中文分词字段全部拷贝至 all 中,当我们进行全文检索是,只用搜索 all 字段就 OK 了。
其包含属性:
source :源 field 字段
dest :目标 field 字段
maxChars :最多拷贝多少字符
注意,这里的目标字段必须支持多值,最好不要存储,因为他只是做搜索。 indexed 为 true , stored 为 false 。
copyField 节点和 field 节点都在 fields 节点之内。
三、 type 节点
先来看下 type 节点,这里面定义 FieldType 子节点,包括 name 、 class 、 positionIncrementGap 等一些参数。必选参数:
name :就是这个 FieldType 的名称。
class :指向 org.apache.solr.analysis 包里面对应的 class 名称,用来定义这个类型的行为。
其他可选的属性:
sortMissingLast , sortMissingFirst 两个属性是用在可以内在使用 String 排序的类型上,默认 false ,适用于字段类型: string 、 boolean 、 sint 、 slong 、 sfloat 、 sdouble 、 pdate 。
sortMissingLast="true" ,没有该 field 的数据排在有该 field 的数据之后,而不管请求时的排序规则,在 Java 中对应的意思就是,该字段为 NULL ,排在后面。
sortMissingFirst="true" ,排序规则与 sortMissingLast 相反。
positionIncrementGap :可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。
在配置中, string 类型的 class 是 solr.StrField ,而这个字段是不会被分析存储的,也就是说不会被分词。
而对于文章或者长文本来说,我们必须对其进行分词才能保证搜索某些字段时能够给出正确的结果。这时我们就可以用到另外一个 class , solr.TextField 。它允许用户通过分析器来定制索引和查询,分析器包括一个分词器( tokenizer )和多个过滤器( filter ) 。
一个标准的分词:
<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" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
</analyzer></fieldType>
分词用的依旧是 fieldType ,为的是在下面的 field 中能够用到。有两个 analyzer ,一个是 index ,一个是 query , index 是针对于所有, query 是针对于搜索。
tokenizer 节点当然就是对应分析链中的起点 Tokenizer 。接下来串联了 2 个 filter ,分别是 solr.StopFilterFactory , solr.LowerCaseFilterFactory 。 stop word filter 就是把那些 the 、 of 、 on 之类的词从 token 中去除掉,由于这类词在文档中出现的频率非常高,而对文档的特征又没什么影响,所以这类词对查询没什么意义。 Lower case filter 的作用是将所有的 token 转换成小写,也就是在最终的 index 中保存的都是小写
你也可以定义一个 analyzer ,例如使用 mmseg4j 进行中文分词:
<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" />
</analyzer></fieldType>
三、 dynamicField 节点
动态字段,没有具体名称的字段,用 dynamicField 字段
如: name 为 *_i ,定义它的 type 为 int ,那么在使用这个字段的时候,任务以 _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"/>
四、 uniqueKey 节点
solr 必须设置一个唯一字段,常设置为 id ,此唯一一段有 uniqueKey 节点指定。
例如:
<uniqueKey>id</uniqueKey>
五、 defaultSearchField 节点
默认搜索的字段,我们已经将需要搜索的字段拷贝至 all 字段了,在这里设为 all 即可。
<defaultSearchField>all</defaultSearchField>
六、 solrQueryParser 节点
默认搜索操作符参数,及搜索短语间的逻辑,用 AND 增加准确率,用 OR 增加覆盖面,建议用 AND ,也可在搜索语句中定义。例如搜索 “ 手机 苹果 ” ,使用 AND 默认搜索为 “ 手机 AND 苹果 “ 。
<solrQueryParser defaultOperator="OR"/>