Нужна помощь в индексации XML-файлов в Solr с помощью DataImportHandler

Я не знаю Java, я не знаю XML, и я не знаю Lucene. Теперь, когда это не так. Я работал над созданием небольшого проекта, используя apache solr/lucene. Моя проблема в том, что я не могу проиндексировать XML-файлы. Я думаю, что понимаю, как это должно работать, но я могу ошибаться. Я не уверен, какая информация требуется для вас, чтобы помочь мне, поэтому я просто опубликую код.

<dataConfig>
<dataSource type="FileDataSource" encoding="UTF-8" />
<document>
<!-- This first entity block will read all xml files in baseDir and feed it into the second entity block for handling. -->
<entity name="AMMFdir" rootEntity="false" dataSource="null"
        processor="FileListEntityProcessor"
        fileName="^*\.xml$" recursive="true"
        baseDir="C:\Documents and Settings\saperez\Desktop\Tomcat\apache-tomcat-7.0.23\webapps\solr\data\AMMF_New"
        >
<entity 
        processor="XPathEntityProcessor"
        name="AMMF"
        pk="AcquirerBID"
        datasource="AMMFdir"
        url="${AMMFdir.fileAbsolutePath}"
        forEach="/AMMF/Merchants/Merchant/"
        transformer="DateFormatTransformer, RegexTransformer"
        >

    <field column="AcquirerBID" xpath="/AMMF/Merchants/Merchant/AcquirerBID" />
    <field column="AcquirerName" xpath="/AMMF/Merchants/Merchant/AcquirerName" />
    <field column="AcquirerMerchantID" xpath="/AMMF/Merchants/Merchant/AcquirerMerchantID" />

</entity>
</entity>
</document>

Пример XML-файла

<?xml version="1.0" encoding="utf-8"?>
<AMMF xmlns="http://tempuri.org/XMLSchema.xsd" Version="11.2" CreateDate="2011-11-07T17:05:14" ProcessorBINCIB="422443" ProcessorName="WorldPay" FileSequence="18">
<Merchants Count="153">
    <Merchant ChangeIndicator="A" LocationCountry="840">
    <AcquirerBID>10029881</AcquirerBID>
    <AcquirerName>WorldPay</AcquirerName>
    <AcquirerMerchantID>*</AcquirerMerchantID>
    <Merchant ChangeIndicator="A" LocationCountry="840">
    <AcquirerBID>10029882</AcquirerBID>
    <AcquirerName>WorldPay2</AcquirerName>
    <AcquirerMerchantID>Hello World!</AcquirerMerchantID>
</Merchant>
</Merchants>

У меня есть это в схеме.

<field name="AcquirerBID" type="string" indexed="true" stored="true" required="true" /> 
<field name="AcquirerName" type="string" indexed="true" stored="true" />
<field name="AcquirerMerchantID" type="string" indexed="true" stored="true"/>

У меня есть это в конфиге.

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler" default="true" >
<lst name="defaults">
<str name="config">AMMFconfig.xml</str>
</lst>
</requestHandler>

3 ответа

Образец XML плохо сформирован. Это может объяснить ошибки при индексации файлов:

$ xmllint sample.xml
sample.xml:13: parser error : expected '>'
</Merchants>
          ^
sample.xml:14: parser error : Premature end of data in tag Merchants line 3
sample.xml:14: parser error : Premature end of data in tag AMMF line 2

Исправленный XML

Вот как я думаю, что ваши примерные данные должны выглядеть (не проверял XSD-файл)

<?xml version="1.0" encoding="utf-8"?>
<AMMF xmlns="http://tempuri.org/XMLSchema.xsd" Version="11.2" CreateDate="2011-11-07T17:05:14" ProcessorBINCIB="422443" ProcessorName="WorldPay" FileSequence="18">
  <Merchants Count="153">
    <Merchant ChangeIndicator="A" LocationCountry="840">
      <AcquirerBID>10029881</AcquirerBID>
      <AcquirerName>WorldPay</AcquirerName>
      <AcquirerMerchantID>*</AcquirerMerchantID>
    </Merchant>
    <Merchant ChangeIndicator="A" LocationCountry="840">
      <AcquirerBID>10029882</AcquirerBID>
      <AcquirerName>WorldPay2</AcquirerName>
      <AcquirerMerchantID>Hello World!</AcquirerMerchantID>
    </Merchant>
  </Merchants>
</AMMF>

Альтернативное решение

Я знаю, вы сказали, что вы не программист, но эта задача значительно упрощается, если вы используете интерфейс solrj.

Ниже приведен отличный пример, который индексирует ваш пример XML

//
// Dependencies
// ============
import org.apache.solr.client.solrj.SolrServer
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.apache.solr.common.SolrInputDocument

@Grapes([
    @Grab(group='org.apache.solr', module='solr-solrj', version='3.5.0'),
])

//
// Main
// =====

SolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");
def i = 1

new File(".").eachFileMatch(~/.*\.xml/) { 

    it.withReader { reader ->
        def ammf = new XmlSlurper().parse(reader)

        ammf.Merchants.Merchant.each { merchant ->
            SolrInputDocument doc = new SolrInputDocument();

            doc.addField("id",           i++)
            doc.addField("bid_s",        merchant.AcquirerBID)
            doc.addField("name_s",       merchant.AcquirerName)
            doc.addField("merchantId_s", merchant.AcquirerMerchantID)

            server.add(doc)
        }
    }

}

server.commit()

Groovy - это язык сценариев Java, который не требует компиляции. Это было бы так же просто, как и файл конфигурации DIH.

Часто лучшее, что можно сделать, это НЕ использовать DIH. Насколько сложно было бы просто опубликовать эти данные, используя API и пользовательский скрипт на языке, который вы знаете?

Преимущество такого подхода двояко:

  1. Вы узнаете больше о своей системе и узнаете ее лучше.
  2. Вы не тратите время, пытаясь понять DIH.

Недостатком является то, что вы немного изобретаете колесо, но DIH - вещь, которую нужно понять.

Чтобы выяснить, как работает импорт DIH XML, я предлагаю вам сначала внимательно прочитать эту главу в вики DIH: http://wiki.apache.org/solr/DataImportHandler.

Откройте ссылку Slashdot http://rss.slashdot.org/Slashdot/slashdot в своем браузере, затем щелкните правой кнопкой мыши на странице и выберите "Просмотр источника". В этом примере используется XML-файл. Сравните это с конфигурацией XPathEntityProcessor в примере DIH, и вы увидите, как легко импортировать любой файл XML в Solr.

Если вам нужна дополнительная помощь, просто спросите...

Другие вопросы по тегам