通过MySQL全文搜索自动完成,该搜索会提出单词而不是结果

时间:2019-02-08 10:00:23

标签: mysql full-text-search

关于使用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应该与遥测匹配)

我希望有人可以帮助我利用现有的全文索引来实现我的目标

1 个答案:

答案 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无法做到这一点。您还可以添加第二个查找表来更正应用程序域中的常见拼写错误,例如,遥测->遥测。当然,这是脖子上的疼痛。

相关问题