gpt4 book ai didi

ruby-on-rails - 在 Thinking Sphinx 中对 has_many 关系使用 crc32 调整

转载 作者:行者123 更新时间:2023-12-04 04:59:01 25 4
gpt4 key购买 nike

其实很奇怪。我有两个彼此有 has_many 关系的模型,这是我的模型

#model city
class City < ActiveRecord::Base
belong_to :state
end

#model state
class State < ActiveRecord::Base
has_many :city
end

我有状态索引
ThinkingSphinx::Index.define 'state', :with => :active_record do
indexes state_name, :sortable => true

#here is the problem
has "CRC32(cities.city_name)", :as => :city_name, :type => :integer
end

我想使用 city_name 作为过滤器。我上面的代码不起作用,运行时收到错误消息
rake ts:index

这是错误信息
ERROR: index 'state_core': sql_range_query: Unknown column 'cities.city_name' in 'field list'

但是,当我将 city_name 放在如下索引块中时,索引器运行良好!
ThinkingSphinx::Index.define 'state', :with => :active_record do
indexes state_name, :sortable => true
indexes cities.city_name
has "CRC32(cities.city_name)", :as => :city_name, :type => :integer
end

有什么建议吗?

最佳答案

Thinking Sphinx 无法判断您是否指的是 SQL 片段中的关联表 - 因此在您的第一个示例中,没有任何迹象表明它需要加入城市。
join索引定义中的方法就是为此目的而存在的 - 因此,请尝试以下操作:

ThinkingSphinx::Index.define 'state', :with => :active_record do
indexes state_name, :sortable => true

has "CRC32(cities.city_name)", :as => :city_name, :type => :integer

join cities
end

但是,有几点值得注意:首先,您可能还需要添加 cities.city_nameGROUP BY子句,因为它不是任何聚合值的一部分:
# within index definition
group_by 'cities.city_name

而且:您的 State 模型有许多城市,而不仅仅是一个,因此它实际上应该聚合成一组整数值,而不仅仅是一个。这意味着您不需要 group_by调用,但您确实需要自己添加聚合行为。根据您使用的是 PostgreSQL 还是 MySQL,这会以不同的方式完成:
# PostgreSQL
has "array_to_string(array_agg(crc32(cities.name)), ',')",
:as => :city_names, :type => :integer, :multi => true

# MySQL
has "GROUP_CONCAT(CRC32(cities.name) SEPARATOR ',')",
:as => :city_names, :type => :integer, :multi => true
CRC32不是 PostgreSQL 中的 native 函数,因此您可能需要自己添加它。在 v3 之前的 Thinking Sphinx 为您做到了这一点,但我已经重写了它,因此不再需要 CRC32 函数。这主要是因为 CRC32 会导致冲突,并且无法逆转,因此这是一个不优雅且不完美的解决方案。因此,我认为使用字段进行字符串比较更好,但这取决于您是否在您的应用程序中首选。

我会推荐这种方法:
ThinkingSphinx::Index.define :state, :with => :active_record do
indexes state_name, :sortable => true

has cities.id, :as => :city_ids
end

city = City.find_by_name('Melbourne')
State.search :with => {:city_ids => city.id}

它准确而优雅。

关于ruby-on-rails - 在 Thinking Sphinx 中对 has_many 关系使用 crc32 调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com