如何使用DataImportHandler生成Id?

时间:2012-04-30 09:25:40

标签: solr dataimporthandler dih

我是Solr的新手,我正在努力导入一些不包含ID字段的XML数据,虽然它是必需的,因为它描述了我的schema.xml:

XML示例:

<results>
<estacions>
<estacio id="72400" nom="Aeroport"/>
<estacio id="79600" nom="Arenys de Mar"/>
...
</estacions>
</results>

Schema.xml的:

<uniqueKey>id</uniqueKey>

此时,我需要从http fetch导入这个xml,然后我使用DataimportHandler。 这是我的data-config.xml

<dataConfig>
    <dataSource type="URLDataSource" />
    <document>
            <entity name="renfe"                        
                    url="http://host_url/myexample.xml"
                    processor="XPathEntityProcessor"
                    forEach="/results/estacions/estacio"
                    transformer="script:generateCustomId">
                    <field column="idestacio"   xpath="/results/estacions/estacio/@id" commonField="true" />
                    <field column="nomestacio"  xpath="/results/estacions/estacio/@nom" commonField="true" />
            </entity>
    </document>

然后,它似乎工作正常,但我得到以下错误: org.apache.solr.common.SolrException:[doc = null]缺少必填字段:id

这让我觉得我应该在导入时生成一个自动id,并使用data-config.xml,但我不知道如何去做。

我该怎么办?使用ScriptTransformer?任何想法都很感激

另一个问题:我可以在导入过程中强制输入值吗?

对于ex:<field column="site" value="estacions"/>(显然这不起作用)

1 个答案:

答案 0 :(得分:7)

您可以使用以下代码生成ID:

<dataConfig>
  <script><![CDATA[
        id = 1;
        function GenerateId(row) {
            row.put('id', (id ++).toFixed());
            return row;
        }
       ]]></script>
    <dataSource type="URLDataSource" />
    <document>
            <entity name="renfe"                        
                    url="http://host_url/myexample.xml"
                    processor="XPathEntityProcessor"
                    forEach="/results/estacions/estacio"
                    transformer="script:GenerateId">
                    <field column="idestacio"   xpath="/results/estacions/estacio/@id" commonField="true" />
                    <field column="nomestacio"  xpath="/results/estacions/estacio/@nom" commonField="true" />
            </entity>
    </document>