我在我的网站上的基本搜索遇到了问题,因为它只在单词顺序是精确匹配的情况下才能找到匹配。
例如,如果我搜索Shoes Red,它不会显示Red Shoes的结果。
如果你搜索红色鞋带,它不会显示红色鞋带的结果(因为鞋这个词抛出了这个订单)。下面是我认为搜索框正在使用的代码。谁能告诉我如何“放松”这个搜索,这样它要么更宽泛,要么不需要精确的词序?
这是当前的代码:我的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;
}这里有什么想法吗?
发布于 2013-02-12 16:57:48
您需要使用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
发布于 2014-01-08 10:51:54
全文搜索并不总是可用于每个数据库。
这是穷人的另一种选择。
我通常在空格上拆分查询,然后有很多like条件,但是没有结果的权重,但它在一定程度上缩小了结果的范围。
$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"; 显然,您需要注意转义数据,等等
如果您需要全文搜索所能提供的以外的功能,也可以查看phplucence
https://stackoverflow.com/questions/14828687
复制相似问题