我正在为任意文本/短语实现类似自动建议的功能。我想为用户提供一些绝对的相关性,而不仅仅是找到的项目相对于彼此的排名。即,如果数据库中的某些行包含以确切形式和顺序输入的文本,我需要一个大约“1”的排名。
例如,让我们搜索“我喜欢水果”:
- 对于内容为“我肯定喜欢水果和蔬菜”的行,我希望排名为1或更低。
- 对于内容“我喜欢新鲜水果”的行,我希望结果小于 1 但仍然很高,例如0.7。
这可以用 MySQL 和 FULLTEXT 完成吗?而不是 [0,1] 我得到像 2.7 或 1.2 甚至 0.6 这样的值来进行完全匹配。它出什么问题了?
这是我的测试表:
表数据:
id text
1 Lorem ipsum dolor
2 You can search an index, and organize and present search results.
3 The Search API can index any number of documents.
4 Each field has a name and a type.
5 Each field is required.
7 Cras dapibus. Vivamus elementum semper nisi.
8 Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.
9 Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi.
10 Nam eget dui. Etiam rhoncus.
查询一:
SET @str := 'Lorem ipsum dolor';
SELECT id, TEXT, MATCH (TEXT) AGAINST (@str) rank FROM test WHERE MATCH (TEXT) AGAINST (@str);
->
id text rank
1 Lorem ipsum dolor 1.280059814453125
这个“1.28”是什么意思?在这里有'1'会很好。
查询 2:
SET @str := 'Each field is required.';
SELECT id, TEXT, MATCH (TEXT) AGAINST (@str) rank FROM test WHERE MATCH (TEXT) AGAINST (@str);
->
id text rank
5 Each field is required. 1.7639520168304443
4 Each field has a name and a type. 0.8533731698989868
还有一场完整的比赛,我也希望这里是“1”。
查询 3:
SET @str := 'Aenean leo ligula, porttitor eu';
SELECT id, TEXT, MATCH (TEXT) AGAINST (@str) rank FROM test WHERE MATCH (TEXT) AGAINST (@str);
->
id text rank
8 Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. 3.5851094722747803
9 Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. 0.4266865849494934
也完全匹配,并返回神秘的“3.58”。
我不需要精确的数字,只需要 [0,1] 之间的数字,这样我就可以确定是否存在完整(或几乎完整)匹配。如果结果完全包含搜索到的字符串,我需要大约 0.8..1 的内容。或者它只是一个错误的工具?FULLTEXT 实际上并不是那么完整的文本,因为我不知道它是否完全匹配。