solr7.1.0学习笔记(7)---配置文件managed-schema(schema.xml)-如何定义动态字段dynamicField和复制字段

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39082031/article/details/78934284

1、动态字段dynamicField:例如,有特定前缀或者后缀的字段

1.1、动态字段允许solr检索那些没有明确定义的字段。动态字段就像一个常规的字段,除了它有一个带有通配符的名字。在作为索引文档时,与任何明确定义的字段都不匹配的字段可以与动态字段匹配。

例如,假设您的模式中包含一个具有 *_i 名称的动态字段。如果您尝试使用 cost_i 字段对文档进行索引,但架构中没有定义明确的 cost_i 字段,则该 cost_i 字段将具有*_i 定义的字段类型和分析,也就是后缀是_i的字段会匹配到名称为*_i的动态字段定义的字段类型。

像常规字段一样,动态字段具有名称、字段类型和选项。

动态字段定义示例:

<dynamicField name="*_i" type="int" indexed="true"  stored="true"/>

1.2、dynamicField通常用于以下情形:

1.2.1、document模型具有较多的字段

举个粟子:想要索引pdf文件,Solr提供了一个简单的requestHandler -- /update/extract,最终会调用apache的另外一个开源项目Tika去解析pdf文件,Solr返回的解析后的document里包含了很多field,我们只想要其中的某些field,如果我们在<field>里只配置了我们想要的field,那么进行索引的时候会报错,错误消息大体为没有定义什么什么field,这时,我们可以配置一个<dynamicField name="ignore_*" type="ignored" multiValued="true">,然后在solrconfig.xml里相应的requestHandler里配置<str name="uprefix">ignore_</str>,这样对于在managed-schema里没定义的field都会被忽略掉。

1.2.2、支持来自不同来源的文档

 比如索引的时候想要增加标注其来源的field,可以进行如下的配置:
<field name="source1_field1" type="string" index="true" stored="true" />
<field name="source1_field2" type="string" index="true" stored="true" />
<field name="source1_field3" type="string" index="true" stored="true" />
 ...
<field name="source2_field1" type="string" index="true" stored="true" />
 <field name="source2_field2" type="string" index="true" stored="true" />
<field name="source2_field3" type="string" index="true" stored="true" />
但是如果有很多来源的话,这种配置就太多了。我们只须配置<dynamicField name="*_s" index="true" stored="true" type="string" />,然后索引的时候改成:
<doc>

<field name="id">hello</field>

<field name="source1_field1_s">hello</field>

</doc>
这样,索引时的field名既可以保留来源的信息,又不需要在配置文件里配置很多的field定义。

1.2.3、增加新的文档来源

还是上面的例子,如果将来有新的文档来源,我们可以不必在配置文件里增加诸如 <field name="source5_field1" type="string" index="true" stored="true" />这样的配置,就可以直接在索引的时候添加“source5_field1_s”这样的字段。

2、复制字段copyField:将一个名称的字段(源字段source)复制到另一个名称的字段(目标字段destination)

2.1、复制字段定义示例:

<copyField source="cat" dest="text" maxChars="30000" />

这个例子中,我们希望Solr将名为cat的字段复制到一个名为text的字段,复制字段是在analysis之前完成的,这就意味着我们有两个具有相同源内容的字段,但是它们使用不同的分析连并且以不同的方式存储在索引中。

2.2、如果目标字段text在文档中有自己的数据,则被复制字段cat的内容将作为附加值添加到目标字段text的数据内容里。如果一个字段最终将会有多个值(不管这些值是来自于一个多值的源数据还是由多个复制字段复制而来),那么必须设置字段为multivalued="true"。复制字段支持field和dynamicField。

2.3、 用百度或google搜索时,我们可能想要搜索一个人名,或者书名,或者网站的名字,其后台索引文件里分别由不同的field去保存那些值,那它是如何用一个输入框去搜索不同的field的内容的呢?答案就是<copyField> (不知道百度或google用的是什么搜索技术,但是原理应该差不多)

<field name="text" type="string" index="true" stored="true" multiValues="true" />
<copyField source="man_name" dest="text" />
<copyField source="book_name" dest="text" />
<copyField source="web_address" dest="text" />

这样我们就只需要搜索text里的内容就可以了。


上一节:solr7.1.0学习笔记(6)---配置文件managed-schema(schema.xml)-如何定义字段field

下一节:solr7.1.0学习笔记(8)---配置文件managed-schema(schema.xml)-analyzer,tokenizer

猜你喜欢

转载自blog.csdn.net/weixin_39082031/article/details/78934284