【问题标题】:Sphinx main/delta indexing, sql_query_killlistSphinx 主/增量索引,sql_query_killlist
【发布时间】:2024-01-04 18:30:01
【问题描述】:

我目前正在使用 Sphinx 为包含 20+ 百万条记录的 MySQL 查询建立索引。

我正在使用增量索引来更新主索引并添加所有新记录。

不幸的是,对表的所有更改都被删除了。

我知道我可以使用 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
}

注意所有其他设置是如何从主目录复制的, 但是源和路径被覆盖(它们必须是) 索引增量:主要

{
    source = delta
    path = /path/to/delta
}

【问题讨论】:

  • 您的文档表上是否有要捕获更新和删除的列?没有它,killlist 将难以实施。

标签: mysql sphinx delta


【解决方案1】:

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

 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 中,这样它们就不会出现在搜索结果中。

如果要捕获更新的记录,需要将新行安排在增量的主 sql_query 中,并将它们的 id 放在 kill-list 中。

【讨论】:

  • 嗨,巴里。如果某项已从我的表格中删除,我该如何选择?
  • 好吧,如果你真的“删除”而不是仅仅改变某种状态标志。然后,您将需要另一种方法来获取已删除记录的列表。当您在应用程序中删除文档时,可以将 id 插入到新表中。并使用它?
  • 我现在很清楚巴里,谢谢。我将添加一个包含主表中所有已删除 ID 的表。我可以为我的杀戮列表做一个 select * from table。该行实际上是否从索引中删除?还是只被忽略?
  • 杀死列表只是从结果集中杀死它,它仍然在实际索引中。 searchd 通常不会在索引器创建索引后修改索引。 (UpdateAttributes 基本上是唯一的例外)
  • 值得一提的是“给定索引的 Kill-list 会抑制其他索引的结果,具体取决于查询中的索引顺序”[来源:sphinxsearch.com/docs/current.html#conf-sql-query-killlist]