2012-01-12 11 views
3

をSolrInputDocumentする(ファイルごとに1つのドキュメントを持つ):パースのSolr xmlファイルが

<add> 
    <doc> 
    <field name="id">GB18030TEST</field> 
    <field name="name">Test with some GB18030 encoded characters</field> 
    <field name="features">No accents here</field> 
    <field name="features">ÕâÊÇÒ»¸ö¹¦ÄÜ</field> 
    <field name="price">0</field> 
    </doc> 
</add> 

は簡単SolrInputDocumentにそのファイルをマーシャリングする方法はありませんか?私は自分自身を解析する必要がありますか?

編集:私は...私はSolrJでそれをインデックス化する前にいくつかのフィールドを変更したいJavaのPOJOの原因に

+0

個々のXMLファイルは誰が書き込みますか?君は?誰か? – javanna

+0

もちろん他の誰か – Persimmonium

+0

あまりにも悪い! [solrj annotations](http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr)でjava beanを直接使うことができたので私は疑問に思っていた – javanna

答えて

1

これはプログラム的に最適です。私はあなたがJavaソリューションを探していることを知っていますが、私は個人的にgroovyをお勧めします。

次のスクリプトは、現在のディレクトリにある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/"); 

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

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

     xml.doc.each { 
      SolrInputDocument doc = new SolrInputDocument(); 

      it.field.each { 
       doc.addField([email protected](), it.text()) 
      } 

      server.add(doc) 
     } 
    } 

} 

server.commit() 
+0

は、それぞれをテキスト文書として追加します。面白い –

4

EDITそれを必要とする:POJOにXMLを変換するためにを、この前のSOの質問を参照してください - Is there a library to convert Java POJOs to and from JSON and XML?

文書がすでに予期された形式になっているので、Solr Tutorial - Indexing Dataのようにpost.jarまたはpost.shスクリプトファイルを使用して、両方とも入力としてXMLファイルを受け入れることができます。

また、SolrJ ClientUtilsライブラリには、toSolrInputDocument()メソッドがあり、これが役立つ可能性があります。 toSolrInputDocument()メソッドを使用するには、SolrDocumentクラスにファイルをマーシャリングする必要があると考えられます。

+0

私の編集を参照してください、私はJavaでそれを必要とします... – Persimmonium

+0

質問に編集する。 –

1

Javaではこれを行うことができます。

private void populateIndexFromXmlFile(String fileName) throws Exception { 

    UpdateRequest update = new UpdateRequest(); 

    update.add(getSolrInputDocumentListFromXmlFile(fileName)); 

    update.process(server); 

    server.commit(); 
} 

private List<SolrInputDocument> getSolrInputDocumentListFromXmlFile(
     String fileName) throws Exception { 

    ArrayList<SolrInputDocument> solrDocList = new ArrayList<SolrInputDocument>(); 

    File fXmlFile = new File(fileName); 

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(fXmlFile); 

    NodeList docList = doc.getElementsByTagName("doc"); 

    for (int docIdx = 0; docIdx < docList.getLength(); docIdx++) { 

     Node docNode = docList.item(docIdx); 

     if (docNode.getNodeType() == Node.ELEMENT_NODE) { 

      SolrInputDocument solrInputDoc = new SolrInputDocument(); 

      Element docElement = (Element) docNode; 

      NodeList fieldsList = docElement.getChildNodes(); 

      for (int fieldIdx = 0; fieldIdx < fieldsList.getLength(); fieldIdx++) { 

       Node fieldNode = fieldsList.item(fieldIdx); 

       if (fieldNode.getNodeType() == Node.ELEMENT_NODE) { 

        Element fieldElement = (Element) fieldNode; 

        String fieldName = fieldElement.getAttribute("name"); 
        String fieldValue = fieldElement.getTextContent(); 

        solrInputDoc.addField(fieldName, fieldValue); 
       } 

      } 

      solrDocList.add(solrInputDoc); 
     } 
    } 

    return solrDocList; 

} 
関連する問題