文档中的Sphinx delta索引示例似乎并不正确

时间:2014-08-14 16:49:59

标签: sphinx

The Sphinx documentation说使用这样的delta索引:

# in MySQL
CREATE TABLE sph_counter
(
    counter_id INTEGER PRIMARY KEY NOT NULL,
    max_doc_id INTEGER NOT NULL
);

# in 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 )
}

index main
{
    source = main
    path = /path/to/main
    # ... all the other settings
}

# note how all other settings are copied from main,
# but source and path are overridden (they MUST be)
index delta : main
{
    source = delta
    path = /path/to/delta
}

为什么在运行增量索引后没有更新max_doc_id

除非我遗漏了某些内容,否则无论何时使用上述配置运行增量索引,它都会反复重新索引相同的记录,直到主索引运行为止。

如果主索引经常运行,这不是问题,但是(作为一个极端的例子)如果主索引永远不会再运行,那么delta索引基本上会遇到与非delta索引相同的问题,对吗?

1 个答案:

答案 0 :(得分:1)

示例是正确的,每次重建索引器时,都需要包含MAIN中没有的所有记录。

因此,如果ID由delta更新,则记录将消失。 (即不是主要的,下次重建时不会出现在三角洲)

构建索引是一项全有或全无的工作。无法运行SQL查询以获取附加到索引末尾的新记录。

......这就是主要+三角洲计划的原因。所以你不必每次索引所有记录。大多数人住在MAIN,这只是DELTA的一部分,所以复制不是太糟糕。


是的,您也会不时更新主页。也许每天或每周 - 取决于没有文件的数量。


因为人们不喜欢这个方案,是开发RT索引的主要原因,你不需要管理多个索引,只需要与一个索引进行交互。 (引擎盖下的sphinx仍然保持单独的索引,因此每次添加/删除文档时都不必更新所有内容