我对Delta-index更新有疑问
如果文档ID小于max_doc_id
,则不包含在delta-index中,因此只要主索引未更新,更改将不会应用此数据。
假设我们有1000个数据
如果更改了第五十个文档,则delta-index将不会发生变化
delta-index如何包含其id小于max_doc_id
的文档更改?
有没有一种方法,delta-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 )
}
答案 0 :(得分:1)
我喜欢的一个非常简单的方法就是在自动跟踪已更改的文档时添加时间戳列。
添加一栏......
ALTER TABLE documents
ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX(updated);
默认值也很重要,因此新创建的文档也包含 。
然后可以在查询中使用它,使用kill列表。主要内容包括索引编制时的所有文件。但delta将包括新的和更改的文档。 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将索引中的所有文档用作杀戮列表)
答案 1 :(得分:0)
如果要跟踪文档更新以及插入,则应该有一个单独的列用于文档修订。修订值在整个文档表中应该是唯一的,因此最好使用全局序列来生成它们。
更新现有文档或插入新文档时,应从修订序列中获取下一个值并将其保存在文档修订列中。有时,使用DB触发器进行自动修订更新是个好主意。
然后在sql_query_pre
部分中,您可以将最小和最大修订值保存到sph_counter
表中,并使用它们来创建正确的增量索引。