Rails - Elasticsearch - 使用 Chewy 按坐标搜索

Rails - Elasticsearch - search by coordinates with Chewy

我通过 gem 'chewy'.

在我的 Rails 应用程序上使用 Elasticsearch

我有两个模型:产品和标签[多对多关系,通过 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

其中 return 是我所有具有指定标签的产品对象。

我的问题是:如何查询 ProductIndex 以 return 给定坐标对 (lat/lon) 100Km 半径范围内的所有 Product 对象?

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

编辑

我正在尝试类似的方法,但它不起作用:

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...
...                               ^

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

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

正确的语法如下:

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

希望对您有所帮助。