是否有必要在solr doc中拥有uniquie字段?请帮我修复我的solr设计

时间:2012-08-30 06:57:09

标签: solr

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

  1. 用户的基本个人资料。 (fields:uid:“1”,docType =“profile”..)
  2. 每个用户拥有的汽车。 (字段uid:“1”,docType =“cars”......)
  3. 1将为每个用户提供单个doc。 2将为每个用户提供多个文档(每个单独的汽车)。

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

    如果我将uid声明为架构中的唯一字段,那么我之后添加的汽车文档将覆盖该用户的个人资料文档,或者甚至是之前添加的同一用户的其他汽车文档bcoz uid是相同的。我怎样才能实现我想要的目标(即每个用户1个配置文件和每个用户的多个汽车文档)

    我刚刚开始研究solr,所以这个反问题非常基础所以请原谅我。

    Thnx适合您的时间。

3 个答案:

答案 0 :(得分:2)

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

在schema.xml文件中添加以下fieldType。

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

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

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

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

<uniqueKey>id</uniqueKey>

有关详细信息,请查看UniqueKey page in Solr wiki

答案 1 :(得分:2)

建议使用一个独特的字段来更好地维护文档。

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

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

<uniqueKey>uid</uniqueKey>

现在给汽车提供不同的身份。

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

 <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>

答案 2 :(得分:0)

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