这是我的搜索功能。有了它,我可以完美地搜索整个单词和数字。但是,我无法搜索“ the”之类的短词。
public function search($search)
{
$goodString = $this->makeString($search);
$search_results = Model::select('*')->selectRaw('MATCH(title) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance', [$goodString])->whereRaw('MATCH(title) AGAINST(? IN NATURAL LANGUAGE MODE)', [$goodString])->orderBy('relevance', 'desc');
return $search_results;
}
我正在使用:
mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper
Ubuntu 16.04
我对mysql配置/etc/mysql/my.cnf
进行了更改,并设置了以下内容:
[mysqld]
innodb_ft_min_token_size = 2
ft_min_word_len = 2
此后,我重新启动mysql servel,然后在mysql中使用以下命令继续重建全文表:
set GLOBAL innodb_optimize_fulltext_only=ON;
OPTIMIZE TABLE table_name;
然后我又重新启动了mysql服务器,什么也没有。当我搜索“ the”,“ of”,“ at”等时没有结果。
所以我的问题是,我应该怎么做才能搜索短单词和数字值(例如“ 10”或“ 20”等)?
提前谢谢!
编辑:
这是我通过Laravel创建全文搜索的方式:
在迁移时,我在Schema::create
函数的末尾添加了以下内容
DB::statement('ALTER TABLE news ADD FULLTEXT search(title)');
此外,如果标题中有双数字(如“ 13”),则搜索13时无法得到结果。
一个后续问题:
是否可以在FULLTEXT搜索中搜索部分匹配单词?目前,我将字符串中的单词弄乱,并生成诸如“ + search + string + here”之类的字符串,如果标题中存在单词“ searched”,是否可以找到匹配项?
答案 0 :(得分:1)
您提到的单词称为停用词(经常出现而被忽略)
您可以创建一个新的(较短的)列表并使用它。请确保将文档更改为Mysql版本。
答案 1 :(得分:0)
要在句子中搜索单词,请使用以下方法:
preg_match("/{$wordsOrSentenceFromDB}/i", $WordsYouEnteredFromForm);