关于使用mySQL进行全文本搜索有很多问题,我已经阅读了很多内容,但没有找到我想要的内容(在google或stackoverflow中)。
我不是要匹配行(或文档),而是要匹配行中包含的单词。
例如,假设您有一个company表,其中包含id,名称和small_description列。您可以找到像这样的行:
1 | MyBaker | fine bakery since 1920
2 | Bakery factory | all the materials for a bakery
etc...
现在,当用户键入“ bak”时,我想向他建议“面包店”一词(并且我不想直接向他建议MyBaker和Bakery工厂,因为有数百家公司可以匹配,但只有一家几个不同的单词)
我认为底层的mySQL全文引擎已经具有某种“单词查找”功能,因此我想使用该功能,而不是自己解析名称和small_description来使用字| nb_occurences
(更不用提,如果在另一个表中进行了大量更新以减少计数器,则可能很难保持同步:()
其背后原因是创建自动完成搜索 单词建议将与数据库内容相关的地方
例如,亚马逊(.fr)做得非常糟糕。如果您输入“ tel”,则会建议一打“电话”匹配项,并建议输入“ 0”“电视”或“望远镜”或“遥测” ... ...
虽然在台式机中输入完整单词不是很快,但这并不是真正的问题,对于移动设备而言,这确实是一个问题
由于智能手机键盘建议的某些单词不在我的数据库中,而智能手机键盘从未提示我的数据库中的某些单词,这一事实进一步放大了。
例如,我的数据库中有0个电话和电视,但是遥测和电话会议很多
最后,如果可能的话,我也想宽恕拼写错误(例如:telme应该与遥测匹配)
我希望有人可以帮助我利用现有的全文索引来实现我的目标
答案 0 :(得分:1)
FULLTEXT搜索可查找与您向其显示的一个或多个单词匹配的数据行。如您所知,这不仅仅是单词搜索。
您可以在后端程序中获取FULLTEXT搜索的结果,将其分解为单词,然后考虑将其中最频繁的单词用于自动补全。如果您使用WITH QUERY EXPANSION
修改了搜索,这可能会很好地工作。
(请记住,自然语言FULLTEXT搜索在处理要搜索的少量数据时会奇怪地工作,因此请对包含多行而不是几行的表进行测试。)
但是,FULLTEXT无法正确处理词干(城堡+城堡-聊天),也无法纠正拼写错误。
您可以将Apache Lucene用于您的目的,但这是一个庞大而复杂的系统。
我认为您需要单词/ nb_appearances表,该表很令人讨厌,难以维护。它将为您提供这样做的能力
SELECT word
FROM words
WHERE word LIKE CONCAT(:input,'%')
ORDER BY nb_appearances DESC;
获得部分单词匹配。 FULLTEXT无法做到这一点。您还可以添加第二个查找表来更正应用程序域中的常见拼写错误,例如,遥测->遥测。当然,这是脖子上的疼痛。