最近做了一个以文章为主的网站.
是静态生成的页面.
现在就差一个全文检索的功能.
现在我做的是从数据库中检索.因为怕服务器负担过重.
所以只检索了文件标题和关键字.对于文章内容没有检索.
搜索了一下以前的贴子,发现这个问题还没有人能很好的解决.
难道真的没有一个比较好的方法吗?
现在我想实现一个可以搜索全文的功能.希望各位大虾不吝赐教.
分不够可以再加.
---------------------------------------------------------------
如果想按“行”输出结果,即输出关键字所在的整行
可以不用 fopen,fread,直接用
$array = file($fileName);
获得文件各行的数组,然后在行内检索
---------------------------------------------------------------
做全文检索 服务器负担不可能不重 如果量大的话 建议采用专门的全文检索引擎和构建专门的服务器。
下面的或许对你有帮助
http://www.evolt.org/article/Boolean_Fulltext_Searching_with_PHP_and_MySQL/18/15665/
---------------------------------------------------------------
再建字段时尤其用到varchar or char的字段最好加上Binary
或者在查询时这样用
select * from tablename where fieldname Binary =
OR
select * from tablename where Binary fieldname=
---------------------------------------------------------------
将生成静态页面文件的内容在数据库里保存一份,浏览时用.html,搜索用数据库,select * from tablename where field like %*%。我都是这样做的。
---------------------------------------------------------------
//#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;
}
---------------------------------------------------------------
看看这个吧
http://jakarta.apache.org/lucene/docs/index.html
高质量的全文搜索引擎
我在上面做了支持中文断词的全文搜索
---------------------------------------------------------------
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')
我这里一切正常。上面摘自英文帮助,不可能错误
---------------------------------------------------------------
有点问题。现在mysql的全文搜索对多节字符是不支持的。
上面的是没错,如果用于搜索e文就绝对没问题,然而对中文这种双字节的字符就不支持了。
在varchar可以用binary来修饰后就可以用全文搜索,但是text没有binary。
mysql说明书上也说了,要在下版本完善这个全文搜索。