Импортировать вложенные объекты в Solr DIH - PullRequest
0 голосов
/ 10 июля 2020

Мне нужно настроить вложенные сущности, которые импортируются через DIH. Между пользователем и адресом находится количество элементов от одного до многих (у пользователя много адресов).

Это наше определение импорта в конфигурации данных. xml

<document>
    <entity name="user" query="...">
           <field column="id" name="id" />
           <field column="code" name="code" />
        // next fields of user

        <entity name="address" child="true" query="..." where="user_id=user.id">
           <field column="id" name="id" />
           <field column="city" name="city" />
           // ... next fields of address
        </entity>
    </entity>
</document>

и схема. xml такая конфигурация:

// user fields
<field name="id" type="long" indexed="true" stored="true" />
<field name="name" type="string" indexed="true" stored="true" />
<field name="code" type="string" indexed="true" stored="true" />
// ...

// address fields
<field name="address" type="string" indexed="true" multiValued="true"  stored="true" />
<field name="address.id" type="long" indexed="true" stored="true" />
<field name="address.city" type="string" indexed="false" stored="true" />
// ...

Это решение приводит к тому, что адресный объект не импортируется. Спасибо за любой совет.

EDIT: Я также нашел много журналов предупреждений Error creating document : SolrInputDocument(fields: [user_id=122, ... _version_=1671840418228076544,&#8203; _root_=00924553002],&#8203; children: [SolrInputDocument(fields: [address_id=1,&#8203; _root_=00924553002,&#8203; _version_=1671840418228076544]),&#8203; SolrInputDocument(fields: [address_id=20,&#8203; _root_=00924553002,&#8203; _version_=1671840418228076544])])

EDIT 2: Журналы по умолчанию в приложении скрывают ошибку. Я проверил журналы сервера на машине и обнаружил эту ошибку: org.apache.solr.common.SolrException: [doc=null] missing required field: code at org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:245)

В схеме. xml У меня это поле установлено как идентификатор пользователя, но у детей этого поля нет. Затем я попытался добавить поле кода в качестве псевдонима для идентификатора и обнаружил еще одну ошибку, которая сообщает, что в обязательных полях, которые используются в родительском объекте (пользователе), отсутствует значение. Эти условия применялись также к вложенным объектам. Поэтому я попытался также удалить это условие из этих полей. После этого импорт был выполнен, но когда я выполняю select, все объекты находятся на одном уровне. Solr импортировал его как плоский.

Это ожидаемый результат выбора:

{
  "reponse": [
    {
      "id": 1,
      "code": "tsdx242-234",
      "first_name": "Michael",
      "last_name": "Sprox",
      "addresses": [
        {
          "id": 44,
          "city": "Paris",
          "street": "Champs-Elysees"
        },
        {
          "id": 24,
          "city": "Budapest",
          "street": "Akácfa utca"
        }
      ]
    },
    {
      "id": 2,
      "code": "xx45982-114",
      "first_name": "Petra",
      "last_name": "Jurka",
      "addresses": [
        {
          "id": 31,
          "city": "Vienna",
          "street": "Karlsplatz"
        },
        {
          "id": 44,
          "city": "Paris",
          "street": "Champs-Elysees"
        }
      ]
    }
  ]
}

Но он дает это, смешанные пользователи и адреса в одном файле:

{
  "response": [
    {
      "id": 44,
      "city": "Paris",
      "street": "Champs-Elysees"
    },
    {
      "id": 24,
      "city": "Budapest",
      "street": "Akácfa utca"
    },
    {
      "id": 31,
      "city": "Vienna",
      "street": "Karlsplatz"
    },
    {
      "id": 1,
      "code": "tsdx242-234",
      "first_name": "Michael",
      "last_name": "Sprox"
    },
    {
      "id": 2,
      "code": "xx45982-114",
      "first_name": "Petra",
      "last_name": "Jurka"
    }
  ]
}

1 Ответ

0 голосов
/ 10 июля 2020

Попробуйте переписать примерно так

<document>
        <entity name="user" query="...">
               <field column="id" name="id" />
            // next fields of user
    
            <entity name="second_entity_name" pk="user_id" query="SELECT ... FROM where user_id = '${user.id}'" >
               <field column="id" name="id" />
               <field column="city" name="city" />
               // ... next fields of address
            </entity>
        </entity>
    </document>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...