mysql全文搜索:使用通配符的距离

gzjq41n4  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(776)

我的数据如下:

[column "content"]
The quick red horse jumps over the quick dog
The quick brown horse
The quick brown horse jumps over the lazy dog
The quick brown horses jumps over the dog
quick as a mouse was the spider. The horse is brown.

我使用match和against来获得所有与马和马有关的行。所以,我知道,通配符*在布尔模式下工作。

SELECT * FROM news
WHERE   (MATCH (content) AGAINST ('+quick +horse*' IN BOOLEAN MODE));

在下一个查询中,我得到了所有带有“horses”(复数)和“quick”的行,最大距离为3。

SELECT * FROM news
WHERE   (MATCH (content) AGAINST  ('"quick horses" @3' IN BOOLEAN MODE));

最简单的方法是将两者结合在一起:所有的马或马和“快”,最大距离为3。

SELECT * FROM news
WHERE   (MATCH (content) AGAINST  ('"quick horse*" @3' IN BOOLEAN MODE));

在结果集中,只有包含“horse”的行马“不包括在内!
完整文档请参见:http://sqlfiddle.com/#!9/033e02/6号
有人知道吗?

aor9mmx1

aor9mmx11#

在发现这是mysql中的一个有文档记录的bug之后,我搜索了另一种方法。缺陷:https://bugs.mysql.com/bug.php?id=80723
想法:正则表达式。同样,这是一条艰难的道路,因为mysql目前只支持一部分通用表达式。
在mysql正则表达式中引用组?
https://dev.mysql.com/doc/refman/5.5/en/regexp.html
经过多次实验后,这对我有效。http://sqlfiddle.com/#!9/7007ac7/1号

SELECT * FROM news
WHERE content REGEXP 'quick([[:space:][:punct:]])*(((([[:alnum:]])*)*[[:space:][:punct:]]){1,3})horse';

相关问题