MySQL Полнотекстовый поиск в Ruby on Rails - PullRequest
9 голосов
/ 24 июня 2009

Я пытаюсь реализовать базовый полнотекстовый поиск с MySQL.

Я написал эту миграцию:


def self.up
  execute 'ALTER TABLE photos ENGINE = MyISAM'
  execute 'CREATE FULLTEXT INDEX fulltext_photos ON photos (place, info)'
end

def self.down
  execute 'ALTER TABLE photos ENGINE = InnoDB'
  execute 'DROP INDEX fulltext_photos ON photos'
end

А вот и моя модель:


def self.search(*args)
  options = args.extract_options!
  find_by_sql [ "SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?)", options[:query] ]
end

Проблема в том, что этот код всегда возвращает пустой массив .

Например:

% Photo.find(:first)
=> Photo id: 1, place: "Baceno", info: "Era immerso in erba alta." ... 

% Photo.search(:all, :query => 'baceno')
=> []

Ответы [ 4 ]

10 голосов
/ 25 июня 2009

Я создал проект (Rails 2.3.2, Ruby 1.9.1 MySQL 5.0) для эмуляции этого. Имея одну запись в базе данных, я получил те же результаты, что и вы. Когда я добавил больше записей, команда Photo.search нашла эту запись.

Это может быть потому, что «слова, которые присутствуют в 50% или более строк, считаются общими и не совпадают». Ref.

Порог 50% не применяется в двоичном режиме. Ref.

В БИНАРНОМ РЕЖИМЕ относится к скобкам: ПРОТИВ ('baceno' В БУЛЕВОМ РЕЖИМЕ)

3 голосов
/ 25 июня 2009

Посмотрите на камень Думающий Сфинкс . Это здорово.

2 голосов
/ 06 июня 2011

Приведенный ниже код работает для моей веб-страницы и дает правильный результат в ruby ​​на рельсах.

Adverse.find(:all, :conditions => ["match(related_company,client_name) against (? IN BOOLEAN MODE)",@chk])
1 голос
/ 25 июня 2009

В моем тесте (только в MySQL, а не в Rails), когда я добавляю опцию IN BOOLEAN MODE в инструкцию SELECT, кажется, что она возвращает строки.

SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?) IN BOOLEAN MODE

Я бы также рекомендовал использовать для поиска отдельный поисковый продукт, такой как Solr или Sphinx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...