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

N D*_*are 11 java solr unique-key solrj solr-schema

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

<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>
Run Code Online (Sandbox Code Playgroud)

但现在我想改变架构,这样独特的密钥必须是复合台现有本领域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>
Run Code Online (Sandbox Code Playgroud)

搜索后我发现可以通过在schema中添加以下内容:(ref:Solr Composite来自模式中现有字段的唯一键)

<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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我没有得到模式的哪些变化需要按预期工作?

在我添加的文档中,它包含字段solr_versolr_id.如何以及在哪里(solr)id通过将这些字段组合起来创建字段solr_ver-solr_id

编辑:

这个链接给出了如何引用这个链.我无法理解如何在架构中使用它?我应该在哪里进行更改?

Pai*_*ook 10

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

所以找到以下内容:

  1. 移动<updateRequestProcessorChain>到solrconfig.xml文件.
  2. 更新<requestHandler name="/update" class="solr.UpdateRequestHandler">solrconfig.xml文件中的条目并对其进行修改,使其如下所示:

    <requestHandler name="/update" class="solr.UpdateRequestHandler">
       <lst name="defaults">
          <str name="update.chain">composite-id</str>
       </lst>
    </requestHandler>
    
    Run Code Online (Sandbox Code Playgroud)

然后,这应该执行您定义的更新链,并在将新文档添加到索引时填充id字段.