Использование LIKE для сопоставления строки со строкой, содержащей несколько слов - PullRequest
2 голосов
/ 04 ноября 2010

В mysql у меня есть предложение WHERE, которое использует LIKE для сопоставления ключевого слова со строкой.

WHERE title LIKE CONCAT('%',?,'%')

Это почти работает, но я столкнулся с проблемой, когда названия с несколькими словами возвращают ошибочные совпадения,Например, ключевое слово «press» будет соответствовать заголовку «депрессия - отстой», чего не должно быть.

Каков наилучший способ обеспечить соответствие ключевого слова, только если оно находится в началеслово?

Спасибо (заранее) за помощь

Ответы [ 5 ]

4 голосов
/ 04 ноября 2010

Маркеры границ слов [[:<:]], [[:>:]] ваш друг.

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0
1 голос
/ 04 ноября 2010

Я думаю, что вы ищете MATCH, а не LIKE.При правильном индексировании MATCH также намного быстрее.

Вот основы: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

1 голос
/ 04 ноября 2010
WHERE title LIKE CAT(?, ' %')

% - это подстановочный знак, поэтому, если он находится спереди и сзади, он будет искать все, что содержит символ?. Если вы удалите первый%, это будет все, что начинается с?

0 голосов
/ 04 ноября 2010
WHERE title LIKE CONCAT('% ', ?, '%') OR title LIKE CONCAT(?, '%')

Таким образом, запрос найдет ключевое слово, если это начало слова или начало заголовка.Итак, если ключевое слово «кошка», оно найдет фильмы:

catwoman
dogs and cats

, но не фильм, подобный:

concatenation
0 голосов
/ 04 ноября 2010

Не знаком с mysql, но я использовал REGEXP_LIKE в Oracle ... Кажется, mysql поддерживает нечто подобное ...

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

Затем просто напишите соответствующее регулярное выражение.

...