Добавление дочерних документов в существующие документы коллекции Solr 6.4 создает дубликаты документов - PullRequest
0 голосов
/ 17 января 2019

Этот вопрос похож на Solr не перезаписывает - дублируются записи uniqueKey , но я нахожусь в ситуации, когда у меня большой массив существующих документов, которые уже были добавлены в коллекцию без дочерних элементов документы, и я использую (автономный не облачный) 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:1 и fl=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>

Затем, повторяя мой поиск, я получил следующий повторяющийся результат поиска в уникальном поле идентификатора, что нежелательно.

    "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 голосов
/ 18 января 2019

Я бы настоятельно рекомендовал избегать Solr родитель / дочерние отношения. Мы решили использовать их в Solr 5.3.1, и оказалось, что, хотя большая часть функциональности присутствует, в Solr существует ряд неприятных ошибок, начиная с 4.x, которые остаются нефиксированными, включая

  • SOLR-6096 : поддержка обновления и удаления вложенных документов
  • SOLR-5211 : обновление родителя, поскольку бездетность делает детей-сирот старшими (ОБНОВЛЕНИЕ: исправлено в 8.0)
  • SOLR-6596 : атомарное обновление и добавление дочернего документа не работают вместе
  • SOLR-5772 : дубликаты документов между документами solr "block join" и "обычным" документом
  • SOLR-10030 : метод SolrClient.getById () в Solrj не извлекает дочерние документы

По этим причинам, если это вообще возможно, я настоятельно рекомендую ИЗБЕГАТЬ, используя дочерние документы. Даже если эти проблемы вас не коснутся сейчас, они будут решаться в будущем в какой-то момент, и понятно, что, поскольку они не были исправлены в 3-4 основных версиях, в продукте нет реальной поддержки для дочерних документов. Извините, что несу плохие новости, но, надеюсь, кто-то может извлечь уроки из нашего опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...