Искать "полное совпадение слов" в MySQL - PullRequest
68 голосов
/ 18 марта 2009

Я хотел бы написать SQL-запрос, который ищет ключевое слово в текстовом поле, но только если это «полное совпадение слов» (например, когда я ищу «rid», оно не должно совпадать с «arid», но оно должно соответствовать "избавлению".

Я использую MySQL.

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

Ответы [ 6 ]

142 голосов
/ 18 марта 2009

Вы можете использовать REGEXP и [[:<:]] и [[:>:]] маркеры границы слова:

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
26 голосов
/ 09 октября 2013

Найден ответ для предотвращения столкновения классической границы слова [[::<::]] со специальными символами, например. @ # $% ^ & *

Заменить ..

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'

С этим ..

SELECT *
FROM table 
WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'

Последнее соответствует (пробел, табуляция и т. Д.) || (запятая, скобка и т. д.) || начало / конец строки. Более «законченное» совпадение границ слов.

5 голосов
/ 18 марта 2009

Вы можете использовать like с подстановочным маркером, чтобы поймать возможности (в начале, в конце, посередине и в одиночку), примерно такого должно быть достаточно:

выберите бла бла бла где столбец, как «RED%» или столбец типа «% rid» или столбец типа "% rid%" или столбец = 'избавить'

2 голосов
/ 04 февраля 2014

Используйте regexp с границами слова, но если вы хотите также поиск без учета акцента, обратите внимание, что REGEXP является однобайтовым оператором, поэтому не стоит иметь никакой сортировки utf8_general_ci, совпадение не будет нечувствительным к акценту.

Чтобы совпадение не чувствительно к акценту и совпадению всего слова, укажите слово, написанное таким же образом, как (устаревшая) PHP-функция sql_regcase ().

На самом деле:

  • utf8_general_ci позволяет выполнять поиск (WHERE field = value) без учета регистра и акцента, но не позволяет указать полное совпадение слов (маркеры границ слов не распознаются)

  • LIKE позволяет выполнять поиск без учета регистра и ударения, но необходимо вручную указать все комбинации возможных символов границ слов (маркеры границ слов не распознаются)

  • границы слов [[: <:]] и [[:>:]] поддерживаются в REGEXP, который является однобайтовой функцией, поэтому не выполняет поиск без учета акцента.

Решение состоит в том, чтобы использовать REGEXP с границами слова и словом, измененным так же, как это делает sql_regcase.

Используется на http://www.genovaperte.it

1 голос
/ 18 марта 2009

Это лучший ответ, который я придумала себе:

SELECT * FROM table 
WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'

Я бы упростил это до:

SELECT *
FROM table
WHERE keywords REGEXP '[^ ]rid[ $]'

но [^] имеет особое значение «НЕ пробел», а не «начало строки или пробел».

Как REGEXP сравнивается с несколькими условиями LIKE? (Не то, что производительность имеет значение в этом приложении.)

1 голос
/ 18 марта 2009
select * from table where Locate('rid ', FieldToSearch) > 0 
      or Locate(' rid', FieldToSearch) > 0

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

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