2009-04-10 1 views
0

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

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

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

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

ответ

6

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

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

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

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'; 
+0

+1 для записи того, что я хотел написать, только быстрее –

2

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

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

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

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

+0

Булевый режим возвращает результаты, которые в принципе бесполезны. –

+0

Почему они «бесполезны»? Какие «неправильные» результаты вы видите? Он отлично работает для меня. – bobince

Смежные вопросы