PHP Как проверить, содержится ли строка в тексте из базы данных, используя php - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю систему перефразирования, где пользователь вводит текст, а система перефразирует их.

Моя база данных выглядит следующим образом:

KeyWord: dainty

Synonyms1: choice; очень вкусно; вкусный; сочный; сочный; Palatable; несладкий

Синонимы2: эфирный; прекрасный; хрупкий; обаятельная; Аппетитный; хрупкая; Elegant

, где Keyword (varchar), Synonym1 (текст) и Synomy2 (текст) являются столбцами базы данных. Пример выше - это одна строка базы данных с 3 полями и их значениями.

Вот как это работает, если система находит, например, слово типа вкусно , его можно заменить любым словом, отделенным точкой с запятой от Synomyn1 или Synonym2 или ключевого слова. потому что они все синонимы.

Позвольте мне объяснить, как работает поиск слов. Система сначала ищет слово в столбце «Ключевое слово», если слово не найдено, я go далее и ищу слово в столбце «Synmon1» и так далее.

Моя проблема - проверка заданного пользователем слова c в столбцах Синоним1 или Синоним2. Когда я использую предложение LIKE, общий способ c поиска в базе данных, система не ищет полное имя, вместо этого она ищет символы. Например, предположим, что текст автора: « у Бенсона кубик льда », система предполагает, что лед был найден в чо лед . Я не хочу этого, я хочу искать полное слово.

Если кто-то меня понял, помогите решить эту проблему.

1 Ответ

1 голос
/ 21 апреля 2020

Если я понимаю ваш вопрос, вы хотите найти ice в столбцах Synonyms1 и Synonyms2, но убедитесь, что вы случайно не нашли совпадения с таким словом, как choice.

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

Столбец синонимов может содержать только одно слово, поэтому он может выглядеть следующим образом:

ethereal

Или:

ethereal; beautiful; fragile; charming; petite; frail; elegant

Таким образом, слово, которое вы ищем, может быть:

  1. все значение столбца
  2. , которому предшествует ничто, за которым следует ;
  3. , которому предшествует пробел, а затем ;
  4. , перед которым стоит пробел и ничего не следует

Так что, если ваша версия MySQL не поддерживает регулярные выражения, то если вы ищете, например, слово ice в столбце Synonyms2 предложение WHERE должно быть:

WHERE (
   Synonyms2 = 'ice'
   OR
   Synonyms2 like 'ice;%'
   OR
   Synonyms2 like '% ice;%'
   OR
   Synonyms2 like '% ice'
)

Если вы работаете SQL 8+, то:

WHERE regexp_like(Synonyms2, '( |^)ice(;|$)')

Это означает, что ice должен должен предшествовать либо пробел или начало строки, а затем ; или конец строки.

...