我有一个运行的核心solr实例。我想存储两种不同类型的文档。
1将为每个用户提供单个doc。 2将为每个用户提供多个文档(每个单独的汽车)。
由于某些设计原因,我不想要汽车的多值领域。我需要每个用户1辆车的多个文档。
如果我将uid声明为架构中的唯一字段,那么我之后添加的汽车文档将覆盖该用户的个人资料文档,或者甚至是之前添加的同一用户的其他汽车文档bcoz uid是相同的。我怎样才能实现我想要的目标(即每个用户1个配置文件和每个用户的多个汽车文档)
我刚刚开始研究solr,所以这个反问题非常基础所以请原谅我。
Thnx适合您的时间。
答案 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也是一个有效的选项,尽管你得到了无意义的密钥。