关于新的太阳黑子/solr 功能,我有一个问题要问:附近的限制 我有(通过谷歌地理编码 API)视口和边界,它们是边界框西南角和东北角的纬度/经度坐标。我希望 Sunspot/Solr 在这个边界框内进行搜索,但我还没有弄清楚。所以我的问题是:是否有可能使 Solr(或通过任何 solr 插件)能够在边界框中进行搜索?如果是,如何?
谢谢
关于新的太阳黑子/solr 功能,我有一个问题要问:附近的限制 我有(通过谷歌地理编码 API)视口和边界,它们是边界框西南角和东北角的纬度/经度坐标。我希望 Sunspot/Solr 在这个边界框内进行搜索,但我还没有弄清楚。所以我的问题是:是否有可能使 Solr(或通过任何 solr 插件)能够在边界框中进行搜索?如果是,如何?
谢谢
您可以只创建一个类型为 trie double 的lat
andlng
字段,然后执行两个范围查询(一个用于 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
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
Sparcial 从 3.1 开始在 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(太阳黑子中捆绑的 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>