【发布时间】:2015-07-20 19:24:25
【问题描述】:
我使用开源代码创建了一个 php 搜索引擎。我创建了一个数据库和一个包含 5 列的表:
标题、描述、关键词、链接、日期
我使用的代码是下面的php代码:
<?php
$keywords = $_GET ['input'];
$keywords = "Led Zeppelin";
$words = explode(" ",$keyword);
foreach ($words as $w) {
$keyword_parts .= "+" . $w ." ";
}
$keyword_parts = substr($keyword_parts,0,-1);
$query = "SELECT
*,
MATCH (keywords,title) AGAINST ('" . $keywords . "') as score
FROM search
WHERE MATCH (keywords,title) AGAINST ('" . $keyword_parts . "' IN BOOLEAN MODE)
ORDER BY score DESC";
//connect
mysql_connect ("localhost", "root", "password");
mysql_select_db("intranet");
$query = mysql_query($query);
$numrows = mysql_num_rows ($query);
if($numrows >0){
while ($row = mysql_fetch_assoc($query)){
$id = $row ['id'];
$title = $row ['title'];
$description = $row ['description'];
$keywords = $row ['keywords'];
$link = $row ['link'];
$date = $row ['date'];
echo "<h2><a href='$link'>$title</a><h2/>
$description <br /><br />";
}
}
else
echo "No results found for \"<b>$each</b>\" ";
//disconnect
mysql_close();
?>
搜索脚本工作正常,但唯一的问题是它按关键字搜索,这增加了搜索结果,但由于不同条目上的许多关键字匹配,因此很难找到您想要的内容。
现在,我正在网上阅读全文搜索(“全文搜索是使用 MATCH() ... AGAINST 语法执行的。MATCH()”),但我不知道如何将其应用于我的代码。
【问题讨论】:
-
我在这里测试了一些东西:stackoverflow.com/questions/30677087/… 在链接中引用了斯宾塞在自然语言中所做的事情,然后放弃了健壮的
solr -
我看到了,但我的问题在于在我的代码上实现它,这是我在上面粘贴的那个。如果您可以将该功能包装在我的代码周围,我将不胜感激。谢谢
-
正如 Rob 所展示的,无论您选择查询是什么,都将其塞入您的 $query 变量中。并逃离 mysql_* 函数。而是去 mysqli 或 pdo 除非您希望用户应该搜索而不是删除您的表。
-
这看起来有 SQL 注入漏洞,顺便说一句 - 上线前修复!
标签: php mysql full-text-search full-text-indexing