Соответствующие фразы в разделителях в MySQL - PullRequest
2 голосов
/ 06 сентября 2011

Я ищу точное совпадение фразы в указанных разделителях в MySQL.У меня есть следующие данные в поле полнотекстового индекса.

, садовая мебель, обогреватели патио, лучшие предложения, лучшие предложения,

Я выполняю следующий запрос, которыйвозвращает вышеупомянутую запись.

SELECT id, tags
FROM Store 
WHERE MATCH(tags) AGAINST(',garden,' IN BOOLEAN MODE)

Я хочу вернуть только записи, содержащие значение: ,garden, не ,garden furniture, или ,country garden, и т. д.

В настоящее время выполняетсяжадное совпадение и игнорирование запятых, указанных в запросе.Я попытался избежать запятых, чтобы заставить их быть включенными в запрос, но это не работает.

Можно ли указывать не алфавитно-цифровые разделители как часть совпадения?Я хочу иметь возможность выполнять точное совпадение, например, регулярное выражение, например '/,garden,/'.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Из документов :

Изменить файл набора символов: это не требует перекомпиляции. Макрос true_word_char() использует таблицу «символьный тип», чтобы отличать буквы и цифры от других символов. , Вы можете отредактировать содержимое массива <ctype><map> в одном из файлов XML набора символов, чтобы указать, что ',' является «буквой». Затем используйте заданный набор символов для ваших индексов FULLTEXT. Информацию о формате массива <ctype><map> см. В разделе 9.3.1, « Массивы определения символов ».

Другой вариант - добавить новое сопоставление .

В любом случае вам придется перестроить индекс:

REPAIR TABLE Store QUICK;
1 голос
/ 06 сентября 2011

Только match against может использовать индекс в вашем поиске.
Однако, если ваша таблица, если не слишком большая, вы можете использовать:

SELECT id, tags
FROM Store 
WHERE tags LIKE "garden" OR tags LIKE "garden,%" OR tags LIKE "%, garden,%"

Есть и другие опции (find_in_set), но яна самом деле не хочу вдаваться в подробности, потому что они работают даже хуже, чем приведенный выше SQL.

Реальная проблема, никогда не используйте CSV в базе данных!
Используйте CSV вбаза данных - действительно очень плохая идея, потому что
• Это расточительно, ваши данные не нормализованы
• Вы не можете присоединиться к полю CSV
• Вы не можете использовать индексы для поля CSV
• Полный-текстовые индексы плохо работают с разделителями (как вы видели)

Ответ на создание 2 дополнительных таблиц.

Table tag (innoDB)
----------
id integer primary key auto_increment
tag varchar(50)    //one tag per row!

Table tag_link (innoDB)
--------------
store_id integer foreign key references store(id)
tag_id integer foreign key references tag(id)  
primary key = (store_id + tag_id) //composite PK

Теперь вы можете легко выполнять любые запросы к тегам.

SELECT s.id, GROUP_CONCAT(t2.tag) FROM store s
INNER JOIN tag_link tl1 ON (s.id = tl1.store_id)
INNER JOIN tag t1 ON (t1.id = tl1.tag_id)
INNER JOIN tag_link tl2 ON (s.id = tl2.store_id)
INNER JOIN tag t2 ON (t2.id = tl2.tag_id)
WHERE t1.tag = 'garden'
GROUP BY s.id

При этом будет выбран один тег с именем garden (с использованием t1 и tl1) найти все магазины, связанные с этим тегом, а затем связать все теги с этими магазинами (используя t2 и tl2) .
Очень быстро и очень гибко.

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