Геопространственные поиски с помощью Solr (websolr) в Rails 3.x
Я хочу использовать Solr для текстового и геопространственного поиска в приложении Rails 3.1. Я вижу, что websolr поддерживает геопространственную индексацию и поиск, но два гема для этого ( sunspot & rsolr), по-видимому, (в настоящее время) не реализуют его. Sunspot, похоже, находится в процессе добавления функциональности, но утверждает, что "[геопространственный] является экспериментальным и не выпущен. DSL может измениться".
Существуют ли другие реализации геопространственного поиска с помощью sunspot + websolr? Я немного прогуливал и сталкивался с некоторыми, но они кажутся хакерскими, и я бы предпочел не использовать то, что нашел, если уже есть базовая функция или более поддерживаемый подход.
2 ответа
Sunspot поддерживает геопространственный поиск с некоторыми ограничениями.
Индексация:
searchable do
text :location
location :coordinates do
Sunspot::Util::Coordinates.new latitude, longitude
end
end
Поиск:
coord = # whatever...
with(:coordinates).near(coord[0], coord[1], :precision => 3)
Но это на самом деле не точно... Он использует гео-хеш, если я не ошибаюсь. Таким образом, возможно, что 2 точки находятся близко друг от друга, но не найдены.
Кроме того, вы не можете вложить near
в гранях.
Я бы последовал совету ADAM и пошел бы на упругий поиск. Это то, что я сделал. Вы получаете намного больше контроля.
Tire также поддерживает геопространственный поиск, но в DSL нет специальных методов, потому что он не нужен. Они планируют добавить их позже, я думаю.
Индексация:
tire.mapping do
indexes :location, type: 'string', analyzer: 'snowball'
indexes :latitude_longitude, type: 'geo_point'
end
def latitude_longitude
[latitude, longitude].join(",")
end
def to_indexed_json
to_json(methods: ['latitude_longitude'])
end
Поиск:
filter :geo_distance, distance: "#{distance}km", latitude_longitude: [user.latitude, user.longitude].join(",")
Для потомков: Sunspot с тех пор выпустила версию 1.3.0 с поддержкой пространственного поиска Solr 3, что делает его идеальным вариантом для Heroku с Websolr.