目前,我根据纬度和经度使用Sunspot Solr为我的提供商编制索引。
class Provider < ActiveRecord::Base
searchable do
text :full_name, :as => :full_name_textp
latlon(:location) { Sunspot::Util::Coordinates.new(latitude, longitude) }
end
end
事实证明我的一些提供商在多个地点(分支机构)工作。有一个使用Solr here进行多值空间搜索的指南。这是官方reference。
根据指南,我似乎需要在schema.xml
<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
distErrPct="0.025"
maxDistErr="0.000009"
units="degrees" />
和..
<dynamicField name="locm_*" type="location_rpt" indexed="true" stored="true" multiValued="true"/>
现在我只是在猜测,但我的可搜索区块是否会出现以下情况:
class Provider < ActiveRecord::Base
searchable do
text :full_name, :as => :full_name_textp
latlon(:locm_location) do
branches.each do
Sunspot::Util::Coordinates.new(latitude, longitude)
end
end
end
end
当我尝试运行Provider.reindex时,收到错误消息:
ArgumentError: locm_location is not a multiple-value field, so it cannot index values []
解答:
感谢@ zrl3dx我现在有一个有效的解决方案。这是修改后的代码:
latlon(:location_locm, :multiple => true) do
branches.each do
Sunspot::Util::Coordinates.new(latitude, longitude)
end
end
对于那些希望实现这一点的人,我在我的可搜索块中有这个:
with(:location_locm).in_radius(x, y, 15, :bbox => true)
另外,我需要将它添加到我的branch.rb
def lat
self.latitude
end
def lng
self.longitude
end
答案 0 :(得分:2)
感谢 @ zrl3dx 我现在有了一个有效的解决方案。
以下是修改后的代码:
latlon(:location_locm, :multiple => true) do
branches.each do
Sunspot::Util::Coordinates.new(latitude, longitude)
end
end
对于那些希望实现这一点的人,我在我的可搜索块中有这个:
with(:location_locm).in_radius(x, y, 15, :bbox => true)
另外,我需要将它添加到我的branch.rb
def lat
self.latitude
end
def lng
self.longitude
end
答案 1 :(得分:2)
只是为了澄清,除了对该问题的明显答案(将:multiple => true
添加到searchable
块 - 你不能使用这些字段进行排序!),必须要意识到solr!= sunspot:
所以基本上,如果你想为solr调整一些答案,你应该尝试在太阳黑子的DSL中“缠绕”它。