【问题标题】:sphinxsearch Delta index updatessphinxsearch 增量索引更新
【发布时间】:2017-06-14 08:44:39
【问题描述】:

我对 Delta-index 更新有疑问。
如果文档 id 小于max_doc_id,则不包含在 delta-index 中,因此只要未更新 main-index,更改将不会应用此数据。
假设我们有 1000 个数据。
如果第 50 个文档发生更改,则 delta-index 将不会发生更改。
delta-index 将如何包含其 id 小于 max_doc_id 的文档更改?
有没有办法让 delta-index 包含更新的数据,这样我们就不必等待 main-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 )
}

【问题讨论】:

    标签: sphinx delta-index


    【解决方案1】:

    我喜欢的一个非常简单的方法就是添加一个时间戳列以自动跟踪更改的文档。

    添加一列...

    ALTER TABLE documents 
       ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
       INDEX(updated);
    

    默认值也很重要,所以新创建的文档也包含在中。

    然后可以在查询中使用它,并带有一个终止列表。主要将包括索引时的所有文档。但增量将包括新的和更改的文档。 kill list 意味着 main 中的 old 版本被忽略。

    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 使用索引中的所有文档作为杀死列表)

    【讨论】:

      【解决方案2】:

      如果您想跟踪文档更新和插入,您应该有一个单独的列用于文档修订。修订值在整个文档表中应该是唯一的,因此最好使用全局序列来生成它们。

      当您更新现有文档或插入新文档时,您应该从修订序列中获取下一个值并将其保存在文档修订列中。有时,为自动修订更新设置数据库触发器是个好主意。

      然后在sql_query_pre 部分中,您可以将最小和最大修订值保存到sph_counter 表中,并使用它们来创建适当的增量索引。

      【讨论】:

      • 嗯,它与使用时间戳非常相似,只是显式地维护一个递增序列。每次更新文档时都会明确更新修订版。相同的结果 - 将有办法找到哪些文件已更改。两者都行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2021-06-19
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多