Расширенный запрос с MySQL Match Against

Можно ли использовать Match / Against для соответствия ключевому слову, но не в том случае, если оно встречается в определенной фразе?

Например, если я хочу сопоставить «собаку», но не «хот-дог»:

«Это собака» должно совпадать.

«Это хот-дог» не должно совпадать.

«Хот-дог — это не собака» должно совпадать, потому что вторая «собака» не является частью «хот-дога».

Мое приложение ищет сотни ключевых слов, определенных пользователем, в большой базе данных (~ 100 000 записей), поэтому производительность этого запроса важна.

Изменить: я хотел бы сопоставлять только целые слова, а не ключевые слова, которые появляются как часть другого слова.


person Ron.Eng    schedule 31.05.2015    source источник


Ответы (1)


Если вы сначала replace все вхождения hot dogс '', а затем выполните match с 'dog' на результат, вы должны получить там. Что-то типа:

SELECT * FROM mytable WHERE MATCH (REPLACE(mycol,'hot dog','')) AGAINST ('dog');

Только что попробовал, и MATCH работает по-другому. Для этого требуется, чтобы для целевых столбцов существовал полнотекстовый индекс, и только они могут быть названы в качестве аргументов функции MATCH. Следовательно: мой подход не работает. Но что насчет

SELECT * FROM mytable WHERE REPLACE(mycol,'hot dog','') like '%dog%';

Хорошо, тогда, возможно, это поможет

SELECT * FROM mytable WHERE REPLACE(mycol,'hot dog','') regexp '[[:<:]]dog[[:>:]]'

в нахождении только тех случаев, когда 'dog' является отдельным словом?

person Carsten Massmann    schedule 31.05.2015
comment
Хорошая идея, но я хотел бы сопоставить целые слова (я должен был упомянуть об этом в исходном вопросе). С «нравится» я также получу собаку как часть другого слова. - person Ron.Eng; 31.05.2015
comment
Спасибо, я проголосовал за ваше решение, но я думаю, что оно не полностью защищено от пользователя: например, если пользователь также хочет цепочку для собак, а текст содержит цепочку для хот-догов. Кроме того, я думаю, что производительность регулярного выражения не будет хорошо масштабироваться. - person Ron.Eng; 31.05.2015