Sql Lucene中无唯一键的多表联接增量索引数据库数据的方法
我有一个特定的SQL连接,以便:Sql Lucene中无唯一键的多表联接增量索引数据库数据的方法,sql,lucene,Sql,Lucene,我有一个特定的SQL连接,以便: select DISTINCT ... 100 columns from ... 10 tabes, some left joins 目前,我使用Toad将此查询的结果导出为XML(稍后我将直接从Java进行查询)。我使用Java解析XML文件,并使用Lucene(Java)对其进行索引和搜索Lucene索引。这非常有效:我得到的结果比从数据库查询结果快6-10倍 我需要想出一种方法,当数据库中的数据发生变化时,增量地更新这个索引 因为我正在连接表(特别是左连
select DISTINCT ... 100 columns
from ... 10 tabes, some left joins
目前,我使用Toad将此查询的结果导出为XML(稍后我将直接从Java进行查询)。我使用Java解析XML文件,并使用Lucene(Java)对其进行索引和搜索Lucene索引。这非常有效:我得到的结果比从数据库查询结果快6-10倍
我需要想出一种方法,当数据库中的数据发生变化时,增量地更新这个索引
因为我正在连接表(特别是左连接),所以我不确定是否可以获得唯一的业务键组合来执行增量更新。另一方面,因为我使用的是DISTINCT,所以我知道每个字段都是唯一的组合。有了这些信息,我想我可以将文档的hashCode
作为文档的一个字段,然后在IndexWriter
上调用updateDocument
,如下所示:
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
实际上是用匹配的哈希代码删除文档,然后再次添加相同的文档,所以这没有任何用处
怎么做?Lucene没有“更新”文档的概念。因此,更新或添加本质上就是删除+添加
您可以在此处跟踪进度-
因此,您需要在应用程序中保留doc.hashCode()的逻辑,即如果您知道没有值发生更改,则不要要求lucene为文档编制索引(您可以有一组hashCode值,如果它与之匹配,则该文档没有更改)。您可能还需要一个跟踪删除的逻辑
如果在源数据库表的每次相关更新中增加一个id
如果在删除记录时记录这些ID
然后,您应该能够列出已删除、更新和新记录
您的数据正在被索引
此步骤可在临时表中执行,
本身被提取到xml文件中,用作lucene的输入