php - 如何改进全文搜索的 mysql 查询?

标签 php mysql full-text-search

我使用以下查询来搜索我的表。但速度很慢,如何才能加快或改善呢?

    if ($stit0 || $sabst0 || $saut0 || $saffl0){
      $qt = "SELECT * FROM mytable WHERE (";
      if ($stit0){ $qt.="(MATCH(title) AGAINST('$stit0' IN BOOLEAN MODE))"; }
      if ($saut0){ $qt.=" AND (MATCH(authors) AGAINST('$saut0' IN BOOLEAN MODE)) "; }
      if ($sabst0){ $qt.=" AND (MATCH(abstract) AGAINST('$sabst0' IN BOOLEAN MODE))"; }
      if ($saffl0){ $qt.=" AND (MATCH(affiliation) AGAINST('$saffl0' IN BOOLEAN MODE))"; }
      if ($_GET[filter]){ $qt.=" AND (pubtype='$_GET[filter]')"; }
      $qt.=") ORDER BY year + pubdate DESC";
      $qt = str_replace("WHERE ( AND", "WHERE (", $qt);
      $qt1 = mysql_query($qt);
      $nqs = mysql_num_rows($qt1);
    }`

最佳答案

您声明了全文索引吗?查询看起来很简单,因此未索引的搜索可能会破坏您的数据库。

对于查询本身,我更喜欢以这种方式形成WHERE子句,这样可以省去很多麻烦。而且查询更具可读性。

// Define a list of constraints, put a default constraint on record types or whatever.
$conditions = array("someColumn = 1");
// Start collecting constraints based on already-sanitized user input 
if ($someFilter) $conditions[] = "someInt = {$someFilter}";
if ($otherFilter) $conditions[] = "MATCH(textColumn) AGAINST('{$otherFilter}')";
// repeat as much as you like, the only drawback is you can't write complex logic here.
// now merge the constraints to form the where-clause
$conditions = implode(' AND ', $conditions);

// Query in heredoc is much cleaner and structured.
$query = <<<HEREDOC

SELECT * FROM yourTable
WHERE {$conditions} 
ORDER BY year DESC, pubDate DESC

HEREDOC;
while ($result = mysql_fetch_assoc($query)) {
  // do your stuff
} 

关于php - 如何改进全文搜索的 mysql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9600805/

相关文章:

javascript - 使用可从网络访问的静态索引文件实现可扩展的文本搜索?

postgresql - 如何在具有多个结果的postgresql中进行文本搜索

search - 反转文件与签名文件

php - foreach循环中的mysql更新

php - 为每个员工设置工作百分比

php - 是否有一个 Symfony 助手来获取当前操作 URL 并更改一个或多个查询参数?

PHP Mysql 查询返回空值

php - 在 PHP 中仅加载特定函数的最佳方法

php - 对 php 页面进行 ajax 调用

mysql - 在 SSRS/MySQL 上检索行数