5

我正在阅读一本关于 Sphinx 的书,其中提到为了利用多核和 Sphinx 技术本身,我将不可避免地不得不将一个大索引拆分为更小的索引,并在多索引查询中查询它们。然而,这本书并没有涉及任何进一步的细节。

对此的一般策略是什么?您是否只是以类似 UNION 的方式拆分它,例如

index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...

然后你不时重建这些碎片。当进行搜索时,不同的核心会并行处理这些索引吗?或者它是不同的东西,比如将现有项目分离到更大的索引中,而新的项目被添加到较小的索引中?还是将文本字段分成一个索引,将属性分成另一个?

4

1 回答 1

10

好问题。

Sphinx 在每次本地索引搜索中使用一个 CPU 内核,在索引时使用一个 CPU 内核来构建一个索引

如果您有两个索引,您可以同时运行两个索引器并使用两个 CPU 内核。请注意索引是 IO 密集型任务,因此不要运行太多索引器。

一旦您有两个(或更多)索引,您可以通过在搜索查询中提及所有索引或使用如下分布式索引来同时搜索它们:

index index_main
{
        type            = distributed
        local           = index1
        local           = index2
}

其中index1index2是单独的索引。在这种情况下,您可以搜索index_main并且 sphinx 将为您提供来自两个索引的聚合结果

关于拆分数据,您可以利用您想要的所有技术,包括按范围、哈希或属性值以及以上所有内容的任意组合拆分记录。

我最喜欢的是使用模来确定索引号,如下所示:

对于第一个索引:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0

第二:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1

这种方法有一些缺点,但总的来说,如果您没有大量数据,这是一个好的开始。

于 2012-06-04T05:50:38.623 回答