Rails 3 Sunspot solr 搜索范围内

发布于 2024-10-20 16:50:25 字数 349 浏览 2 评论 0原文

我有一个关于新的 Sunspot/solr 功能的问题要问: 附近的限制 我(通过谷歌地理编码API)有视口和边界,它们是边界框西南角和东北角的纬度/经度坐标。我希望 Sunspot/Solr 在这个边界框内进行搜索,但我还没有弄清楚。所以我的问题是:是否可以使 Solr(或通过任何 solr 插件)能够在边界框内进行搜索?如果是,怎么做?

谢谢

I have a question to ask regarding the new Sunspot/solr feature: restriction with near
I have (via the google geocoding API) the viewport and the bounds which are latitude/longitude coordinates of the southwest and northeast corners of a bounding box. I want Sunspot/Solr to search within this bounding box but I haven't figured it out yet. So my question is: Is it possible to make Solr (or via any of the solr plugins) capable for searches within a bounding box? If yes, how?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

咽泪装欢 2024-10-27 16:50:25

您只需创建一个 trie double 类型的 latlng 字段,然后执行两个范围查询(一个用于 lat 范围,一个用于 lng 范围)。

class Product < ActiveRecord::Base
  seachable do
     double :latitude
     double :longitude
  end
end

# search
Product.search do
  with :latitude, 36.5667..80.4553 
  with :longitude, 76.4556..67.9987
end

You can just create a lat and lng field of type trie double, and then do two range queries (one for a lat range, one for a lng range).

class Product < ActiveRecord::Base
  seachable do
     double :latitude
     double :longitude
  end
end

# search
Product.search do
  with :latitude, 36.5667..80.4553 
  with :longitude, 76.4556..67.9987
end
樱&纷飞 2024-10-27 16:50:25

Sunspot 支持使用 Geohash 进行空间搜索,请参阅 RestrictionWithNear。但您只能使用预定义的距离(尽管 : precision)。

# model
# lat: decimal
# lng: decimal
class Product < ActiveRecord::Base
  seachable do
    location :location do
      Sunspot::Util::Coordinates.new(lat, lng)
    end
  end
end

# search
Product.search do
  # near(lat, lng)
  with(:location).near(76.4556, 67.9987, :precision => 3)
end

从 3.1 开始,Sparcial 被 添加 在 solr 中,我在 sunspot 中找不到相应的 DSL,但你总是可以使用 adjust_solr_params 添加自定义参数:

Product.search do
  adjust_solr_params do |params|
    parmas[:fq] << '{!geofilt pt=74.4556,67.9987 sfield=location d=5}'
  end
end

您必须使用 Solr 3.1(sunspot 中捆绑的 solr 是 1.4),并且索引字段位置如

class Product < ActiveRecord::Base
  searchable do
    string(:location, :as => :location) { [lat,lng].join(',') }
  end
end

还需要将字段类型添加到 schema.xml 中。 (举个例子,我自己没试过)

<types>
  ...
  <fieldType name="geo" class="solr.LatLonType" omitNorms="true"/>
</types>
<fields>
  ...
  <field name="location" stored="false" termVectors="false" type="geo" multiValued="false" indexed="true"/>
</fields>

Sunspot supports spartial search using Geohash, see RestrictionWithNear. But you can only use the predifined distance (though :precision).

# model
# lat: decimal
# lng: decimal
class Product < ActiveRecord::Base
  seachable do
    location :location do
      Sunspot::Util::Coordinates.new(lat, lng)
    end
  end
end

# search
Product.search do
  # near(lat, lng)
  with(:location).near(76.4556, 67.9987, :precision => 3)
end

Sparcial is added in solr starting from 3.1, I cannot find correspondng DSL in sunspot, but you can always use adjust_solr_params to add customized parameters:

Product.search do
  adjust_solr_params do |params|
    parmas[:fq] << '{!geofilt pt=74.4556,67.9987 sfield=location d=5}'
  end
end

You have to use Solr 3.1 (the bundled solr in sunspot is 1.4), and index field location like

class Product < ActiveRecord::Base
  searchable do
    string(:location, :as => :location) { [lat,lng].join(',') }
  end
end

Also the field type needs to be added into schema.xml. (An example, I have not tried it myself)

<types>
  ...
  <fieldType name="geo" class="solr.LatLonType" omitNorms="true"/>
</types>
<fields>
  ...
  <field name="location" stored="false" termVectors="false" type="geo" multiValued="false" indexed="true"/>
</fields>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文