MYSQL REGEX搜索许多没有顺序条件的单词

时间:2019-03-24 14:45:03

标签: mysql regex database

我尝试将正则表达式与mysql一起使用,以搜索json数组字符串中的边界词,但我不希望正则表达式匹配词的顺序,因为我不知道它们。

所以我首先开始在regex101(https://regex101.com/r/wNVyaZ/1)上编写我的regex,然后尝试将其转换为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 :(得分:0)

您可以像下面这样搜索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

答案 1 :(得分:0)

如果可以,请使用JSON搜索查询(您需要具有JSON支持的MySQL)。

如果可取,请考虑更改数据库结构,并输入各种“单词”作为相关表。这将使您的查询功能更加强大(而且速度更快)。

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+(不确定),并且在“服务”列的整个范围内都有一个索引),实际上,一些LIKE查询会使您少花钱[em] :

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;