【问题标题】:FULLTEXT search on a very small column在非常小的列上进行 FULLTEXT 搜索
【发布时间】:2010-08-09 04:50:41
【问题描述】:

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

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

有人告诉我,全文搜索通常是执行此类操作的好方法。但是,因为版本有时只有一个字符(“4”),所以必须设置全文搜索来查看单个字符(ft_min_word_len = 1)。我听说这非常低效。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    在这种情况下,当您创建新列时,解析版本(标题也可以这样做):

    • 将所有只有数字的单词 n 更改为“EDNB”+n(例如“4”=>“EDNB4”)
    • 然后 NewColumn = Title + " " + NewEdition

    当用户搜索某物时,

    • 在搜索词组中识别出她的所有号码并将其替换为“EDNB”+n。

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

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

    例如,如果标题是“Recette de la crème brûlée”并且版本是“France 4”,那么您最终会得到一个搜索列“recette de la creme brulee france EDNB4”。如果用户搜索“crëme 4”,“ë”变为“e”,“4”变为“EDNB4”,搜索词组变为“creme EDNB4”。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这个问题是我想不出一个区分版本的规则。示例版本值:-“4”-“4th”-“25 周年纪念版”-“特别收藏版”
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2018-12-19
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多