2012-08-09 84 views
2

我目前正在使用Sphinx索引一个具有2000万以上记录的MySQL查询。狮身人面像主/三角洲索引,sql_query_killlist

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

不幸的是,对表格所做的更改将被删除。

我知道我可以使用sql_query_killlist来获取需要删除或更新的所有文档ID。不幸的是,我不明白这是如何实际工作的,Sphinx的文档没有足够的例子让我理解。

如果我使用下面的例子,我该如何实现kilist?

在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 
} 

记下所有其他设置如何从主, 复制,但源和路径覆盖(他们必须是) 指数delta:主要

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

您是否有列可以捕获文档表上的更新和删除?没有它,这个kilist将难以实施。 – Imraan 2012-08-11 04:04:51

回答

5

的具体情况取决于你如何标记删除的文件很多。但想补充像

sql_query_killist = SELECT ID从文档中WHERE状态= '已删除' 和id = <(SELECT max_doc_id FROM sph_counter WHERE counter_id = 1)

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

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

+0

嗨巴里。我如何选择某些东西,如果它从我的表中删除? – 2012-08-09 22:05:30

+0

那么,如果你真的做'删除',而不是只是改变某种状态标志。那么你将需要另一种方式来获得记录删除列表。在应用程序中删除文档时,可以将该ID插入新表中。并用它? – barryhunter 2012-08-10 12:41:23

+0

现在我明白巴里,谢谢。 我打算添加一个由主表中所有被删除的ID组成的表。我可以从表格中选择*作为我的杀人名单。 该行是否真的从索引中被删除?还是只忽略? – 2012-08-12 08:27:58