0

我对 Delta-index 更新有疑问。
如果文档 id 小于max_doc_id, 不包含在 delta-index 中,所以只要 main-index 没有更新,更改将不会应用此数据。
假设我们有 1000 个数据。
如果第 50 个文档发生更改,则 delta-index 将不会发生更改。
delta-index 将如何包含其 id 小于的文档更改max_doc_id
有没有办法让 delta-index 包含更新的数据,这样我们就不必等待 main-index 运行?

CREATE TABLE sph_counter
(
    counter_id INTEGER PRIMARY KEY NOT NULL,
    max_doc_id INTEGER NOT NULL
);
source main
{
    # ...
    sql_query_pre = SET NAMES utf8
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
    sql_query = SELECT id, title, body FROM documents \
     WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

source delta : main
{
    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id, title, body FROM documents \
     WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
4

2 回答 2

1

我喜欢的一个非常简单的方法就是添加一个时间戳列来自动跟踪更改的文档。

添加一列...

ALTER TABLE documents 
   ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   INDEX(updated);

默认值也很重要,因此新创建的文档包括在内。

然后可以在查询中使用它,并带有一个终止列表。主要将包括索引时的所有文档。但增量将包括新的和更改的文档。kill list 意味着 main 中的版本被忽略。

CREATE TABLE sph_counter
(
    counter_id INTEGER PRIMARY KEY NOT NULL,
    max_doc_id INTEGER NOT NULL,
    indexing_time DATETIME NOT NULL
);
source main
{
    # ...
    sql_query_pre = SET NAMES utf8
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id), NOW() FROM documents
    sql_query = SELECT id, title, body FROM documents
}

source delta : main
{
    sql_query_pre = SET NAMES utf8

    sql_query = SELECT id, title, body FROM documents \
     WHERE updated > ( SELECT indexing_time FROM sph_counter WHERE counter_id=1 )

    sql_query_killlist = SELECT id FROM documents \
     WHERE updated > ( SELECT indexing_time FROM sph_counter WHERE counter_id=1 )
}

(就像杀戮列表一样,没有必要过滤主要的,重复的无关紧要。也不需要 max_doc_id - 所以 sph_counter 可以与 sql_query_pre 一起简化。在很多方面,你必须在杀戮列表中重复查询,这是一种耻辱。不能只告诉 sphinx 使用索引中的所有文档作为杀戮列表)

于 2017-06-14T14:15:56.233 回答
0

如果您想跟踪文档更新和插入,您应该有一个单独的列用于文档修订。修订值在文档表中应该是唯一的,因此最好使用全局序列来生成它们。

当您更新现有文档或插入新文档时,您应该从修订序列中获取下一个值并将其保存在文档修订列中。有时,使用数据库触发器进行自动修订更新是个好主意。

然后在sql_query_pre部分中,您可以将最小和最大修订值保存到sph_counter表中并使用它们来创建适当的增量索引。

于 2017-06-14T12:19:01.150 回答