Как проиндексировать многомерный массив в поле Solr - PullRequest
1 голос
/ 04 апреля 2019

Я индексирую базу данных Mysql с помощью solr, у меня есть отношение один-много между таблицей пользователей и таблицей заказов: у одного пользователя может быть много заказов.

таблица заказов имеет много столбцов (id, orderDate, caseNumber).

Моя цель - проиндексировать эти таблицы в solr и иметь поле USR_ID для хранения идентификатора пользователя, ORDERS feild type = многомерный массив для хранения каждого заказа для этого пользователя в виде ассоциативного массива.

желаемый результат:

{
        "USR_ID":"10",
        "ORDERS":[
             {"ID":"1" ,"ORDER_DATE":"12-03-2018", "CASE_NUMBER":"554"}, //FIRST FIELD
             {"ID":"9","ORDER_DATE":"15-03-2018", "CASE_NUMBER":"569"} //SECOND FIELD
         ]
}

я получаю одномерный массив со столбцами всех заказов

{
        "USR_ID":"10",
        "ORDERS":[
             "1", "12-03-2018", "554", //FIRST FIELD
             "9", "15-03-2018", "569" //SECOND FIELD
         ]
}

Вот что я попробовал.Конфигурация сущностей в data-config.xml

<dataConfig>
    <dataSource type="JdbcDataSource" 
                driver="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost/mydb1" 
                user="" 
                password=""/>
    <document>
        <entity name="USERS"  
            pk="USR_ID"
            query="SELECT USR_UID, FROM USERS"
            deltaImportQuery="SELECT USR_UID, FROM USERS WHERE USR_UID='${dih.delta.USR_UID}'"
            deltaQuery="SELECT USR_UID FROM USERS WHERE USERS.USR_UPDATE_DATE > '${dih.last_index_time}'">
            <entity name="ORDER"  pk="ID"
                query="SELECT ID AS ORDERID, ORDER_DATE, CASE_NUMBER FROM ORDER WHERE USR_ID = '${USERS.USR_UID}'"
                deltaQuery="select ID from ORDER where UPDATED_AT > '${dih.last_index_time}'"
                parentDeltaQuery="SELECT USR_UID FROM USERS WHERE USR_UID = ${ORDER.USR_UID}">
                    <field column="ORDERID" name="ORDERS" />
                    <field column="CREATION_DATE" name="ORDERS" />
                    <field column="CASE_NUMBER" name="ORDERS" />     
            </entity>
        </entity>
    </document>
</dataConfig>

Вот определение полей в файле schema.xml


  <field name="USR_ID" type="string" indexed="true" stored="true" required="true" multiValued="false" />
  <field name="ORDERS" type="text_general" indexed="true" stored="true" required="false" multiValued="true"/>

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вам придется работать с вложенными документами или, по крайней мере, иметь один документ по заказу, поскольку у вас есть только Id на корневом уровне:

{
        "USR_ID":"10",
        "ID":"1" ,
        "ORDER_DATE":"12-03-2018", 
        "CASE_NUMBER":"554"
}

См. Это хорошее объяснение вложенных документов: http://yonik.com/solr-nested-objects/

0 голосов
/ 08 апреля 2019

Ответом было использование следующего атрибута в поле child="true", когда вы определяете свой файл data-config.xml

в моем случае

  <entity child="true" name="ORDER"  pk="ID"
                query="SELECT ID AS ORDERID, ORDER_DATE, CASE_NUMBER FROM ORDER WHERE USR_ID = '${USERS.USR_UID}'"
                deltaQuery="select ID from ORDER where UPDATED_AT > '${dih.last_index_time}'"
                parentDeltaQuery="SELECT USR_UID FROM USERS WHERE USR_UID = ${ORDER.USR_UID}">
                    <field column="ORDERID" name="ORDERS" />
                    <field column="CREATION_DATE" name="ORDERS" />
                    <field column="CASE_NUMBER" name="ORDERS" />     
            </entity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...