Perl MySQL全文搜索
我是这个网站的新手 我有下面的代码来搜索带有全文索引的三列。(searchdatabase.title,searchdatabase.keywords,searchdatabase.description)Perl MySQL全文搜索,mysql,perl,full-text-search,dbi,Mysql,Perl,Full Text Search,Dbi,我是这个网站的新手 我有下面的代码来搜索带有全文索引的三列。(searchdatabase.title,searchdatabase.keywords,searchdatabase.description) $SQL\u QUERY=prepare(“$SQL\u QUERY”); $cursor->execute; 由于我对Perl全文搜索和SQL的了解有限,在上面的代码之前,我有以下代码来执行一些SQL注入预防,并使用空格“+”进行搜索 $datasent =~ s/ / +/g; $da
$SQL\u QUERY=prepare(“$SQL\u QUERY”);
$cursor->execute;
由于我对Perl全文搜索和SQL的了解有限,在上面的代码之前,我有以下代码来执行一些SQL注入预防,并使用空格“+”进行搜索
$datasent =~ s/ / +/g;
$datasent =~ s/ / +/g;
$datasent =~ s/\n//g;
$datasent =~ s/<//g;
$datasent =~ s/\x00//g;
$datasent =~ s/\r//g;
$datasent =~ s/\x1a//g;
$datasent =~ s/\;//g;
$datasent =~ s/\*//g;
$datasent =~ s/\'//g;
$datasent =~ s/\"//g;
$datasent=~s/+/+/g;
$datasent=~s/ / +/G
$datasent=~s/\n//g;
$datasent=~s/是这里的方法。它会帮你处理逃跑的事情
my $sql = <<'CURSOR_1';
select distinct url, keywords, description, title
from searchdatabase where
match ( searchdatabase.title, searchdatabase.keywords, searchdatabase.description )
against (? IN BOOLEAN MODE)
order by authority_rank desc, rank desc limit 10 offset $page;
CURSOR_1
对于$page
这将不起作用,因为它不是WHERE子句的一部分。相反,您应该确保它包含一个数字,以防它来自外部
die 'offset needs to be numeric' if $page =~ /\D/;
由于您是新用户,以下是有关代码的一些注释:
- 始终
使用严格的
和使用警告
——它们让你的生活更轻松
- 然后用
my
$ALL_CAPS
变量通常用于Perl中的全局变量
- 在DBI上下文中,语句句柄通常命名为
$sth
- 不要在
&foo()
中使用符号AND,它不会按您的想法操作
- 插值不需要将单变量放在双引号中
除了@simbabque的伟大建议,让我解释一下+
替代
默认情况下,全文搜索BOOLEAN
模式可能不会达到预期效果。“默认情况下(当未指定+或-时),该词是可选的,但包含该词的行的评级更高…”请参阅
因此,如果您的用户搜索redapple
,他们将获得mysql决定的具有“red”或“apple”优先级的任何内容。你可能会认为这不是他们想要的。因此,在后端,您可以将用户的搜索替换为+red+apple
,它告诉mysql搜索“red AND apple”
这就是我所拥有的
$datasent =~ s/[+\-<>)(]/ /g; #These have special meaning in the sql search that people probably don't want.
$datasent =~ s/(".*?"|\S+)/+$1/g; #Add '+' for the boolean search and pay attention to quotes.
$datasent=~s/[+\-)(]//g;#这些在sql搜索中有着人们可能不想要的特殊意义。
$datasent=~s/(“*?”|\s+/+$1/g;#为布尔搜索添加“+”,并注意引号。
谢谢你的建议,我已经编辑了代码,使其适合。现在更好了吗?非常感谢,让限制和偏移在布尔模式下具有占位符和占位符成功了!@TsubasaKato很高兴我能提供帮助。请学习如何接受解决问题的答案:)是的,这就是我想先弄明白的。我忘了在$datasent部分添加一点。我编码了$datasent=“\+$datasent”代码>位于+替换行前面。这是正确的吗?在类似的代码中,我首先去掉所有的“+”和“-”符号,然后重新添加它们,注意带引号的字符串。我可以用这些信息来更新我的答案,但是现在还没找到。谢谢你的建议。我会设法按照你的建议去做。
die 'offset needs to be numeric' if $page =~ /\D/;
$datasent =~ s/[+\-<>)(]/ /g; #These have special meaning in the sql search that people probably don't want.
$datasent =~ s/(".*?"|\S+)/+$1/g; #Add '+' for the boolean search and pay attention to quotes.