我在我的网站上遇到基本搜索问题,因为只有在单词顺序完全匹配时才会找到匹配项。
例如,如果我搜索鞋子红色,它将不会显示红鞋的结果。
如果您搜索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;
}
这里有什么想法吗?
答案 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