使用Sunspot Solr进行多值空间搜索

时间:2014-07-19 15:32:13

标签: ruby-on-rails solr sunspot

目前,我根据纬度和经度使用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

2 个答案:

答案 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是一个搜索引擎(使用Apache的Lucene)
  • sunspot是一个写得非常好的DSL(特别是与那些巨大的xml配置文件相比 - 在java文化遗产中),在solr之上暴露了大部分solr选项(甚至全部,我不确定)

所以基本上,如果你想为solr调整一些答案,你应该尝试在太阳黑子的DSL中“缠绕”它。