【问题标题】:How to make a full text search engine with php and mysql?如何用php和mysql做一个全文搜索引擎?
【发布时间】: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


【解决方案1】:

这是我过去使用的。此外,您正在执行 MATCH 的列必须更改为允许 FULLTEXT:

    $keyword = "Led Zeppelin";
    $words = explode(" ",$keyword);

    $keyword_parts = '';
    foreach ($words as $w) {
        $keyword_parts .= "+" . $w ." ";
    }
    $keyword_parts = substr($keyword_parts,0,-1);
    $query = "SELECT
              *,
              MATCH (column1,column2) AGAINST ('" . $keyword . "') as score
              FROM table
              WHERE MATCH (column1,column2) AGAINST ('" . $keyword_parts . "' IN BOOLEAN MODE)
              ORDER BY score DESC";

【讨论】:

  • 我已经更改了列(关键字和标题),并将它们添加到您提供的代码中,但现在它甚至找不到任何东西。我错过了什么吗?
  • 另外,我相信全文搜索也仅适用于 MyISAM 表。
  • 是的,我得到“未找到结果”。那么我的表是否必须是 MyISAM 才能做到这一点?
  • 我认为是这样,但您可能需要事先进行更多研究。我所有的全文搜索表都是 MyISAM 表
  • 另外,运行查询的结果是否没有全文?
猜你喜欢
  • 2013-10-09
  • 2013-09-03
  • 1970-01-01
  • 2021-01-24
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多