MySQL запрос для сопоставления предложения с ключевыми словами в поле - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть таблица mysql со списком ключевых слов, таких как:

id | keywords
---+--------------------------------
 1 | apple, oranges, pears
 2 | peaches, pineapples, tangerines

Я пытаюсь выяснить, как сделать запрос к этой таблице, используя строку ввода: Джон любил есть яблоки

Существует ли тип запроса mysql, который может запрашивать поле с предложением и возвращать результаты (в моем примере запись # 1)?

Ответы [ 5 ]

2 голосов
/ 08 октября 2015

Надеюсь, это не более абстрактно, чем вам нужно, но, возможно, это хороший способ сделать это.Я не проверял это, но думаю, что это сработает.Если вы можете использовать PHP, вы можете использовать str_replace, чтобы превратить пробелы в keyword LIKE '%apple%'

$sentence = "John liked to eat apples";

$sqlversion = str_replace(" ","%' OR Keyword like '%",$sentence );

$finalsql = "%".$sqlversion."%"; 

. Выше будет отображаться эхо:

 %John%' OR Keyword like '%liked%' OR Keyword like '%to%' OR Keyword like '%eat%' OR Keyword like '%apples%

Затем просто объедините с оператором SQl

SQL ="SELECT * 
FROM keywords_table
WHERE Keyword like" . $finalsql;
2 голосов
/ 24 февраля 2012

Одним из способов сделать это может быть преобразование apple, oranges, pears в apple|oranges|pears и использование RLIKE (т.е. регулярное выражение) для сопоставления с ним.

Например, «Джон любил есть яблоки» соответствует регулярному выражению «яблоко | апельсин | груши».

Во-первых, чтобы преобразовать 'яблоко, апельсины, груши' в форму регулярного выражения, замените все ',' на '|' используя REPLACE. Затем используйте RLIKE, чтобы выбрать ключевые слова, которые соответствуют:

SELECT * 
FROM keywords_table
WHERE 'John liked to eat apples' RLIKE REPLACE(keywords,', ','|');

Однако это зависит от согласованности вашего разделения через запятую (т. Е. Если есть одна строка, похожая на apples,oranges, это не сработает, так как REPLACE заменяет запятую, за которой следует пробел (в соответствии с примерами строк) ).

Я тоже не думаю, что это очень хорошо увеличится.

И, если у вас есть предложение типа «Джон любил есть ананасы», оно совпадало бы с двумя строками выше (так как в нем «яблоко»). Затем вы можете попытаться добавить границы слов к регулярному выражению (т.е. WHERE $sentence RLIKE '[[:<:]](apple|oranges|pears)[[:>:]]'), но это приведет к неправильному совпадению, если у вас есть множественное число («яблоки» не будут совпадать с «[wordboundary] apple [wordboundary]»).

0 голосов
/ 24 февраля 2012

Я действительно не думаю, что то, что вы ищете, вполне возможно, но вы можете посмотреть в полнотекстовый поиск или SOUNDEX . Например, SOUNDEX может делать что-то вроде:

WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%');

Я никогда не пробовал в этом контексте, но вы должны и дайте мне знать, как это работает.

0 голосов
/ 24 февраля 2012

Хранение данных с разделителями-запятыми ... менее чем идеально.
Если вы разбили строку «Джон любил есть яблоки» на отдельные слова, вы можете использовать оператор FIND_IN_SET :

WHERE FIND_IN_SET('apple', t.keywords) > 0

Производительность не будет хорошей - эта операция лучше подходит для Полнотекстовый поиск .

0 голосов
/ 24 февраля 2012

Мне неизвестно о каком-либо прямом решении этого типа запроса.Но Полнотекстовый поиск возможен.Если у вас есть полнотекстовый индекс в интересующей области, то поиск с OR между каждым словом в предложении (хотя я думаю, что подразумевается оператор OR) найдет эту запись ... но он также может найти большеты тоже хочешь.

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