Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在非常小的列上进行全文搜索_Mysql_Sql_Full Text Search_Sql Like - Fatal编程技术网

Mysql 在非常小的列上进行全文搜索

Mysql 在非常小的列上进行全文搜索,mysql,sql,full-text-search,sql-like,Mysql,Sql,Full Text Search,Sql Like,我的MySQL数据库中有一个表Books,它有两列标题(varchar(255))和版本varchar(20))。这些值的示例为“微观经济学导论”和“4” 我想让用户根据标题和版本搜索书籍。因此,例如,他们可以进入“微观经济学4”,它将得到正确的结果。我的问题是如何在数据库端设置它 有人告诉我,全文搜索通常是这样做的好方法。但是,由于版本有时只是单个字符(“4”),因此必须设置全文搜索以查看单个字符(ft_min_word_len=1)。。我听说这是非常低效的 那么,我应该如何设置此数据库的搜索

我的MySQL数据库中有一个表Books,它有两列标题(varchar(255))和版本varchar(20))。这些值的示例为“微观经济学导论”和“4”

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

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


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

您可以在
标题
列上设置全文索引,并且只能在
版本
列上使用标准运算符匹配数字(>,如果您正在寻找准确的版本搜索,请绕过ft_min_word_len,我建议在用户搜索表单中有两个字段,一个用于标题,一个用于版本,这样您就不必猜测搜索短语中是否/何处有提及的版本(并且版本也可以是可选的)。在这种情况下,在“版本”列中搜索版本将使用“LIKE”

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

在本例中,当您创建新列时,解析版本(也可以对标题进行解析):

  • 将所有仅限数字的单词n更改为“EDNB”+n(例如“4”=>“EDNB4”)
  • 然后NewColumn=Title+“”+NewEdition
当用户搜索某物时

  • 在搜索短语中标识她的所有号码,并将其替换为“EDNB”+n
您可能希望将ft_min_word_len更改为3以捕捉“1”或“3”(或者您也可以编辑它们)

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


例如,如果标题为“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”.

问题是我想不出区分版本的规则。示例版本值:-“4”-“4”-“25周年纪念版”-“特别珍藏版”