анализировать XML-файлы Solr в SolrInputDocument - PullRequest
4 голосов
/ 12 января 2012

Если у меня есть отдельные файлы в ожидаемом формате Solr (только один документ на файл):

<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? Должен ли я сам выполнять разбор?

РЕДАКТИРОВАТЬ: мне это нужно в Java Pojo, потому что я хочу изменить некоторые поля, прежде чем индексировать его с помощью SolrJ ...

Ответы [ 3 ]

4 голосов
/ 12 января 2012

РЕДАКТИРОВАТЬ: Для преобразования XML в POJO, пожалуйста, обратитесь к этому предыдущему вопросу SO - Существует ли библиотека для преобразования Java POJO в и из JSON и XML?

Поскольку у вас уже есть документы в ожидаемом формате, вы можете просто использовать файл сценария post.jar или post.sh, как показано в Solr Tutorial - Indexing Data , которые оба принимают файлы XML в качестве входных данных.

Кроме того, в библиотеке SolrJ ClientUtils есть метод toSolrInputDocument () , который может быть полезен для вас.Разумеется, вам потребуется маршалировать файлы в класс SolrDocument, чтобы использовать метод toSolrInputDocument().

2 голосов
/ 22 мая 2014

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

}
1 голос
/ 17 января 2012

Лучше всего это сделать программно.Я знаю, что вы ищете решение 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(it.@name.text(), it.text())
            }

            server.add(doc)
        }
    }

}

server.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...