【问题标题】:searching partial words from a database从数据库中搜索部分单词
【发布时间】:2012-09-04 16:51:50
【问题描述】:

我有一个简单的 mysql 搜索功能,可以搜索我想扩展的条目标题,以便能够搜索部分单词...

例如,假设我搜索:取消

目前它将返回标题中带有取消单词的任何内容。但理想情况下,它还应该返回标题中带有取消字样的任何内容。

这是我目前所拥有的......

function search_title_body($q){
    $q = '+' . $q;
    $q = str_replace(' ', '+', $q);
    $q = "+(".$q.")";

    $query = "SELECT *,
              MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score
              FROM results
              WHERE (MATCH(title) AGAINST('$q' IN BOOLEAN MODE))
              AND (published = 1)
              ORDER BY score DESC";

    $query = $this->db->query($query);

    $results = array();


    foreach ($query->result() as $row){
        $results[] = $row;
    }

    return $results;
} 

谁能指出我正确的方向?非常感谢您的帮助:)

【问题讨论】:

  • 查看 MySQL 参考手册中的 page。有一条评论使用LIKE,尽管评论作者说它可能很慢。您也可以查看回复。

标签: php mysql codeigniter search


【解决方案1】:

您可以使用 like 语句构建您的 $q 以获得这样的查询

SELECT * FROM results
WHERE title like '%cancel%' OR title like '%otherword%'
AND (published = 1)
ORDER BY score DESC

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是 LIKE 或 ILIKE 函数

    $q = "somestring";
     $query = "SELECT *,              
              FROM results
              WHERE title ILIKE '%$q%'
              AND (published = 1)
              ORDER BY score DESC";
    

    还有为什么要创建一个匹配列,num_rows 会给你然后命中数。

    【讨论】:

      【解决方案3】:

      怎么样

      SELECT *,
      MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score
      FROM results
      WHERE title LIKE '%$q%'
      AND published = 1
      ORDER BY score DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2011-12-03
        相关资源
        最近更新 更多