MYSQL REGEX поиск много слов без условия заказа - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь использовать регулярное выражение с mysql, которое ищет граничные слова в строке массива json, но я не хочу, чтобы порядок слов соответствовал регулярному выражению, потому что я их не знаю.

Поэтому я сначала начал снапишите мое регулярное выражение в regex101 (https://regex101.com/r/wNVyaZ/1), а затем попытайтесь преобразовать это для mysql.

WHERE `Wish`.`services` REGEXP '^([^>].*[[:<:]]Hygiène[[:>:]])([^>].*[[:<:]]Radiothérapie[[:>:]]).+';
WHERE `Wish`.`services` REGEXP '^([^>].*[[:<:]]Hygiène[[:>:]])([^>].*[[:<:]]Andrologie[[:>:]]).+';

В первом запросе я получаю результат, потому что "Hygiène" предшествует "Radiothérapie""но во втором запросе" Andrologie "стоит перед" Hygiène ", а не после, как написано в запросе. Проблема в том, что запрос генерируется автоматически со списком сервисов, которые выбираются без значения порядка, и я хочу сопоставитьтолько граничные слова, если они существуют независимо от порядка, в котором они находятся.

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Если можете, используйте поисковые запросы JSON (вам нужен MySQL с поддержкой JSON).

Если это целесообразно, рассмотрите возможность изменения структуры базы данных и введите различные «слова» в виде связанной таблицы. Это позволит вам гораздо более мощные (и более быстрые) запросы.

JOIN has_service AS hh ON (hh.row_id = id)
JOIN services AS ss ON (hh.service_id = ss.id
       AND ss.name IN ('Hygiène', 'Angiologie', ...)

В противном случае, в этом контексте, учтите, что вы на самом деле не выполняете поиск по регулярному выражению, и вы выполняете полное сканирование таблицы в любом случае (если только MySQL 8.0+ или PerconaDB 5.7+ (не уверен) и (индекс для полного экстента столбца 'services'), а несколько запросов LIKE будут стоить на меньше :

WHERE (services LIKE '%"Hygiène"%'
    OR services LIKE '%"Angiologie"%'
    ...)

или

 IF(services LIKE '%"Hygiène"%', 1, 0)
+IF(services LIKE '%"Angiologie"%', 1, 0)
+ ... AS score

HAVING score > 0 -- or score=5 if you want only matches on all full five
ORDER BY score DESC;
0 голосов
/ 24 марта 2019

Вы можете искать слова в JSON следующим образом (я тестировал на MySQL 5.7):

select * from wish 
where json_search(services, 'one', 'Hygiène') is not null 
  and json_search(services, 'one', 'Andrologie') is not null;

+------------------------------------------------------------+
| services                                                   |
+------------------------------------------------------------+
| ["Andrologie", "Angiologie", "Hygiène", "Radiothérapie"]   |
+------------------------------------------------------------+

См. https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-search

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