首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sphinxsearch增量索引更新

sphinxsearch增量索引更新
EN

Stack Overflow用户
提问于 2017-06-14 16:44:40
回答 2查看 359关注 0票数 0

我有一个关于增量索引更新的问题。

如果文档id小于max_doc_id,则不包括在增量索引中,因此只要不更新主索引,更改就不会应用此数据。

假设我们有1000个数据。

如果更改了50个文档,则增量索引中不会有任何更改。

增量索引将如何包含id小于max_doc_id的文档更改

有没有一种方法可以更新包含数据的增量索引,这样我们就不必等待主索引运行?

代码语言:javascript
复制
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 )
}
EN

回答 2

Stack Overflow用户

发布于 2017-06-14 22:15:56

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

添加列...

代码语言:javascript
复制
ALTER TABLE documents 
   ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   INDEX(updated);

默认值也很重要,因此还包括新创建的文档。

然后可以只在查询中使用它,并带有一个删除列表。main将包括索引时的所有文档。但增量将包括新的和更改的文档。删除列表表示main中的旧版本被忽略。

代码语言:javascript
复制
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一起简化。在许多方面,你不得不在kill列表中重复查询,这是一种遗憾。不能简单地告诉sphinx使用索引中的所有文档作为终止列表)

票数 1
EN

Stack Overflow用户

发布于 2017-06-14 20:19:01

如果要跟踪文档更新和插入,则应该为文档修订设置单独的列。修订值在整个文档表中应该是唯一的,所以最好使用全局序列来生成它们。

更新现有文档或插入新文档时,应从修订序列中获取下一个值,并将其保存在文档修订列中。有时,让DB触发器用于自动修订更新是一个好主意。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44539776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档