我试图在MySQL中进行搜索,其中用户只有一个字段。该表是这样的:MySQL:使用MySQL相关搜索的特殊搜索算法
ID BIGINT
TITLE TEXT
DESCRIPTION TEXT
FILENAME TEXT
TAGS TEXT
ACTIVE TINYINT
现在,如果用户输入只是blah blubber
,搜索必须请检查是否每一个字出现在田间地头TITLE
,DESCRIOTION
,FILENAME
或TAGS
。结果本身应该按相关性排序,因此字符串在记录中出现的频率如何。我得到这个示例数据:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | blah | blah | bdsai | bdha | 1
2 | blubber | blah | blah | adsb | 1
3 | blah | dsabsadsab | dnsa | dsa | 1
在此示例中,ID 2必须在顶部(2×等等,1个脂),然后1(2×等等),然后加入3-(1X等等)。这个过程应该是动态的,所以用户也可以输入更多的单词,并且相关性与一个或几个单词相同。
这只能在MySQL中实现,还是必须使用一些PHP?这将如何工作?
非常感谢您的帮助!问候,弗洛里安
编辑:下面是结果后,我想汤姆苹果的答案:
我有四个记录看起来像这样:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | s | s | s | s | 1
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
3 | 0 | s | s | s | 1
4 | a | a | a | a | 1
现在,如果我搜索的字符串s
,我只能得到排在前三位的记录,按s的相关性排序。这意味着,这些记录应该是订货这样的:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1 <== 8x s
1 | s | s | s | s | 1 <== 4x s
3 | 0 | s | s | s | 1 <== 3x s
现在,我想我这样的查询(表名是PAGES
):
select t . *
from (
select
match(title) against('*s*' in boolean mode)
+ match(description) against('*s*' in boolean mode)
+ match(filename) against('*s*' in boolean mode)
+ match(tags) against('*s*' in boolean mode)
as matchrank,
bb . *
from pages bb) t
where t.matchrank > 0
order by t.matchrank desc
该查询返回的:
matchRank | ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
这是因为通配符?我认为,字符串*s*
也应该找到一个值,只有s
...
事实证明,通配符解决方案对于ft_min_word_len设置不是有效的解决方法。最好的想法是将此设置更改为1并重新启动mysql。如果你不能用“LIKE”编写解决方法,但对于多于一个字符串和不到4个字符('S') –