Идентичные FULLTEXT против REGEXP против LIKE поисков, возвращающих разные результаты - PullRequest
0 голосов
/ 07 июня 2019

У меня есть три разных запроса MYSQL, которые я пытаюсь использовать для поиска по одному столбцу (список классов); цель состоит в том, чтобы столбец содержал _10_, но не должен содержать _3_ или _15_ (примерным значением может быть что-то вроде _4_8_10_15_, которое не будет выполнено с учетом _15_).

Я пробовал три разных подхода, и все три не дают ошибок, но все же разные результаты:

1) Поиск FULLTEXT (с включенным индексом FULLTEXT в списке классов) не дал ошибок, но также не дал результатов.

SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+10 -3 -15' IN BOOLEAN MODE)

2) Простые предложения LIKE вернули 516 строк.

SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE "%_10_%" AND classlist NOT LIKE "%_3_%" AND classlist NOT LIKE "%_15_%"

3) Гибрид LIKE / REGEXP дал 1912 результатов. В одном примере возвращалось, что второй подход не был _4_10_18_23_ - это точный результат, и в этом результате нет дубликатов, поэтому я должен предположить, что во втором подходе (не менее первом!) Что-то не так.

SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE '%_10_%' AND classlist NOT REGEXP '_3_|_15_'

В этот момент я остаюсь, качая головой и не зная, что происходит. Есть всегда более глубокие проблемы, которые я мог бы попытаться найти, но может ли кто-нибудь проверить, правильно ли я выполняю подходы REGEXP и / или FULLTEXT? Похоже, что я видел в Google после последних нескольких часов чтения и подражания, но я впервые использую любой из них.

1 Ответ

0 голосов
/ 07 июня 2019

Согласно комментариям, я нашел решение.Сначала я сделал записи MYSQL простыми (4 8 10 15 в предыдущем примере).

Затем поиск работает следующим образом:

SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+10 -3 -15' IN BOOLEAN MODE)

SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE "% 10 %" AND classlist NOT LIKE "% 3 %" AND classlist NOT LIKE "% 15 %"

SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE '% 10 %' AND classlist NOT REGEXP ' 3 | 15 '

Интересно, что простая версия «Мне нравится» была в 2-3 раза быстрее двух других!Полный текст был немного медленнее, чем REGEXP.

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