mysql不支持对text字段的多字符文字的全文搜索。
用中文的话搜索结果是不正确的。
我想要等mysql支持这个功能才行了...

解决方案 »

  1.   

    关于楼上的说法.记得有个贴子说select * from tablename where LOCATE('中文',field1)>0这样好像可以但现在我想要的不是通过数据库来搜索.
      

  2.   

    <?
    // 有一个稍微改善速度并且简化代码的办法,就是把所有文件名按序号分类排列,例如// 新闻类: news/0.htm, news/1.htm, ..., news/9999.htm, ...
    // 文档类: doc/0.htm, doc/1.htm, ...
    // ...// 这样,就可以根据用户所要求的文章类别,先确定类别,找到对应子目录
    // 在这个目录里按序号读文件,范围缩小,而且不必 findfirst, findnext,
    // 可以有效提高速度。
    // 当然,各目录的文件数(即最大序号)必须保存在数据库里,
    // 每当有新页面产生时,必须同步更新数据库// 假设客户端传过来两个参数:
    //     type:      文章类型(news/doc/...)
    //     keyword:   关键字// 以下代码只演示如何实现文件内容搜索,不包含输入检查、AND/OR 处理等功能$type = HTTP_POST_VARS["type"];
    $keyword = HTTP_POST_VARS["keyword"];$sql = "select max_ord from table1 where type='$type'";
    $result = query($sql);
    $max_ord = $result['max_ord'];
    for ( $ord = 0; $ord <= $max_ord; $ord++ )
    {
    $fileName = "./" . $type . "/." . $ord . ".htm";
    $fp = fopen($fileName, "rt");
    if ( $fp )
    {
    $str = fread($fp, filesize($fileName));
    // 这里就搜索字符串 $str,根据需要输出结果啦
    fclose($fp);
    }
    }?>如果想按“行”输出结果,即输出关键字所在的整行
    可以不用 fopen,fread,直接用$array = file($fileName);获得文件各行的数组,然后在行内检索
      

  3.   

    alexxing(赤铸) 的方法有一定的可行性.现在我还有点不太清楚.到底是搜索文件的方法快,还是搜索数据库的方法快?
      

  4.   

    如果全部东西都在数据库里,当然搜索数据库比搜索文件快啦但是我觉得数据库适合于存放一些“索引”性质的数据,不宜把一些“大块头”的东西,如 .WAV, .MP3, .AVI 或巨长的文本文件之类全插入数据库:一来数据库容量有限(尤其是用虚拟主机的情况),二来插入操作太慢另外,我觉得数据库主要的特长在于检索的功能(支持负责的SQL语句),而不在于速度。数据库最终也是通过文件实现的,对长篇文章的检索,用 select where 和用 strstr 或 preg_* 函数恐怕差不了很多
      

  5.   

    【更正】支持负责的SQL语句 => 支持复杂的SQL语句
      

  6.   

    做全文检索 服务器负担不可能不重 如果量大的话 建议采用专门的全文检索引擎和构建专门的服务器。下面的或许对你有帮助
    http://www.evolt.org/article/Boolean_Fulltext_Searching_with_PHP_and_MySQL/18/15665/
      

  7.   

    我有一个支持中文切词的纯java的全文检索,不只有没有市场
      

  8.   

    用like语句,最新版的mysql,对text的字段均有全文搜索的索引,再配合 like语句,速度相当快
    where [field] linke '%(string)%'
      

  9.   

    再建字段时尤其用到varchar or char的字段最好加上Binary
    或者在查询时这样用
    select * from tablename where fieldname Binary =  
    OR 
    select * from tablename where Binary fieldname= 
      

  10.   

    将生成静态页面文件的内容在数据库里保存一份,浏览时用.html,搜索用数据库,select * from tablename where field like %*%。我都是这样做的。
      

  11.   

    我记得 phpnuke 里面有全文检索,可惜我最近很忙没有时间去看。phpnuke 是开放源代码的,你可以去 http://www.phpnuke.org/ 下载
    我们公司也做搜索引擎,包括数据库全文检索、Offfice文档、pdf、Dyna Doc等等之类的全文检索。一般是先建立一个索引数据库,很难说明白索引数据库是什么东西,可以当成字典的目录,查字典先查目录,后查正文,速度快很多。可惜比较贵。2至3万。可能你也不愿意花钱。
    还是找 phpnuke。台湾的phpnuke 网站汉化版本水平一般,以前大陆也有汉化,可惜版本都比较老。台湾的phpnuke 网站是http://www.phpnuke-tw.com/
    其它php写的网络社区免费软件里面都有全文检索,不过这类搜索在数据量很大的时候速度很慢。如果你的数据量不大可以用。
      

  12.   

    全文检索的功能不应该是我们讨论的代码的问题吧,我认为是数据库软件的功能。而据我所知,oracle和mysql(还不是很完善吧)是有全文检索的功能。
      

  13.   

    不应该使用数据库,否则话,速度上简直无法忍受.
    真正专业的全文检索系统,应该是使用文件系统,利用倒排文件建立索引
    索引文件应该是事先放入到内存中的.看看google的检索速度,你就应该知道
    绝对不是采用通用数据库作全文检索的.
    你可以察看关于Information Retrieval 的相关论文
      

  14.   

    mysql当然可以实现,从3.23版就可以了。正如Reve(仨仁仕) 说说这个跟数据库有关。所以这里不需要提供php代码.创建数据表的时候加上fulltext索引
    eg:
    CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
          title VARCHAR(200),
          body TEXT,
          FULLTEXT (title,body)
    );以后就可以用
    SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
    这里用到match函数来进行这两个字段的全文检索
      

  15.   

    //#Start Search Engine 
    function isOperator($keyword,$is_ereg_whole_str = false){
            //check isOperator of $keyword for search Engine
            $OPERATOR = "AND,OR,NOT,&&,||,!,&,\|,\+,_";
            /*
            AND = && = & = +
            OR  = || = | 
            NOT =  ! = -
            %   = *
            _   = ?
            */
            if(trim($keyword) == ""){
                    return false;
            }
            $args = split(",", $OPERATOR);
            $is_return = false;
            for($i = 0; $i<count($args); $i++){
                    $operator = strtoupper($args[$i]);
                    if($is_ereg_whole_str){
                            
                            if(@eregi(" $operator ", $keyword)){
                                    $is_return = true;
                                    break;
                            }
                    }else{
                            if($operator == strtoupper($keyword)){
                                    $is_return = true;
                                    break;
                            }
                    }
            }
            return $is_return;
    }
      

  16.   

    function setOperator($keyword){
            if($keyword == "")
                    return "";
            $keyword = @eregi_replace("and"," AND ",$keyword);
            $keyword = @eregi_replace("or"," OR ",$keyword);
            $keyword = @eregi_replace("not"," NOT ",$keyword);
            $keyword = str_replace("&&"," AND ",$keyword);
            $keyword = str_replace("&"," AND ",$keyword);
            $keyword = str_replace("+"," AND ",$keyword);
            $keyword = str_replace("||"," OR ",$keyword);
            $keyword = str_replace("|"," OR ",$keyword);
            $keyword = str_replace("!"," NOT ",$keyword);
            $keyword = str_replace("-"," NOT ",$keyword);
            //ereg sign
            $keyword = str_replace("*","%",$keyword);
            $keyword = str_replace("?","_",$keyword);
            return $keyword;
    }function parseKeyword($keyword, $fields){
            //function to parse keyword for search Engine
            //RETURN SQL CMD
            //@PARA $fields array of colummn of table 
            //@PARA $keyword input keyword
            //@version 1.3.1
            //@last update 20020910
            //@created 20020906
            //@author walksing chen [[email protected]]
            /*eg:
            keyword : jsp asp or php not cn 
            fields[0]->caption,fields[0]->content
            result:( caption LIKE '%jsp asp%' OR content LIKE '%jsp asp%' ) OR ( caption LIKE '%php%' OR content LIKE '%php%' ) AND NOT ( caption LIKE '%cn%' OR content LIKE '%cn%' ) 
            keyword : jsp asp php cn 
            fields[0]->caption,fields[0]->content
            result:( caption LIKE '%jsp%' OR content LIKE '%jsp%' ) OR ( caption LIKE '%asp%' OR content LIKE '%asp%' ) OR ( caption LIKE '%php%' OR content LIKE '%php%' ) OR ( caption LIKE '%cn%' OR content LIKE '%cn%' ) 
            keyword : jsp asp or php not cn 
            fields[0]->caption
            result:( caption LIKE '%jsp asp%' ) OR ( caption LIKE '%php%' ) AND NOT ( caption LIKE '%cn%' ) 
            keyword : jsp asp php cn 
            fields[0]->caption
            result:( caption LIKE '%jsp%' ) OR ( caption LIKE '%asp%' ) OR ( caption LIKE '%php%' ) OR ( caption LIKE '%cn%' ) 
            */
            $operator = "";
            if($keyword == "")
                    return "";
            //set regular operator
            $keyword = setOperator($keyword);
            $keys = split(" ", $keyword);
            $sql = "";
            $relation = "";
            $max = count($keys);
            
            //eregi whole keyword
            $has_operator = isOperator($keyword,true);
            //if not is operator repalce space to OR
            $relation = ($has_operator ? "":"OR");        
            
            $fldv = "";
            for($i = 0; $i<$max;$i++){
                    if(!$has_operator){
                            $fldv = $keys[$i];
                            $fldv = trim($fldv);
                            $relation = "OR";
                            if($fldv == ""){
                                    continue;
                            }
                    }else{
                            if(trim($keys[$i]) == "" && $i == 0 )
                                    continue; //skip 0 & ""
                            if(!isOperator($keys[$i])){
                                    //save to fldv
                                    $fldv .= trim($keys[$i])." ";
                                    if($i != ($max-1)){
                                            continue;
                                    }
                            }else{        
                                    
                                    $relation = strtoupper($keys[$i]);
                                    $relation = ($relation  == "NOT") ? "AND NOT":
                                            ($relation);
                            }
                    }
                    
                    if(count($fields)<=1){
                            $tmp = $fields. " LIKE '%".trim($fldv)."%' "; 
                            $sql .= "( ".$tmp." ) ".$relation." ";
                    }else{
                            reset($fields);//very easy lose 
                            $tmp = "";//set null
                            while(list($name, $fld_value) = each($fields)){
                                    if($fld_value == "")
                                            continue;
                                    $tmp .=  $fld_value . " LIKE '%".trim($fldv).
                                            "%' OR ";
                            }
                            
                            $tmp = substr($tmp, 0, strlen($tmp)-3);
                            $tmp = $tmp == "" ? "":"( $tmp )";
                            $sql .= " $tmp ".$relation." ";
                    }
                    $fldv = null;
            }
            $sql = trim($sql);
            $sql = substr($sql, 0, strlen($sql)- strlen($relation));
            return $sql;
    }function makeupStr($str, $keyword = ""){
            //this function is used to makeup $keyword ,eg:make it color
            if($str == "" )
                    return "";
            if($keyword == "")
                    return $str;
            $keyword = setOperator($keyword);
            $keys = split(" ", $keyword);
            $max = count($keys);
            
            $keyword_n = "<font color=red><strong>".$keyword."</strong></font>";
            $keyword = trim($keyword);
            $str = trim($str);
            
            if($max == 1 ){
                    $buf = null;
                    //split keyword include CN
                    //eg:keyword=い%
                    for($j = 0; $j<strlen($keyword); $j++){
                            $char = substr($keyword, $j, 1);
                            if($char != "%" && $char != "_" ){
                                    $buf .= $char;
                                    if($j != (strlen($keyword) -1))
                                            continue;
                            }
                            $key = $buf;
                            $keyword_n = "<font color=red><strong>".
                                    $key."</strong></font>";
                            if($key != ""){
                                    $str = eregi_replace($key, $keyword_n, 
                                            $str);
                            }
                            $buf = null;
                            
                    }
                    $buf = null;
                    return $str;
                    
            }else if(@eregi(" ", $keyword)){
                    $parter = " ";
            }
            $parter = $parter == ""?" ":$parter;
            $keywords = split($parter, $keyword);
            for($i=0; $i<count($keywords); $i++){
                    $keyword = $keywords[$i];
                    if(isOperator($keyword)){
                            continue;
                    }
                    $keyword_n = "<font color=red><strong>".$keyword.
                            "</strong></font>";
                    if(trim($keyword) == ""){
                            continue;
                    }
                     $str = @eregi_replace($keyword, $keyword_n, 
                                    $str);
                    
            }
            
            return $str;
    }
    //End Search Engine 
    ?>
      

  17.   


    #
    # Table structure for table 'textnews'
    #CREATE TABLE textnews (
       id int(11) DEFAULT '0' NOT NULL auto_increment,
       docid varchar(50) NOT NULL,
       pubcode varchar(50),
       pubdate date DEFAULT '0000-00-00' NOT NULL,
       author varchar(50),
       pageno varchar(20),
       section varchar(250),
       pathfile varchar(250),
       headline varchar(250),
       content mediumtext,
       PRIMARY KEY (id, docid)
    );
    http://www.foresight.com.hk/bbs/application/webpub/showdetail.asp?serialnum=70551038175334&boardid=12&num=72
      

  18.   

    你们在说什么哦,有那么麻烦没有,到我家看看就可以了,
    讲的这么深奥http://web.scuec.edu.cn/~game002/newweb0/给分啦!!!
      

  19.   

    to:summer419(summer:)),我到了你的网站,但没见全文检索的影子啊。在哪儿啊?我只见一个按作者或才按标题检索。要实现这个当然不是很复杂啦。我现在也缺一个全文搜索引擎,所以很关注这个话题。最要命的是我现在还没有时间去做它。
      

  20.   

    看看这个吧
    http://jakarta.apache.org/lucene/docs/index.html
    高质量的全文搜索引擎我在上面做了支持中文断词的全文搜索
      

  21.   

    楼上提供的地址好像是一个Apache的组件吧。虚拟主机哪有要你安装组件的。。唉。
      

  22.   

    用PHP nuke吧!大名鼎鼎,完全开放源代码。支持全文检索。
      

  23.   

    vivanboy(被迫早起的鸟儿) 你说的哪种
    SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
    的方法我试了N次都查不出来数据~~~~
      

  24.   

    CREATE TABLE articles (
     id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
    );
    INSERT INTO articles VALUES(0,'MySQL Tutorial', 'DBMS stands for DataBase Management ...');
    INSERT INTO articles VALUES(0,'How To Use MySQL Efficiently', 'After you went through a ...');
    INSERT INTO articles VALUES(0,'Optimizing MySQL','In this tutorial we will show how to ...');
    INSERT INTO articles VALUES(0,'1001 MySQL Trick','1. Never run mysqld as root. 2. Normalize ...');
    INSERT INTO articles VALUES(0,'MySQL vs. YourSQL', 'In the following database comparison we ...');
    INSERT INTO articles VALUES(0,'MySQL Security', 'When configured properly, MySQL could be ...');在运行查询语句:
    SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database')我这里一切正常。上面摘自英文帮助,不可能错误
      

  25.   

    有点问题。现在mysql的全文搜索对多节字符是不支持的。
    上面的是没错,如果用于搜索e文就绝对没问题,然而对中文这种双字节的字符就不支持了。
    在varchar可以用binary来修饰后就可以用全文搜索,但是text没有binary。
    mysql说明书上也说了,要在下版本完善这个全文搜索。
      

  26.   

    仔细研究了一下FULLTEXT,发现问题多多很多字符串能够全文索引,很多字符串却没有,很奇怪
    比如上面database就可以,for等就不行
      

  27.   

    我试了几次..就database能搜索出结果来.FT~~~
      

  28.   

    mysqld、stands
    都可以。看样子mysql的全文搜索功能bug太多看样子并不是仅仅对多字节没效。我也晕了楼主换成mysql4.0看看效果