我目前正在使用Sphinx为拥有2000多万条记录的MySQL查询编制索引。
我使用delta索引来更新主索引并添加所有新记录。
不幸的是,删除了对表的所有更改。
据我所知,我可以使用sql_query_killlist来获取需要删除或更新的所有文档ID。不幸的是,我不明白这实际上是如何工作的,而且Sphinx的文档没有一个足够好的例子供我理解。
如果我使用以下示例,我该如何实现killlist?
MySQL中的
CREATE TABLE sph_counter
(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);
在sphinx.conf中
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 )
}
索引主
{
source = main
path = /path/to/main
# ... all the other settings
}
注意所有其他设置是如何从main复制的, 但是源和路径被覆盖(它们必须是) index delta:main
{
source = delta
path = /path/to/delta
}
答案 0 :(得分:6)
具体细节很大程度上取决于您如何标记已删除的文档。但只会添加类似
的内容 sql_query_killist = SELECT id FROM documents
WHERE status='deleted'
AND id<=( SELECT max_doc_id FROM sph_counter
WHERE counter_id=1 )
到 delta 索引。这将捕获主索引中已删除记录的ID,并将它们添加到killlist中,以便它们永远不会出现在搜索结果中。
如果想要捕获更新的记录,需要安排新的行包含在delta的主sql_query中,并将它们的id放在kill-list中。