Solr Composite 来自模式中现有字段的唯一键

Posted

技术标签:

【中文标题】Solr Composite 来自模式中现有字段的唯一键【英文标题】:Solr Composite Unique key from existing fields in schema 【发布时间】:2013-07-22 07:46:35 【问题描述】:

我在 solr 中有一个名为 LocationIndex 的索引,其字段如下:

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    // and some more fields
</fields>
<uniqueKey>solr_id</uniqueKey>

但现在我想更改架构,以便唯一键必须由两个已经存在的字段 solr_idsolr_ver... 组成,如下所示:

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    <field name="composite-id" type="string" stored="true" required="true" indexed="true"/>
    // and some more fields
</fields>
<uniqueKey>solr_ver-solr_id</uniqueKey>

经过搜索,我发现可以通过在架构中添加以下内容:(参考:Solr Composite Unique key from existing fields in schema)

<updateRequestProcessorChain name="composite-id">
  <processor class="solr.CloneFieldUpdateProcessorFactory">
    <str name="source">docid_s</str>
    <str name="source">userid_s</str>
    <str name="dest">id</str>
  </processor>
  <processor class="solr.ConcatFieldUpdateProcessorFactory">
    <str name="fieldName">id</str>
    <str name="delimiter">--</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

所以我改变了架构,最后它看起来像:

<updateRequestProcessorChain name="composite-id">
  <processor class="solr.CloneFieldUpdateProcessorFactory">
    <str name="source">solr_ver</str>
    <str name="source">solr_id</str>
    <str name="dest">id</str>
  </processor>
  <processor class="solr.ConcatFieldUpdateProcessorFactory">
    <str name="fieldName">id</str>
    <str name="delimiter">-</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    <field name="id" type="string" stored="true" required="true" indexed="true"/>
    // and some more fields
</fields>
<uniqueKey>id</uniqueKey>

但是在添加文档时它给了我错误:

org.apache.solr.client.solrj.SolrServerException: Server at http://localhost:8983/solr/LocationIndex returned non ok status:400, message:Document [null] missing required field: id

我没有了解需要对架构进行哪些更改才能按预期工作?

在我添加的文档中,它包含字段solr_versolr_id。通过组合这两个字段(例如solr_ver-solr_id),它将如何以及在何处(solr)创建id 字段?

编辑:

this link 给出了如何引用这个链。但我无法理解它如何在模式中使用?我应该在哪里进行更改?

【问题讨论】:

你能发布你的 db-data.config 文件吗 【参考方案1】:

所以看起来你的 updateRequestProcessorChain 定义得当,它应该可以工作。但是,您需要将其添加到 solrconfig.xml 文件而不是 schema.xml。您提供的附加链接向您展示了如何修改您的 solrconfig.xml 文件并将您定义的 updateRequestProcessorChain 添加到您的 solr 实例的当前 /update 请求处理程序中。

所以 find 执行以下操作:

    将您的 &lt;updateRequestProcessorChain&gt; 移动到您的 solrconfig.xml 文件中。

    更新 solrconfig.xml 文件中的 &lt;requestHandler name="/update" class="solr.UpdateRequestHandler"&gt; 条目并对其进行修改,使其如下所示:

    <requestHandler name="/update" class="solr.UpdateRequestHandler">
       <lst name="defaults">
          <str name="update.chain">composite-id</str>
       </lst>
    </requestHandler>
    

这应该会在新文档添加到索引时执行您定义的更新链并填充 id 字段。

【讨论】:

我按照你所说的进行了更新,希望这是正确的。但现在我收到了CloneFieldUpdateProcessorFactoryclass not found 错误。此功能不适用于较旧的 solr 版本吗?我正在使用 solr,其规格为:Solr Specification Version: 3.4.0.2011.09.09.09.06.17Solr Implementation Version: 3.4.0 1167142 - mike - 2011-09-09 09:06:17 我刚刚查看了 Solr 源代码,不幸的是,CloneFieldUpdateProcessorFactory 仅在 Solr 4.x 版本中可用,并且不包含在 Solr 3.x 版本中。对不起。 我试过了,我收到了这个错误文档缺少必需的 uniqueKey 字段:composite-id。我们是否必须在文档中定义这个复合ID【参考方案2】:

上述解决方案可能有一些限制,如果“dest”由于连接字段太长而超过最大长度怎么办。 MD5Signature(一个能够从一组指定文档字段的连接中生成签名字符串的类,用于精确重复检测的 128 位哈希)还有一个解决方案

<!-- An example dedup update processor that creates the "id" field on the fly 
     based on the hash code of some other fields.  This example has 
     overwriteDupes set to false since we are using the id field as the 
     signatureField and Solr will maintain uniqueness based on that anyway. --> 
<updateRequestProcessorChain name="dedupe"> 
  <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory"> 
    <bool name="enabled">true</bool> 
    <bool name="overwriteDupes">false</bool> 
    <str name="signatureField">id</str> 
    <str name="fields">name,features,cat</str> 
    <str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str> 
  </processor> 
  <processor class="solr.LogUpdateProcessorFactory" /> 
  <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

从这里:http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

【讨论】:

我尝试了这个解决方案,但它仍然给了我 Document is missing optional uniqueKey "id"【参考方案3】:

我想将此作为评论添加,但这些天不可能获得信誉......无论如何,这里有一个更好的链接: https://wiki.apache.org/solr/Deduplication

【讨论】:

以上是关于Solr Composite 来自模式中现有字段的唯一键的主要内容,如果未能解决你的问题,请参考以下文章

Solr模式:在不使用模式类型定义时更新是否安全?

Hue, Solr - 搜索词的自动填充

Apache Solr 字符串字段或文本字段?

Solr,阻止更新现有文档

Composite模式(组合设计模式)

设计模式:Composite模式