Rails: какой метод rails нечеткий /gem/plugin используется для поиска в таблице базы данных на 1 миллион записей?
У меня есть ~1 миллион записей MySQL таблицы. Мне скоро нужно будет добавить поиск в мое приложение Rails 3.x. Я хочу, чтобы поиск был нечетким.
На самом деле, я использую плагин (rails-fuzzy-search) для другой таблицы, но это только 3000 записей. Этот плагин создает триграммы в другой таблице (25000 триграмм для таблицы 3000 записей).
Что ж, я не могу использовать этот метод для своей таблицы на 1 миллион записей, иначе моя таблица триграмм будет, возможно, на 100 миллионов записей!
Я вижу некоторые драгоценные камни:
Или использование Sphinx и Thinking Sphinx + addons.
Я не знаю, что является лучшим решением для лучшей производительности.
Поиск будет установлен по двум полям моей таблицы.
2 ответа
Некоторые поиски вокруг обнаружили нечеткий драгоценный камень:
Анекдотический тест: по сравнению с нашей таблицей местоположений, полученной из Geonames (3,2 млн записей, около 1 ГБ данных), на моей машине для разработки (MacBook Pro 2011 года)
поиск 10 лучших совпадающих записей занимает 6 мс ± 1, подготовка индекса для всех записей занимает около 10 мин. Служебные запросы к БД, когда изменение записи составляет 3 мс ±2, накладные расходы памяти (объем индекса таблицы триграмм) составляют около 300 МБ.
Кроме того, проверьте Solr и Sunspot
В зависимости от вашей базы данных вы можете включить функции, специфичные для базы данных, для достижения некоторого «нечеткого сопоставления» (что бы это ни значило).
MySQL имеет «Режим естественного языка», который объясняется здесь .
Это довольно легко реализовать. Сначала добавьте индекс в миграцию следующим образом:
add_index :products, [:name, :description], type: :fulltext, name: :fulltext_index_products_on_name_and_description
Затем вы можете использовать предложение MATCH в своем запросе следующим образом:
scope :search, ->(query) {
where("MATCH (products.name, products.description) AGAINST (? IN NATURAL LANGUAGE MODE)", query)
# MySQL should sort by relevance, so make sure not to override this with your own order clause.
}
Имейте в виду, что при тестировании небольшого набора данных вы можете получить неожиданные результаты, лучше всего попробовать его с полными данными. Возможно, вам также стоит обратить внимание на «BOOLEAN MODE».