FULLTEXT搜索一个非常小的列

时间:2010-08-09 04:50:42

标签: mysql sql full-text-search sql-like

我的MySQL数据库中有一个表,其中包含Title(varchar(255))和Edition varchar(20)列。这些的示例值是“微观经济学导论”和“4”。

我想让用户根据标题和版本搜索图书。因此,例如,他们可以进入“微观经济学4”,它将获得正确的结果。我的问题是我应该如何在数据库方面进行设置。

我被告知FULLTEXT搜索通常是做这样事情的好方法。但是,由于版本有时只是一个字符(“4”),因此必须设置全文搜索才能查看单个字符(ft_min_word_len = 1)。我听说这是非常低效的。

那么,我应该如何设置此数据库的搜索?我知道这里可以使用CONCAT / LIKE。我的问题是它是否是最好的方式,或者与替代方案相比是否会太慢。我的图书数据库有数十万本书,很多用户都会搜索它。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找准确的版本搜索,绕过ft_min_word_len,我建议在您的用户搜索表单中有两个字段,一个用于标题,一个用于版本,这样您就不必猜测是否/哪里有搜索短语中提到的版本(和版本也可以是可选的)。在这种情况下,在版本列中搜索版本将使用“LIKE”。

另一种解决方案 - 因为您的字符大小非常小 - 是创建一个专门用于FullText索引/搜索的新列,您可以在其中连接标题和版本。为了不用担心ft_min_word_len和Edition,首先连接一个自己保留的单词,用户不太可能搜索,如“EDNB”,而版本是一个数字(或小)。

在这种情况下,当您创建新列时,解析版本(也可以为Title执行此操作):

  • 将所有唯一数字字n更改为“EDNB”+ n(例如“4”=>“EDNB4”)
  • 然后NewColumn = Title +“”+ NewEdition

当用户搜索某些内容时,

  • 识别搜索短语中的所有数字,并将其替换为“EDNB”+ n。

您可能想要将ft_min_word_len更改为3以捕获“1st”或“3rd”(或者您也可以EDNB它们)。

请注意,拥有一个新的独立搜索列可能很方便:不是因为不区分大小写(因为Fulltext已经这样做了),而是搜索带拼写错误拼写的单词。您可以将所有重音更改为无重音字母。

例如,如果标题是“Recette delacrèmebrûlée”并且版本是“France 4”,那么您最终会得到“recette de la creme brulee france EDNB4”的搜索栏。如果用户搜索“crëme4”,则“ë”变为“e”,“4”变为“EDNB4”,她的搜索短语变为“creme EDNB4”。

答案 1 :(得分:0)

您可以在title列上设置全文索引,并且仅将edition列上的数字与标准运算符(>,<,=)匹配。虽然您必须从业务层的搜索查询中提取信息。