Lucene 7指数TREC

时间:2018-02-15 13:06:11

标签: java lucene

我在Lucene 7中索引TREC时遇到了困难。到目前为止,我只需要使用像演示所描述的InputStreamReader轻松存档的索引文本文件。

/** Indexes a single document */
static void indexDoc(IndexWriter writer, Path file, long lastModified) throws IOException {
try (InputStream stream = Files.newInputStream(file)) {
  // make a new, empty document
  Document doc = new Document();

  Field pathField = new StringField("path", file.toString(), ld.Store.YES);
  doc.add(pathField);

  doc.add(new LongPoint("modified", lastModified));

  doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))));

  if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
    System.out.println("adding " + file);
    writer.addDocument(doc);
  } else {
    System.out.println("updating " + file);
    writer.updateDocument(new Term("path", file.toString()), doc);
  }
}
}

但TREC有不同的标签,用于存储与搜索结果无关的信息。喜欢Header Title DocNo等等。如何调整此代码以使用适当的内容在自己的文本字段中保存特定标记?

1 个答案:

答案 0 :(得分:0)

自从找到解决方案后回答我自己的问题。这可能不是最优化的,绝不是最好看的。

我的解决方案是获取complet InputStream并逐步阅读它,如果在这里找到某个标签,则执行适当的操作:

        BufferedReader in = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));              
        while ((read = in.readLine()) != null) {

            String[] splited = read.split("\\s+");              
            boolean text = false;

            for (String part : splited) {
                if (part.equals(new String("<TEXT>"))) {
                    text = true;
                }
         }

这个解决方案可以解决我的问题,但我相当肯定有一个更好看的解决方案。