【问题标题】:How to index multi dimension array in solr field如何在 solr 字段中索引多维数组
【发布时间】:2019-04-04 13:05:47
【问题描述】:

我正在用 solr 索引 Mysql 数据库,我在用户表和订单表之间有一对多的关系:一个用户可以有多个订单。

订单表有很多列(id、orderDate、caseNumber)。

我的目标是在 solr 中为这些表建立索引,并使用 USR_ID 字段来存储用户 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"/>

【问题讨论】:

    标签: solr


    【解决方案1】:

    您将不得不使用子文档,或者至少按顺序拥有一个文档,因为您在根级别只有一个 Id:

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

    查看嵌套文档的这个很好的解释: http://yonik.com/solr-nested-objects/

    【讨论】:

    • 用户表还有其他列,为了清楚起见我简化了代码,在你提到的链接中,它没有解释如何使用 DIH dataImportHandler 对其进行归档。
    【解决方案2】:

    答案是在定义 data-config.xml 文件时在 child="true" 字段中使用以下属性

    就我而言

      <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多