0

我在我的 Rails APP trhough 上使用 Elasticsearch gem 'chewy'

我有两个模型:产品和标签 [多对多关系,通过 ProductTag 模型管理]。

我将 ProductsIndex 定义如下:

class ProductsIndex < Chewy::Index
  define_type Product do
    field :name
    field :tags, value: -> { tags.map(&:name)}
    field :coordinates, type: 'geo_point', value: ->{ {lat: lat, lon: lon} }
  end
end

我可以通过以下方式成功查询控制器中的 ProductsIndex:

q = params[:q]
@products = ProductsIndex.filter { tags(:and) == [q] }.load

它返回给我所有带有指定标签的 Product 对象。

我的问题是:如何查询 ProductIndex 以返回从给定坐标对(纬度/经度)半径 100 公里内的所有产品对象?

我并不严格需要按距离排序,但是如果您将其包含在答案中,将不胜感激:)

编辑

我正在尝试这样的事情,但它不起作用:

ProductsIndex.filter {
  geo_distance: {    
    distance: '100km',    
    location: {        
      lat: 60.0951482712848,        
      lon: -86.4810766234584    
    }
  }
}

我收到以下语法错误

 SyntaxError: (irb):10: syntax error, unexpected ':', expecting '}'
...uctsIndex.filter {geo_distance: {    distance: '100km',    l...
...                               ^
4

1 回答 1

0

这是一场疯狂的狩猎,一个漫长的下午,但最终错误非常愚蠢:

  1. location当我定义coordinates为字段类型时,我在查询中使用;
  2. 之后的括号错误.filter

正确的语法如下:

ProductsIndex.filter(geo_distance: {
  distance: "100km",
  coordinates: {
    lat: <latitude>,
    lon:<longitude>
  }
})

希望它可能会有所帮助。

于 2016-07-03T00:02:07.873 回答