1

我有一个单核 solr 实例正在运行。我想存储两种不同类型的文档。

  1. 用户的基本配置文件。(字段:uid:“1”,docType="profile"..)
  2. 每个用户拥有的汽车。(字段 uid:"1", docType="cars"...)

1 每个用户将有一个文档。2 将为每个用户提供多个文档(每个单独的汽车)。

由于某些设计原因,我不想要汽车的多值字段。我需要为每个用户提供 1 辆车的多个文档。

如果我将 uid 声明为模式中的唯一字段,那么我稍后添加的汽车文档将覆盖该用户的我的个人资料文档,甚至是来自同一用户的其他汽车文档,因为之前添加的 uid 是相同的。我怎样才能实现我想要的(即每个用户 1 个个人资料文档和每个用户多个汽车文档)

我刚刚开始研究 solr,所以这个 cud 非常基本,所以请原谅我。

谢谢你的时间。

4

3 回答 3

2

您可以通过将通用唯一标识符添加到 schema.xml 来解决此问题。

在 schema.xml 文件中添加以下字段类型。

<fieldType name="uuid" class="solr.UUIDField" indexed="true" />

然后添加此类型的新字段。

<field name="id" type="uuid" indexed="true" stored="true" default="NEW" />

最后,使用此字段定义您的 uniqueId 键。

<uniqueKey>id</uniqueKey>

有关更多信息,请查看Solr wiki 中的 UniqueKey 页面

于 2012-08-30T08:50:50.993 回答
2

建议有一个独特的字段,以便更好地维护文档。

Solr 基于唯一 ID 维护文档。如果您插入具有相同现有 ID 的文档,Solr 将覆盖前一个。

在您的示例中,对个人资料和汽车使用相同的 uid 不是一个好的解决方案。只让其中一个使用该 uid。例如,仅将 uid 分配给用户并使其唯一。

<uniqueKey>uid</uniqueKey>

现在给汽车不同的ID。

您可能还想使用多值字段。例如,

 <field name="user" type="string" indexed="true" stored="true"/>
 <field name="cars" type="string" indexed="true" stored="true" multiValued="true"/>

你可以有这样的文档:

<doc>
  <field name="uid">UserID</field>
  <field name="name">User Name</field>
  <field name="cars">Car 1</field>
  <field name="cars">Car 2</field>
  <field name="cars">Car 3</field>
</doc>
于 2012-08-30T11:46:05.827 回答
0

根据您将文档放入索引的方式,如果组合是唯一的,您可以创建一个人工键作为 uid 和 docType 的串联。使用 UUIDField 当然也是一个有效的选项,尽管你得到了无意义的键。

于 2012-08-30T11:16:45.550 回答