PHP+MYSQL+SCWS 做自己的站内搜索引擎

3/7/2017来源:SQL技巧人气:3362

?cx=014724041144905348996:pf5fnahnzuw&cof=FORID:11&ie=UTF-8&q=危机&sa=搜索&siteurl=lusongsong.com/  优点: 省心,没有比这个再省心的了.你啥都不用管.谷歌都是自家的了,人家的搜索算法,那怎么是咱们能比得了的呢.  缺点: 1.需要使用IFRAME,或者直接打开谷歌的页面,或者用更复杂的API来实现. 2.只能按照文本搜索,只能全站搜索.我要想在某个频道下,搜索指定类型的文章等要求谷歌就不能实现了.一句话,就是不能自定义. 3.如果你的网站小,谷歌人家都不带收录你,啥也搜不出来你咋办?  (三) lucene 全世界最好的开放源代码搜索引擎  呃…没啥好介绍的,直接看优缺点吧  优点: 完全开放源代码,完全可以自定义,完全….. 缺点: java写的,哥不会.你会java?你改个试试  (四) php+MySQL+SCWS 做自己的站内搜索引擎  千呼万唤始出来!  MySQL支持全文索引和搜索。全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。  函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。  当 MATCH() 被使用在一个 WHERE 子句中时,返回的记录行被自动地以相关性从高到低的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。  在英语环境下,使用PHP和MYSQL就完全能够建立全文检索环境.步骤为:  1. 建立内容表,灌入数据,在需要全文检索的字段上建立FULLTEXT索引  2. 利用MATCH函数执行搜索条件  3. 处理返回的数据,显示结果  简单吧。。。  问题是,中文不是自分词的语言,在MYSQL开来一大段中文就是一个单词,全文检索就失效了.解决这个问题的办法是,在灌入数据和搜索前,利用其他的工具来进行分词,将大段的中文分隔为一个一个的词,类似与英文的单词.  最简单的工具就是SCWS. 官方站点: http://www.ftphp.com/scws/  SCWS 是 Simple Chinese Words Segmentation 的缩写,即简易中文分词系统。  这是一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。词是汉语的基本语素单位,而书写的时候不像英语会在词之间用空格分开,所以如何准确而又快速的分词一直是中文分词的攻关难点。  SCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些中小型搜索引擎、关键字提取等场合运用。 SCWS 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持 GBK,UTF-8,BIG5 等汉字编码,切词效率高。  SCWS提供了纯PHP代码编写的中文分词类,使它不需要做任何额外的扩展就能在机会所有的服务器上使用.  支持中文的基于PHP+MYSQL的全文检索的步骤为:  1. 建立内容表(,将数据分词),灌入数据,在需要全文检索的字段上建立FULLTEXT索引  2. (将要搜索的内容先分词再) 利用MATCH函数执行搜索条件  3. 处理返回的数据,显示结果  仍然是SO EASY!  一个演示的例子: http://www.bnet.com.cn/files/search.php?word=%CA%D5%B9%BA&page=3  执行搜索的语句是: 1 SELECT SQL_CALC_FOUND_ROWS *, MATCH (titlewords, keywords, author, contentwords) AGAINST ('$words') AS matchscore 2 FROM search 3 WHERE MATCH (titlewords, keywords, author, contentwords) AGAINST ('$words') > 0.5 4 LIMIT 10  最后: 感谢全世界的开源作者