使用SQL与弹性搜索和轮胎

时间:2012-12-06 15:03:44

标签: ruby-on-rails-3 elasticsearch tire

使用我当前的设置,我需要添加一些自定义SQL语句,用Tire Gem来限定一些数据。

我正在使用Rails 3.2和Ruby 1.9.3

在我的列表控制器中,我有以下内容:

@listings = Listing.search()

对于我的Listing.rb,我使用了一些过滤器,例如:

def self.search(params={})
    tire.search(load: true, page: params[:page], per_page: 50) do |search|
      search.query  { string params[:query], :default_operator => "AND" } if params[:query].present?
      search.filter :range, posted_at: {lte: DateTime.now}
      search.filter :term, "property.rooms_available"   => params[:property_rooms_available]  if params[:property_rooms_available].present?
      search.filter :term, "property.user_state"        => params[:property_user_state]       if params[:property_user_state].present?

   ...
end

我需要做的是将这个SQL语句添加到搜索方法中,以便它按照lonitude和latitute进行范围调整。 'coords'通过URL中的参数以

的形式传入
http://localhost:3000/listings?coords=51.0000,-01.0000 52.0000,-02.0000 

(-01.0000和52.0000之间有一个空格。)

目前我有:

 sql = "SELECT title, properties.id, properties.lng,properties.lat from listings WHERE ST_Within(ST_GeometryFromText('POINT(' || lat || ' ' || lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'));"

我想过尝试通过类似的方式在控制器中进行范围调整?

def self.polyed(coords)
    joins(:property).
    where("ST_Within(ST_GeometryFromText('POINT(' || properties.lat || ' ' || properties.lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'))").
    select("title, properties.id, properties.lng,properties.lat")
end

这就是......

listings_controller.rb

def index
  @listings = Listing.polyed(poly_coordinates).search()
end

它需要通过HTML和json格式将结果作为@listings返回

http://localhost:3000/listings.json?

我已经在使用RABL自动生成json。

这可能吗?

非常感谢提前。

赖安

1 个答案:

答案 0 :(得分:0)

一种可能性是在joins选项中传递选项where:load等。

但是如果你想在Rails代码中过滤返回的结果,一个更好的方法似乎只是用Tire加载记录ID(使用fields选项来限制返回的字段),然后使用它们在您的SQL查询中。