1

我在我的网站上进行基本搜索时遇到问题,因为它仅在词序完全匹配时才找到匹配项。

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

如果您搜索 Red Shoe Laces,它不会显示 Red Laces 的结果(因为单词 shoe 会影响这个订单)。以下是我认为搜索框正在使用的代码。谁能告诉我如何“放松”这个搜索,这样它要么更广泛,要么不需要精确的词序?

这是当前代码:我的 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;
 }

这里有什么想法吗?

4

2 回答 2

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)."')";

更多详情,参考链接

于 2013-02-12T08:57:47.777 回答
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"; 

显然,您需要处理转义数据等

如果您需要全文搜索无法提供的功能,请查看 phplucence

于 2014-01-08T02:51:54.133 回答