Анализатор XML + индексирование данных

Мне нужно проиндексировать некоторые XML-документы с помощью Lucene, но перед этим мне нужно проанализировать эти XML и извлечь некоторую информацию из их тегов.

XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<tt xml:lang="es" xmlns="http://www.w3.org/2006/04/ttaf1"  xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling">
  <head>
        <styling>
            <style id="bl" tts:fontWeight="bold" tts:color="#FFFFFF" tts:fontSize="15" tts:fontFamily="sansSerif"/>
       </styling>
  </head>

  <body>
    <div xml:lang="es">
            <p begin="00:00.50" end="00:04.02" style="bl">Info</p>
            <p begin="00:04.32" end="00:07.68" style="bl">Different words,<br />and phrases to index</p>
            <p begin="00:11.76" end="00:16.04" style="bl">Text</p>
            <p begin="00:18.52" end="00:22.88" style="bl">More and<br />more text</p>
   </div>
  </body>
</tt>

Мне нужно извлечь только метки времени внутри тегов begin и end, а затем проиндексировать текст внутри тегов p. Цель состоит в том, чтобы запросить проиндексированный текст и узнать, в каком промежутке временных меток находится каждое попадание.

Например, если я запрашиваю слово «Текст», вывод должен выглядеть примерно так: «2 совпадения, 00:11,76–00:16,04, 00:18,52–00:22,88».

Я начал индексировать весь XML с помощью Lucene. Теперь я хочу проанализировать файл, но я не уверен, что это лучшее приближение для решения этой проблемы.

Любая помощь или совет приветствуются :) Всем спасибо!


person Kitinz    schedule 20.06.2011    source источник


Ответы (2)


Я использовал библиотеку SAX (т.е. подкласс org.xml.sax.helpers.DefaultHandler ) для разбора XML-файлов, извлек нужную информацию из каждого XML-документа в свой собственный класс Document, а затем проиндексировал этот экземпляр Document. (Косвенное обращение было связано с наличием нескольких форматов документов, которые нужно было анализировать отдельно, но индексировать в одном и том же индексе.) В вашем случае, если содержимое каждого из ваших элементов ‹body› представляет собой логический документ, вы можете сохранить дату информация в виде полезной нагрузки, связанной с конкретными токенами. Проанализируйте XML до уровня ‹p›, перечислите экземпляры абзаца и для каждого экземпляра добавьте новый экземпляр Field с тем же именем, где значением является текст, а полезной нагрузкой является информация о дате, представленная соответствующим образом. (Полезные нагрузки являются двоичными, поэтому, например, вы можете хранить два длинных значения, соответствующие времени начала и окончания.) Когда вы добавляете в документ несколько экземпляров поля с одинаковым именем, они индексируются как одно и то же поле, но вы можно назначать разные полезные нагрузки для каждого экземпляра, можно настроить положение начала текста и т. д.

Если вам не нужно содержимое каждого элемента в виде отдельного документа, вы можете рассматривать каждый ‹p› как отдельный документ, а затем установить для него полезную нагрузку. Кроме того, вы можете хранить даты как отдельное поле.

person Gene Golovchinsky    schedule 20.06.2011
comment
Я немного изучил некоторые библиотеки синтаксических анализаторов и думаю, что собираюсь использовать SAX, так как мне нужно проанализировать все теги ‹p›, но каждый из этих тегов имеет разные значения в своих атрибутах. Я вернусь, если найду проблемы :D - person Kitinz; 21.06.2011

Я настоятельно рекомендую хранить весь ваш XML в базе данных eXist, которая имеет встроено в Lucene. Я использую эту комбинацию уже несколько месяцев, и она довольно легко решает множество проблем с поиском и поиском.

person Fred Foo    schedule 20.06.2011
comment
Я искал базу данных eXist, и мне кажется, что это очень хороший инструмент, но то, что мне нужно сделать прямо сейчас, совершенно не подходит для этой базы данных. В любом случае, спасибо за информацию :D - person Kitinz; 21.06.2011