Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Lucene中无唯一键的多表联接增量索引数据库数据的方法_Sql_Lucene - Fatal编程技术网

Sql Lucene中无唯一键的多表联接增量索引数据库数据的方法

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倍 我需要想出一种方法,当数据库中的数据发生变化时,增量地更新这个索引 因为我正在连接表(特别是左连

我有一个特定的SQL连接,以便:

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的输入