Поиск полигонов в сфинксе с помощью 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) хорошая ссылка для этого.

Другие вопросы по тегам