Sphinx:实时搜索是否有过期?

时间:2015-11-21 20:20:18

标签: sphinx

我正在设计一个搜索,每天将提供大约50到200 GB的文本数据(类似于日志),它只需要保留一到两周的数据。这些数据将以恒定速率(例如5,000 /每秒),每天24小时不间断地传输。一两个星期之后,文档应该从索引中删除,再也不会被听到。

索引应该只能在1个字段中搜索自由格式文本(大小非常小,最多大约512个字符)。最多,架构可以有2个可以分类的属性。

系统需要在数据输入时近乎实时地编制索引。延迟15到30秒是可以接受的。

我们更倾向于使用恒定的管道数据流将数据流式传输到索引器/服务中。

最后,单个独立解决方案优先于任何类型的分发设置(这将是在本地计算机上为测试人员部署和设置的程序包的一部分)。

我正在通过API密切关注Sphinx搜索引擎的RT更新,因为它会检查大部分内容。但是,在一段时间后,我没有看到一种简单的方法来使文档过期。

我知道我可以跟踪ID和时间戳,并通过Sphinx API发出批处理DELETE。但是,这会产生在单独的数据存储中跟踪大量ID的问题,这些数据存储需要相同类型的5,000 /每秒插入并在完成后删除它们。

我还关注大众插入的Sphinx Fragmentation,以及插入过程中的大量删除。

我们真的更喜欢搜索引擎/索引器来处理过期本身。

我想我可以执行WHERE时间戳< UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO作为Sphinx API中的where子句,用于收集要删除的文档ID。问题在于,如果系统没有停留在删除的顶部,那么文件/搜索结果的总数将在数百万之内,如果必须收集几天,则在两周的时间范围内甚至数十亿甚至数十亿值得删除的文件ID。这不是一个可行的查询。

1 个答案:

答案 0 :(得分:2)

你可以实际运行

 DELETE FROM rt WHERE timestamp < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO

作为删除旧文档的查询,这更简单:)

您还需要不时致电OPTIMIZE INDEX

这些都必须在某种'cron'时间表上调用,因为它们不会自动运行。

最好不要使用Sphinxes DELETE功能。在编写RT索引时,只要RAM块已满,就会将其写为磁盘块。因此,您最终会在磁盘上安装许多磁盘块。最旧的文档将按顺序排列在最旧的块中。

因此,要清除最旧的文档,您可以处理最旧的块。 (滚动)

问题是sphinx不包含删除单个块的功能。

需要关闭searchd,删除chunk,操纵头文件然后重启Sphinx。不是一个简单的过程。

但从一般意义上讲,不确定狮身人面像是否能够跟上每秒5000个/文件的连续流量(甚至暂时忽略删除) - Sphinx通常设计用于不经常写入,读取 - 经常。它构建了一个(大部分)整体倒排索引。这非常适合查询,但很难保持更新。它不适合增量更新。

相关问题