Обходной путь для MySQL 50% порог для естественного поиска - PullRequest
0 голосов
/ 11 апреля 2009

У меня есть таблица, куда я вставляю, например, изображения и названия цветов, найденных на указанных изображениях. Цветная строка выглядит примерно так: «белый, желтый, оранжевый, черный».

Поскольку у меня их много, пороговое значение 50% начинает падать для некоторых цветов, поскольку они появляются в большинстве строк.

Весь смысл таблицы заключается в возможности поиска по цвету. У кого-нибудь есть обходной путь, или я должен просто сдаться и пойти на Сфинкса или что-то подобное? Перекомпиляция MySQL, вероятно, не вариант.

Я слышал, что некоторые люди просто добавляют фиктивные строки в таблицу, чтобы обойти 50%, но это звучит довольно отчаянно.

Ответы [ 2 ]

6 голосов
/ 11 апреля 2009

Эту проблему НЕ нужно решать с помощью полнотекстового поиска.

Вместо этого вам нужна дочерняя таблица с одной строкой на цвет на изображение.

Цвет должен быть внешним ключом таблицы цветов, поэтому ваша дочерняя таблица фактически становится отношением «многие ко многим» между изображением и цветом.

create table color ( 
 id int not null primary key auto_increment,
 name varchar64)
); 

create table image_color (
  image_id int references image(id), 
  color_id int reference color(id),
  unique constraint (image_id, color_id) 
) ;

Затем индексируйте отношение (и присвойте ему уникальное ограничение на кортеж (image_id, color_id).

Затем, чтобы найти все изображения с определенным цветом:

select a.* from image a 
join image_color b on (a.id = b.image_id) 
join color c on (b.color_id = c.id)
where c.name = 'yellow';
2 голосов
/ 11 апреля 2009

Весь смысл таблицы заключается в возможности поиска по цвету. У кого-нибудь есть обходной путь

Да, используйте BOOLEAN MODE поисков, на которые не влияет порог 50% и которые менее непредсказуемы.

Но, +1 к ответу tpdi, я не могу представить, почему вы используете полнотекстовый поиск вместо простой таблицы соединений, в которой перечислены цвета. Это простая логическая проблема хранения да / нет, нет необходимости перетаскивать в полнотекстовые сложности деление слов, упорядочение слов, стоп-слова, слишком короткие слова («красный» не будет проиндексирован по умолчанию) и, самое главное, факт что вам нужно использовать неприятные старые таблицы MyISAM, чтобы получить возможность вообще!

Полнотекстовый поиск в целом сложен и не очень хорошо реализован в MySQL. Это должно быть вашим последним средством, когда вам действительно нужно искать слова в больших отрезках текста, а не в качестве выбранной функции.

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