0

我有一个特定的 SQL 连接,这样:

select DISTINCT ... 100 columns
from ... 10 tabes, some left joins

目前,我使用 Toad 将此查询的结果导出到 XML(稍后我将直接从 Java 中查询)。我使用 Java 解析 XML 文件,并使用 Lucene (Java) 对其进行索引并搜索 Lucene 索引。这很好用:我得到的结果比从数据库中查询快 6-10 倍。

我需要想办法在数据库中的数据发生变化时增量更新这个索引。

因为我正在加入表(尤其是左连接),所以我不确定我能否获得一个独特的业务组合键来进行增量更新。另一方面,因为我使用的是 DISTINCT,所以我知道每个字段都是唯一的组合。鉴于此信息,我想我可以将hashCode文档的字段作为文档的字段,并updateDocumentIndexWriter这样调用:

public static void addDoc(IndexWriter w, Row row) throws IOException {
    //Row is simply a java representation of a single row from the above query
    Document document = new Document();
    document.add(new StringField("fieldA", row.fieldA, Field.Store.YES));
    ...
    String hashCode = String.valueOf(document.hashCode());
    document.add(new StringField("HASH", hashCode, Field.Store.YES));
    w.updateDocument(new Term("HASH", hashCode), document);
}

然后我意识到这updateDocument实际上是删除具有匹配哈希码的文档并再次添加相同的文档,所以这没有任何用处。

解决这个问题的方法是什么?

4

2 回答 2

0

Lucene 没有“更新”文档的概念。所以更新或添加本质上是删除+添加。

你可以在这里跟踪进度 - https://issues.apache.org/jira/browse/LUCENE-4258

因此,您需要在您的应用程序中保留 doc.hashCode() 的逻辑,即如果您知道没有值已更改,请不要让 lucene 索引文档(您可以拥有一组 hashCode 值,如果它匹配,那么文件没有改变)。您可能还希望有一个跟踪删除的逻辑

于 2013-09-28T03:35:40.630 回答
0

如果您在源数据库表的每个相关更新上增加一个 id,并且如果您在删除记录时记录这些 id,

然后,您应该能够列出被索引的数据的已删除、更新和新记录。

此步骤可能在一个临时表中执行,该表本身被提取到用作 lucene 输入的 xml 文件中。

于 2016-10-08T15:13:20.393 回答