这是效果最好的解决方案(来自linked question)。基本上,您可以删除主查询sql_query 的一部分,并在sphinx.conf 文件中将其单独定义为sql_joined_field。
为每个sql_joined_field添加所有相关的sql条件是很重要的(例如以ID为模的分片索引)。这是新定义:
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: false,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: true,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND incidents.delta = 1 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
将字段site 定义为单独的查询的神奇之处在于行尾的选项source: :query。
注意核心索引定义有参数delta?: false,而增量索引定义有参数delta?: true。这样我就可以在增量索引中使用条件WHERE incidents.delta = 1 并过滤掉不相关的记录。
我发现分片没有更好的表现,所以我恢复到一个统一索引。
在此处查看整个索引定义:https://gist.github.com/jonsgold/05e2aea640320ee9d8b2。
重要的要记住!
Sphinx 文档 ID 偏移量必须手动处理。也就是说,每当添加或删除另一个模型的索引时,我计算的文档 ID 都会改变。这必须更新。
因此,在我的示例中,如果我为不同的模型(不是 :incident)添加索引,我将不得不运行 rake ts:configure 来找出我的新偏移量并相应地更改 incidents.id * 51 + 7。