Поиск текстового ввода для поиска слов из списка в базе данных - PullRequest
2 голосов
/ 22 апреля 2019

У меня есть таблица MySQL со списком плохих слов (bad_words), и я хочу просканировать текстовое поле (public_message) на количество плохих слов в этом поле. В bad_words

записано около 1100 записей.

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

Примерно так: SELECT public_post_id, count(word) FROM public_posts WHERE public_message CONTAINS (SELECT word FROM bad_words) Я знаю, что этот синтаксис неправильный, но это суть того, чего я пытаюсь достичь.

Окончательный вывод должен содержать количество плохих слов в каждом public_message. Меня не интересуют, какие слова на данный момент, просто есть ли они и сколько.

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете сделать это:

SELECT p.public_post_id, COUNT(*)
FROM public_posts p JOIN bad_words b
  ON public_message LIKE CONCAT('%', b.word, '%')

Но у него будет невероятно плохая производительность.Он должен будет выполнить количество поисков, равное количеству строк в public_posts раз 1100 слов в bad_words.

MySQL имеет функцию полнотекстовой индексации, но этоне будет работать для вашего случая.

https://dev.mysql.com/doc/refman/8.0/en/fulltext-restrictions.html говорит:

Аргументом AGAINST () должно быть строковое значение, которое является постоянным во время оценки запроса.Это исключает, например, столбец таблицы, поскольку он может различаться для каждой строки.

Другими словами, вы не можете сделать это:

SELECT ...
FROM public_posts p JOIN bad_words b
 ON MATCH(p.public_posts) AGAINST(b.word) -- ERROR!

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

Или вы можете сделать это с полнотекстовым индексом, перечислив много слов в выражении AGAINST:

SELECT ...
FROM public_posts p
WHERE MATCH(p.public_posts) AGAINST('word1 word2 word3 word4 word5...' IN BOOLEAN MODE)

Множество слов может быть списком, который вы генерируете, запрашивая таблицу bad_words.

Но это не говорит о количестве совпадений на слово, только то, что сообщение содержало хотя бы одно совпадениеслово.

Кроме того, я не уверен, есть ли ограничение по длине, или вы можете сделать строку из всех 1100 плохих слов.

Я не знаю ни одной другой реализации полнотекстового поиска, котораясправится с этим лучше.

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