设置:
我的应用程序中有一个模型(Record),有近5亿行。这个模型有32个字段,但对于某个狮身人面像搜索,我唯一关心的两个字段是name和token。name是我使用狮身人面像搜索的对象,而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我想要做的是在:records上对name进行查询,并让它在数组中返回不同的token字符串。
我现在拥有的是:
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need, group_by: :token_attr)..。其中num_tokens_i_need通常在数千(不到10,000)的地方。
上面的查询需要5-8分钟才能完成.然而,当我简单地做:
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq搜索速度非常快(在几百毫秒内返回数百万条记录),但由于num_tokens_i_need调用,我没有返回.uniq。
基本上,我需要做的是有一个快速狮身人面像搜索,它给出了一个特定术语的确切数目(如“红色”)。
如果看到我的sphinx.conf或其他东西会有帮助的话,请告诉我。
发布于 2017-01-31 02:18:46
狮身人面像博士注意到分组是在内存中完成的,因此,要获得分组搜索结果,每个文档的属性都需要在某个时候存储在内存中。考虑到记录索引中有几百万个文档,我猜这是导致缓慢的原因。
请记住,在第二个示例中,数百万条记录可能与查询匹配,但它们并非全部由Sphinx返回(匹配完全在字段上完成,属性不涉及),这也是查询速度快得多的原因之一。
关于更好的前进道路的一些想法:
red)是一个已知集(而不是用户提供的),那么您也许可以缓存这些值并定期重新计算它们(每天一次?)。这些都不是明显的赢家,但希望它们能帮助你找到更好的解决方案。
https://stackoverflow.com/questions/41942571
复制相似问题