mysql – Sphinx主/ delta索引,sql_query_killlist

我目前正在使用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
}

解决方法:

具体细节很大程度上取决于您如何标记已删除的文档.但只会添加类似的东西

 sql_query_killist = SELECT id FROM documents 
                     WHERE status='deleted' 
                           AND id<=( SELECT max_doc_id FROM sph_counter 
                                     WHERE counter_id=1 )

到三角洲指数.这将捕获主索引中已删除记录的ID,并将它们添加到killlist中,以便它们永远不会出现在搜索结果中.

如果想要捕获更新的记录,需要安排新的行包含在delta的主sql_query中,并将它们的id放在kill-list中.

上一篇:mysql – 当您向SQL添加数据时,Sphinx自动更新是否为索引?


下一篇:php – Sphinx搜索Reindex