XML解析器+索引数据

时间:2011-06-20 12:18:09

标签: java lucene xml-parsing apache-tika apache-commons-digester

我需要使用Lucene索引一些xml文档,但在此之前,我需要解析这些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>

我只需要提取标签开始和结束内的时间戳,然后索引p标签内的文本。目标是查询索引的文本,并知道每个时间戳间隔都被命中。

例如,如果我查询单词“Text”,输出应该是这样的:“2次点击,00:11.76-00:16.04,00:18.52-00:22.88”

我开始使用Lucene索引整个XML。现在我想解析文件,但我不确定什么是解决这个问题的最佳近似值。

欢迎任何帮助或建议:) 谢谢大家!

2 个答案:

答案 0 :(得分:3)

我强烈建议将所有XML存储在eXist数据库中,该数据库具有Lucene built-in。我已经使用这个组合几个月了,它很容易解决很多搜索和检索问题。

答案 1 :(得分:3)

我使用SAX library(即org.xml.sax.helpers.DefaultHandler的子类)来解析XML文件,从每个XML文档中将所需信息提取到我自己的Document类中,然后将其编入索引文档实例。 (间接是由于有多个文档格式必须单独解析,但索引在同一索引中。)在您的情况下,如果您的每个&lt; body&gt;的内容。 elements表示逻辑文档,您可以将日期信息存储为与特定标记关联的有效负载。将XML解析为&lt; p&gt; level,枚举段落实例,并为每个实例添加一个具有相同名称的新Field实例,其中值为文本,有效负载是适当表示的日期信息。 (有效负载是二进制的,因此,例如,您可以存储对应于开始和结束时间的两个长值。)当您向文档添加多个具有相同名称的字段实例时,它们会被索引为相同的字段,但是您可以为每个实例分配不同的有效负载,您可以调整文本开头的位置等。

如果您不需要将每个元素的内容作为单个文档,则可以将每个元素视为&lt; p&gt;作为单独的文档,然后在其上设置有效负载。或者,您可以将日期存储为单独的字段。