我有一个关于增量索引更新的问题。
如果文档id小于max_doc_id,则不包括在增量索引中,因此只要不更新主索引,更改就不会应用此数据。
假设我们有1000个数据。
如果更改了50个文档,则增量索引中不会有任何更改。
增量索引将如何包含id小于max_doc_id的文档更改
有没有一种方法可以更新包含数据的增量索引,这样我们就不必等待主索引运行?
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 )
}发布于 2017-06-14 22:15:56
我喜欢的一种非常简单的方法就是在中添加一个时间戳列,自动跟踪更改的文档。
添加列...
ALTER TABLE documents
ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX(updated);默认值也很重要,因此还包括新创建的文档。
然后可以只在查询中使用它,并带有一个删除列表。main将包括索引时的所有文档。但增量将包括新的和更改的文档。删除列表表示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一起简化。在许多方面,你不得不在kill列表中重复查询,这是一种遗憾。不能简单地告诉sphinx使用索引中的所有文档作为终止列表)
发布于 2017-06-14 20:19:01
如果要跟踪文档更新和插入,则应该为文档修订设置单独的列。修订值在整个文档表中应该是唯一的,所以最好使用全局序列来生成它们。
更新现有文档或插入新文档时,应从修订序列中获取下一个值,并将其保存在文档修订列中。有时,让DB触发器用于自动修订更新是一个好主意。
然后,在sql_query_pre部分中,您可以将最小和最大修订值保存到sph_counter表中,并使用它们创建适当的增量索引。
https://stackoverflow.com/questions/44539776
复制相似问题