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...
... ^
这是一场疯狂的狩猎,也是一个漫长的下午,但最终错误非常愚蠢:
- 我在查询中使用
location
,同时将 coordinates
定义为字段类型;
.filter
后的括号错误。
正确的语法如下:
ProductsIndex.filter(geo_distance: {
distance: "100km",
coordinates: {
lat: <latitude>,
lon:<longitude>
}
})
希望对您有所帮助。
我通过 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
其中 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...
... ^
这是一场疯狂的狩猎,也是一个漫长的下午,但最终错误非常愚蠢:
- 我在查询中使用
location
,同时将coordinates
定义为字段类型; .filter
后的括号错误。
正确的语法如下:
ProductsIndex.filter(geo_distance: {
distance: "100km",
coordinates: {
lat: <latitude>,
lon:<longitude>
}
})
希望对您有所帮助。