我尝试将正则表达式与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”之前,而不是像在查询中写的那样。问题在于查询是自动生成的,并且所选择的服务列表没有顺序的重要性,并且无论它们的顺序如何,我都希望仅匹配边界词(如果它们存在)。
答案 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;