Если у вас есть база данных в Heroku, вы можете использовать поддержку Postgres для полнотекстового поиска: http://www.postgresql.org/docs/8.3/static/textsearch.html. Самые старые серверы, на которых работает Heroku (для общих баз данных), находятся на 8.3 и 8.4. Самые новые на 9.0.
Сообщение в блоге, отмечающее этот маленький факт, можно увидеть здесь: https://tenderlovemaking.com/2009/10/17/full-text-search-on-heroku.html
Очевидно, что этот "текстильный" (хех. Милый.) Аддон работает ... довольно хорошо. Насколько я понимаю, он даже создаст нужные вам индексы.
Вот основная история: полнотекстовый поиск postgres довольно быстрый и без суеты (хотя интеграция с Rails может и не быть хорошей), хотя он не предлагает наворотов Solr или IndexTank. Обязательно прочитайте о том, как правильно настроить индексы GIN и / или GiST, и используйте типы tsvector / tsquery.
Краткая версия:
- Создать (в данном случае на основе выражений) индекс:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body));
. В этом случае «тело» - это индексируемое поле.
- Используйте оператор
@@
: SELECT * FROM ... WHERE to_tsvector('english', pgweb.body) @@ to_tsquery('hello & world') LIMIT 30
Сложная часть может заключаться в том, чтобы сопоставить вещи обратно в область применения, о чем говорится в сообщении, которое ранее упоминалось в блоге.
Выделенные базы данных также можно реквизировать с помощью PostGIS, которая является очень мощной и полнофункциональной системой индексации и запроса географических данных. OpenStreetMap широко использует типы геометрии PostgreSQL (встроенные), и многие люди очень хорошо комбинируют это с PostGIS.
Оба из них (полнотекстовый поиск, PostGIS) используют преимущества расширяемого типа данных и инфраструктуры индексации в Postgres, поэтому следует ожидать, что они будут работать с высокой производительностью для многих, многих записей (потратьте немного времени на тщательное изучение ситуации). если все выглядит насквозь). Вы также можете воспользоваться тем фактом, что вы можете использовать эти функции в сочетании с транзакциями и структурированными данными. Например:
CREATE TABLE products (pk bigserial, price numeric, quantity integer, description text);
можно так же легко использовать при полнотекстовом поиске ... подойдет любое текстовое поле, и оно может быть связано с обычными атрибутами (цена, количество в данном случае).