Mysql ThinkingSphinx group_导致搜索速度变慢
设置:Mysql ThinkingSphinx group_导致搜索速度变慢,mysql,ruby-on-rails,sphinx,thinking-sphinx,Mysql,Ruby On Rails,Sphinx,Thinking Sphinx,设置: 轨道4 MySQL 思绪幻觉 我的应用程序中有一个模型(记录),几乎有5亿行。这个模型有32个字段,但对于特定的Sphinx搜索,我只关心name和tokenname是我使用Sphinx搜索的对象,而token是我希望返回以在Rails中执行其他操作的对象 我的索引设置为: ThinkingSphinx::Index.define :records, :with => :real_time do # fields indexes name indexes token
- 轨道4
- MySQL
- 思绪幻觉
记录
),几乎有5亿行。这个模型有32个字段,但对于特定的Sphinx搜索,我只关心name
和token
name
是我使用Sphinx搜索的对象,而token
是我希望返回以在Rails中执行其他操作的对象
我的索引设置为:
ThinkingSphinx::Index.define :records, :with => :real_time do
# fields
indexes name
indexes token
# attributes
has token, as: :token_attr, type: :string
# < several additional attributes >
end
。。。其中,num\u tokens\u i\u need
通常为数千(少于10000)
上述查询需要5-8分钟才能完成。然而,当我这么做时:
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq
搜索速度非常快(在几百毫秒内返回数百万条记录),但由于.uniq
调用,我没有返回我需要的num\u令牌
基本上,我需要做的是有一个快速的Sphinx搜索,它会为给定的术语(如“红色”)返回一个确切数量的不同标记
如果看到我的sphinx.conf或其他内容会有所帮助,请让我知道。注意分组是在内存中完成的,因此,要获得分组搜索结果,每个文档的属性都需要在内存中的某个位置。考虑到您的记录索引中有数百万个文档,我猜这就是速度缓慢的原因
请记住,在第二个示例中,数百万条记录可能与您的查询相匹配,但它们并不是全部由Sphinx返回的(匹配只在字段上进行,不涉及属性),这就是为什么查询速度更快的部分原因
关于更好的前进道路的一些想法:
- 如果您只是想从名称完全匹配的记录实例中获取令牌,那么SQL可能是一个更好的工具。即使使用部分匹配,使用数据库的模糊匹配也可能更快
- 如果您只是关注令牌的数量,而不是令牌的值,那么Sphinx确实不是合适的工具。它的构建没有考虑聚合,因此它没有针对您正在运行的查询进行调优
- 如果关键字值(在您的示例中,
red
)是已知的集合(而不是用户提供的),那么您可能可以缓存这些值并定期(每天一次?)重新计算它们
这些都不是明显的赢家,但希望它们能帮助你找到更好的解决方案。如果有人愿意解释为什么投票失败,我将不胜感激。
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq