Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sphinx 斯芬克斯索引性能的思考_Sphinx_Thinking Sphinx - Fatal编程技术网

Sphinx 斯芬克斯索引性能的思考

Sphinx 斯芬克斯索引性能的思考,sphinx,thinking-sphinx,Sphinx,Thinking Sphinx,我有一个很大的索引定义,索引时间太长。我怀疑主要问题是由生成的许多左外部联接引起的 我看到了,但找不到有关使用source::query的文档,这似乎是解决方案的一部分 我的索引定义和结果查询可在此处找到: 如何优化生成的查询以在索引期间更快地运行?解决这一问题的“标准”sphinx解决方案是使用范围查询 。。。将查询拆分为许多小部分,这样数据库服务器更有可能运行查询(而不是一个大查询) 但我不知道如何在思考斯芬克斯时真正做到这一点。在文档中看不到任何内容。可以帮助您编辑sphinx.conf

我有一个很大的索引定义,索引时间太长。我怀疑主要问题是由生成的许多左外部联接引起的

我看到了,但找不到有关使用
source::query
的文档,这似乎是解决方案的一部分

我的索引定义和结果查询可在此处找到:


如何优化生成的查询以在索引期间更快地运行?

解决这一问题的“标准”sphinx解决方案是使用范围查询

。。。将查询拆分为许多小部分,这样数据库服务器更有可能运行查询(而不是一个大查询)


但我不知道如何在思考斯芬克斯时真正做到这一点。在文档中看不到任何内容。可以帮助您编辑sphinx.conf,但也不确定TS将如何处理您手动编辑配置文件的问题

这是最有效的解决方案(从最新版本)。基本上,您可以删除一段主查询
sql\u query
,并在
sphinx.conf
文件中将其单独定义为
sql\u joined\u字段

将所有相关的sql条件添加到每个
sql\u joined\u字段
(例如,按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索引定义具有参数
delta?:true
。这样我就可以在delta索引中使用条件
WHERE events.delta=1
,过滤掉不相关的记录

我发现切分并没有表现得更好,所以我回到了一个统一的索引

请参见此处的整个索引定义:

记住这一点很重要

Sphinx文档ID偏移必须手动处理。也就是说,无论何时添加或删除另一个模型的索引,我的计算文档ID都将更改。这必须更新


因此,在我的示例中,如果我为不同的模型添加了一个索引(而不是
:incident
),我必须运行
rake ts:configure
,以找到我的新偏移量,并相应地更改
incidents.id*51+7

似乎连接的字段可以更好地解决我的索引性能问题:。你知道如何在TS中实现这一点吗?现在仔细看一下要点通知已经有了,你编辑了要点吗?如果不是对不起,我没有注意到。连接字段也很有用,对不起,我不知道TS是否可以启用它们。不,我没有。我认为这是TS的标准配置。然而,你的建议仍然很有价值。如果我理解正确,范围查询可以提高搜索时间性能。我想提高索引时间性能。我来晚了!谢谢你的要点。我发现的一件事是,您可以访问define块内的
@index
,并且可以在您的条件下执行
@index.delta?
,以避免将索引一分为二。