Solr + schema.xml创建自定义FieldType对象

时间:2015-07-23 09:07:05

标签: indexing solr schema fieldtype

这只是一个例子,但它会帮助我进一步发展

我有一个对象" person"与字段[年龄,名称]

我的schema.xml

<field name="age" type="string" indexed="true" stored="false"/>
<field name="name" type="string" indexed="true" stored="false"/>

一切都还可以,但我想再添加+1字段&#34;关系&#34; (或父母,孩子等) 人[年龄,姓名,关系] - &gt;关系也有[年龄,姓名]

我怎么能将FieldType关系插入到schema.xml中?

<field name="age" type="string" indexed="true" stored="false"/>
<field name="name" type="string" indexed="true" stored="false"/>
<field name="relation" type="???" indexed="true" stored="false"/>

我想添加一个Field,它会获取上面的所有现有字段

<field name="field1" type="string">
<field name="field2" type="string">
<field name="field3" type="string">
<field name="field4" type="field1,field2,field3">

2 个答案:

答案 0 :(得分:1)

Solr并不真正支持您想要的内容,因此您可能要么使用包含指向其他文档的ID的多值字段对其进行索引,例如(年龄字段为a的原因)字符串而不是int?):

<field name="id" type="int" indexed="true" stored="false"/>
<field name="age" type="string" indexed="true" stored="false"/>
<field name="name" type="string" indexed="true" stored="false"/>
<field name="relation" type="int" multiValued="true" indexed="true" stored="false" />

..然后在显示文档时查询具有给定关系的所有文档(向Solr发出两个查询)。

您可以also use nested child documents,但需要更多处理(因为所有内容都包含在一个文档中,您必须一起更新所有内容)。

答案 1 :(得分:0)

Solr更喜欢一切都是非规范化的方式。多值就是这个方向。但正如@MatsLindh所说,它涉及2个查询,因为大多数时候子实体不仅仅是单个字段(字符串数组v / s实体数组)。

(您的案件中的父母和子女是人和“关系”) 嵌套的子文档,更像是对象关系,就像我们在其他框架中一样。你有父文件,你有子文件,并且solr维持这种关系,我们应该有一个与孩子的父母相同的字段。关于这一点的好处是

  1. 您可以获取包含子字段匹配的父文档
  2. 匹配父字段的所有子文档
  3. 最后只有一个查询
  4. 嵌套的东西,是最近添加的。我们正在使用清晰的作品与solr互动。他们建议不要使用嵌套文档,因此我们最终得到了多值。但是,如果您的基础架构允许,并且solr框架本身具有该功能,我认为使用它没有错。