Sphinx:实时搜索 w/Expiration?
Sphinx: Real-Time Search w/Expiration?
我正在设计一个每天将提供大约 50 到 200 GB 文本数据(类似于日志)的搜索,并且它只需要将该数据保留一两周。该数据将以恒定速率(例如 5,000/秒)、一天 24 小时不间断地传输。一两周后,该文档应该从索引中删除,再也听不到了。
索引应该可以在 1 个字段中使用自由格式文本进行搜索(非常小,最多约 512 个字符)。模式最多可以有 2 个可以分类的属性。
系统需要在数据输入时近乎实时地编制索引。 15 到 30 秒的延迟是可以接受的。
我们更喜欢使用恒定的管道数据流将数据流式传输到 indexer/service。
最后,单个独立解决方案优于任何类型的分发设置(这将是要在本地计算机上为测试人员部署和设置的包的一部分)。
我正在通过 API 仔细查看带有 RT 更新的 Sphinx 搜索引擎,因为它会检查其中的大部分内容。但是,我没有看到在一定时间后使文档过期的简单方法。
我知道我可以跟踪 ID 和时间戳并通过 Sphinx API 发出批量删除。但是,这会产生一个问题,即在单独的数据存储中跟踪大量 ID,这将需要同样类型的每秒 5,000 次插入并在完成后将其删除。
我也担心大量插入的 Sphinx 碎片,以及插入过程中的大量删除。
我们真的更喜欢搜索 engine/indexer 来处理过期本身。
我想我可以执行 WHERE 时间戳 < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO 作为 Sphinx API 中的 where 子句,以便收集要删除的文档 ID。这样做的问题是,如果系统不掌握删除内容,documents/search 结果的总数将达到数百万,如果必须收集一个两周的时间框架,甚至可能达到数十亿。几天值得删除的文档 ID。这不是一个可行的查询。
其实你可以运行
DELETE FROM rt WHERE timestamp < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO
作为删除旧文档的查询,这样就简单多了:)
您还需要不时致电 OPTIMIZE INDEX
。
这两个都必须按某种 'cron' 时间表调用,因为它们不会 运行 自动调用。
您最好根本不使用 Sphinxes 的 DELETE 功能。写入 RT 索引时,一旦 RAM 块已满,它就会作为磁盘块写出。所以你最终在磁盘上有许多磁盘块。最旧的文档将按顺序位于最旧的块中。
因此,要清除最旧的文档,您可以只处理最旧的块。 (滚动)
问题是 sphinx 不包含删除单个块的功能。
将需要关闭 searchd,删除块,操作头文件,然后重新启动 Sphinx。这不是一个简单的过程。
但在更一般的意义上,不确定 sphinx 是否能够跟上每秒 5,000/文档的连续流(甚至暂时忽略删除)- Sphinx 通常是为不经常写入而设计的,经常阅读。它构建了一个(大部分)整体倒排索引。这非常适合查询,但很难保持更新。它不适合增量更新。
我正在设计一个每天将提供大约 50 到 200 GB 文本数据(类似于日志)的搜索,并且它只需要将该数据保留一两周。该数据将以恒定速率(例如 5,000/秒)、一天 24 小时不间断地传输。一两周后,该文档应该从索引中删除,再也听不到了。
索引应该可以在 1 个字段中使用自由格式文本进行搜索(非常小,最多约 512 个字符)。模式最多可以有 2 个可以分类的属性。
系统需要在数据输入时近乎实时地编制索引。 15 到 30 秒的延迟是可以接受的。
我们更喜欢使用恒定的管道数据流将数据流式传输到 indexer/service。
最后,单个独立解决方案优于任何类型的分发设置(这将是要在本地计算机上为测试人员部署和设置的包的一部分)。
我正在通过 API 仔细查看带有 RT 更新的 Sphinx 搜索引擎,因为它会检查其中的大部分内容。但是,我没有看到在一定时间后使文档过期的简单方法。
我知道我可以跟踪 ID 和时间戳并通过 Sphinx API 发出批量删除。但是,这会产生一个问题,即在单独的数据存储中跟踪大量 ID,这将需要同样类型的每秒 5,000 次插入并在完成后将其删除。
我也担心大量插入的 Sphinx 碎片,以及插入过程中的大量删除。
我们真的更喜欢搜索 engine/indexer 来处理过期本身。
我想我可以执行 WHERE 时间戳 < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO 作为 Sphinx API 中的 where 子句,以便收集要删除的文档 ID。这样做的问题是,如果系统不掌握删除内容,documents/search 结果的总数将达到数百万,如果必须收集一个两周的时间框架,甚至可能达到数十亿。几天值得删除的文档 ID。这不是一个可行的查询。
其实你可以运行
DELETE FROM rt WHERE timestamp < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO
作为删除旧文档的查询,这样就简单多了:)
您还需要不时致电 OPTIMIZE INDEX
。
这两个都必须按某种 'cron' 时间表调用,因为它们不会 运行 自动调用。
您最好根本不使用 Sphinxes 的 DELETE 功能。写入 RT 索引时,一旦 RAM 块已满,它就会作为磁盘块写出。所以你最终在磁盘上有许多磁盘块。最旧的文档将按顺序位于最旧的块中。
因此,要清除最旧的文档,您可以只处理最旧的块。 (滚动)
问题是 sphinx 不包含删除单个块的功能。
将需要关闭 searchd,删除块,操作头文件,然后重新启动 Sphinx。这不是一个简单的过程。
但在更一般的意义上,不确定 sphinx 是否能够跟上每秒 5,000/文档的连续流(甚至暂时忽略删除)- Sphinx 通常是为不经常写入而设计的,经常阅读。它构建了一个(大部分)整体倒排索引。这非常适合查询,但很难保持更新。它不适合增量更新。