基本站点搜索代码

时间:2013-02-12 08:49:38

标签: php html mysql sql

我在我的网站上遇到基本搜索问题,因为只有在单词顺序完全匹配时才会找到匹配项。

例如,如果我搜索鞋子红色,它将不会显示红鞋的结果。

如果您搜索Red Shoe Laces,它将不会显示Red Laces的结果(因为鞋子会抛出此订单)。以下是我认为搜索框正在使用的代码。任何人都可以告诉我如何“放松”这个搜索,以便更广泛或不那么精确的单词顺序是不必要的?

这是当前的代码:我的PHP代码知识是基本的,所以如果可能的话,请参考如何解决这个问题的确切位置(如果可能的话):

case 'search':
          if (intval($filter) != 0) {       
              $filter = JString::strtolower($filter);
              $id = intval($filter);
              $search .= $temp."(a.id = $id OR LOWER(a.ad_headline) LIKE '%".$this->_db->getEscaped($filter,true)."%' OR LOWER(a.ad_text) LIKE '%".$this->_db->getEscaped($filter,true)."%')";
          } else {
              $filter = JString::strtolower($filter);
              $search .= $temp."(LOWER(a.ad_headline) LIKE '%".$this->_db->getEscaped($filter,true)."%' OR LOWER(a.ad_text) LIKE '%".$this->_db->getEscaped($filter,true)."%')";
          }
          break;
          }
          }
      }
      return $search;
 }

这里有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您需要使用Full-Text Search功能

见下面的语法:

<强> MATCH (field_name1,field_name2) AGAINST (value)

在您的上下文中,如下所示:

$search .= $temp."MATCH(a.ad_headline,a.ad_text) AGAINST ('".$this->_db->getEscaped($filter,true)."')";

有关详细信息,请Refer link

答案 1 :(得分:0)

并非每个数据库都可以使用全文搜索。

这是穷人的另类选择。

我通常将查询拆分为空格,然后有很多相似的条件,但是没有结果的权重,但它会稍微缩小结果。

 $pattern_parts = preg_split('/\s+/', $pattern);

 $sql = "SELECT * FROM tablename WHERE " 

 foreach ($pattern_parts as $pattern_part) {
    $sql.= " (field1 LIKE '%$pattern_part%' OR field2 LIKE '%$pattern_part%') AND ';
 }

 $sql .= " (fieldx = 'y') "; // other conditions go here
 $sql .= "ORDER BY field1 ASC"; 

显然你需要处理转发数据等

如果您需要超出Fulltext搜索所能提供的范围,请查看phplucence