你可能希望以多种方式解释某些文档字段。
Solr有一个制作字段副本的机制,这样你可以将几种不同的字段类型应用于单个传入信息片段。
你想要复制的字段名称是源,副本的名称是目标。
在schema文件中,制作字段副本非常简单:
1 | <copyField source="cat" dest="text" maxChars="30000" /> |
在这个例子中,我们希望Solr将cat
字段复制到名为text
的字段。
字段在分析之前被复制,这意味着你可以有两个具有相同原始内容的字段,但使用不同的分析链,并以不同方式存储在索引中。
在上面的例子中,如果text
目标字段在输入文档中有自己的数据,cat
字段的内容将作为附加值添加 - 就像所有值最初都是由客户端指定的一样。
如果字段最终会获得多个值(无论是从多值源还是从多个copyField
指令),记得将字段配置为multivalued="true"
。
此功能的常见用法是创建一个单独的”搜索”字段,当用户或客户端不指定要查询的字段时,它将作为默认查询字段。
例如,title
、author
、keywords
和body
可能都是应该默认搜索的字段,每个字段都有复制字段规则复制到catchall
字段(例如,它可以命名为任何名称)。
稍后你可以在solrconfig.xml
中设置规则,默认搜索catchall
字段。
这样做的一个注意事项是使用复制字段时你的索引会增长。
然而,这是否对你有问题以及最终大小将取决于被复制的字段数量、被复制到的目标字段数量、使用的分析以及可用的磁盘空间。
maxChars
参数,一个int
参数,为在构造添加到目标字段的值时从源值复制的字符数建立上限。
这个限制对于你想要从源字段复制一些数据,但也控制索引文件大小的情况很有用。
copyField
的源和目标都可以包含前导或尾随星号,这将匹配任何内容。
例如,以下行将把所有匹配通配符模式*_t
的传入字段的内容复制到text字段:
1 | <copyField source="*_t" dest="text" maxChars="25000" /> |
重要
copyField
命令只有在source
参数也包含通配符的情况下,才能在dest
参数中使用通配符(*)字符。copyField
使用源字段的匹配通配符作为将源内容复制到的dest
字段名称。
复制在流源级别完成,没有副本输入到另一个副本中。
这意味着复制字段不能链接,即你不能从here
复制到there
,然后从there
复制到elsewhere
。
但是,同一个源字段可以复制到多个目标字段:
1 | <copyField source="here" dest="there"/> |