将子文档添加到现有的Solr 6.4集合文档中会创建重复的文档

时间:2019-01-17 00:24:42

标签: solr

这个问题类似于Solr doesn't overwrite - duplicated uniqueKey entries,但是我处于这样的情况:我有很多现有文档已经被添加到集合中而没有任何子文档,并且我正在使用(独立而不是云)Solr 6.4而不是5.3.1。我们最近启用了子文档,以便我们可以存储更丰富的数据。

我们使用SolrJ将数据加载到其中并查询Solr,但是为了隔离所遇到的问题,我使用了命令行Solr post工具上传了以下文档:

<add>
    <doc>
        <field name="id">1</field>
        <field name="solr_record_type">1</field>
        <field name="title">Fabulous Book</field>
        <field name="author">Angelo Author</field>
    </doc>
</add>

搜索结果符合预期: 使用q=id:1fl=id,title,index_date,[child parentFilter="solr_record_type:1"]

 "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"1",
        "title":"Fabulous Book",
        "index_date":"2019-01-16T23:06:57.221Z"}]
  }

然后我通过发布以下内容来更新文档:

<add>
    <doc>
        <field name="id">1</field>
        <field name="solr_record_type">1</field>
        <field name="title">Fabulous Book</field>
        <field name="author">Angelo Author</field>
        <doc>
            <field name="id">1-1</field>
            <field name="solr_record_type">2</field>
            <field name="contributor_name">Polly Math</field>
            <field name="contributor_type">3</field>
        </doc>
    </doc>
</add>

然后,重复搜索,得到以下重复结果,在唯一的id字段上搜索,这是不希望的。

    "response":{"numFound":2,"start":0,"docs":[
      {
        "id":"1",
        "title":"Fabulous Book",
        "index_date":"2019-01-16T23:06:57.221Z",
        "_childDocuments_":[
        {
          "id":"1-1",
          "solr_record_type":2,
          "contributor_name":"Polly Math",
          "contributor_type":3,
          "index_date":"2019-01-16T23:09:29.142Z"}]},
      {
        "id":"1",
        "title":"Fabulous Book",
        "index_date":"2019-01-16T23:09:29.142Z",
        "_childDocuments_":[
        {
          "id":"1-1",
          "solr_record_type":2,
          "contributor_name":"Polly Math",
          "contributor_type":3,
          "index_date":"2019-01-16T23:09:29.142Z"}]}]
  }

反之,如果我从最初加载了子文档的文档开始,如下所示:

<add>
    <doc>
        <field name="id">2</field>
        <field name="solr_record_type">1</field>
        <field name="title">Wonderful Book</field>
        <field name="author">Andy Author</field>
        <doc>
            <field name="id">2-1</field>
            <field name="solr_record_type">2</field>
            <field name="contributor_name">Polly Math</field>
            <field name="contributor_type">3</field>
        </doc>
    </doc>
</add>

然后用没有子项的文档更新它:

<add>
    <doc>
        <field name="id">2</field>
        <field name="solr_record_type">1</field>
        <field name="title">Wonderful Book</field>
        <field name="author">Andy Author</field>
    </doc>
</add>

结果中仍然有孩子:

  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"2",
        "title":"Wonderful Book",
        "index_date":"2019-01-16T23:09:39.389Z",
        "_childDocuments_":[
        {
          "id":"2-1",
          "title_id":2,
          "title_instance_id":2,
          "solr_record_type":2,
          "contributor_name":"Polly Math",
          "contributor_type":3,
          "index_date":"2019-01-16T23:07:04.861Z"}]}]
  }

这很奇怪,因为如果我用2个子文档更新了一个只有1个子文档的替换文档,它将删除一个子文档。但是在这种情况下,它不会删除子文档。

不具有不添加子文档的子文档的文档更新和不移除所有子文档的具有子文档的文档更新似乎都可以正常工作。

我有很多没有孩子的现有文档,我可能会添加孩子,最终我可能有很多有孩子的文档可能会丢掉孩子。鉴于此,在不生成重复记录或丢失更新的情况下更新这些记录的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

我强烈建议 避免 Solr父母/子女关系。我们决定在Solr 5.3.1中使用它们,结果发现尽管有很多功能,但是自4.x以来Solr中存在许多讨厌的错误,这些错误尚未修复,包括

  • SOLR-6096:支持对嵌套文档进行更新和删除
  • SOLR-5211:将父级更新为无子级会使孤儿变成孤儿(更新:在8.0中修复)
  • SOLR-6596:原子更新和添加子文档无法协同工作
  • SOLR-5772:在solr“块连接”文档和“普通”文档之间存在重复文档
  • SOLR-10030:Solrj中的SolrClient.getById()方法不会检索子文档

出于这些原因,如果可能的话,我强烈建议使用子文档避免AVOID。即使这些问题现在还没有解决,但将来仍会在某个时候出现。很明显,鉴于尚未将其固定在3到4个主要版本中,因此该产品中没有针对子文档的真正支持。很抱歉成为坏消息的承担者,但希望有人可以从我们的经验中学到东西。