Поиск полигонов в сфинксе с помощью Thinking Sphinx
У меня настроен режим мышления sphinx для индексации в реальном времени, и он работает очень хорошо, а также выполняет поиск по геодисту. Но теперь я хочу искать записи в многоугольнике.
Документация Sphinx очень хорошо объясняет это при поиске на расстоянии
Теперь я хочу использовать эту функциональность, используя мышление сфинкса. Мышление сфинкса действительно объясняет поиск геодиста здесь, но не указывает, как искать в многоугольнике.
Может ли кто-нибудь помочь мне здесь сделать это?
1 ответ
Мышление Sphinx не имеет ничего встроенного, чтобы обеспечить аккуратный интерфейс для поиска полигонов, но, безусловно, возможно использовать функциональность.
Вы захотите сгенерировать SphinxQL SELECT
предложение, отфильтруйте его соответствующим образом, и / или вы можете получить доступ к вашим пользовательским атрибутам, используя AttributesPane
, Следующий код, надеюсь, понятен:
search = Model.search("foo",
:select => "*, CONTAINS(GEOPOLY2D(...), ...) AS inside",
:with => {:inside => true}
); ""
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
search.collect { |instance| instance.sphinx_attributes["inside"] }
; ""
в конце первого оператора требуется только при запуске этого в IRB или консоли Rails - вы хотите избежать вызова search
таким образом, что результаты оцениваются до тех пор, пока вы не добавите панель. Результаты поиска обычно загружаются лениво, но вызовы IRB inspect
распечатать результаты выписки, которая устраняет ленивое преимущество.
Панели обсуждаются в сообщении в блоге, которое я написал, и исходный код класса AttributesPane очень прост. Вы также можете написать собственный класс промежуточного программного обеспечения, который использует ваши собственные параметры и переводит их в функции многоугольника - класс Geographer (что и переводит :geo
в GEODIST
) хорошая ссылка для этого.