search 模块是用于支持对 cms 中允许进行全文搜索的内容进行全文搜索。
全文搜索的内部实现是使用 MySQL MyISAM 表的全文搜索索引,数据表为 search(eg. phpcms2008_search).
search 表只有三个字段:searchid,type,data.
searchid 是自动编号主键,type 表示内容的类型,比如是属于新闻还是属于产品等,data 是加了全文搜索索引的字段,字段值为被被分词后的内容.
一篇文章内容可以被全文搜索的流程是这样的:
内容主表(content)建有 searchid 字段,与 search 表的 searchid 字段关联,一篇文章在 search 表的 type 字段值就是文章所属模型的表名,如模型表名为 phpcms2008_c_news 则模型文章的全文搜索 type 字段值为 news.
执行添加文章的代码是 /include/admin/content.class.php 的 add() 方法,里面调用 log_write() 方法,log_write 调用 search_api 方法,search_api 方法就是建立全文搜索索引的.
search_api 方法会根据文章是否有 searchid 字段值决定是新加还是更新 search 表的记录,添加文章时因为没有 searchid 字段值,所以必定是添加 search 表的记录,再根据文章 status 状态值决定是添加或更新全文搜索数据还是删除全文搜索数据,当文章非审核通过状态时执行的便是删除全文搜索数据.
若是添加或更新,下面简称为写入,全文搜索时,会把需要搜索的内容查出,比如文章标题,文章内容,文章关键词等.
之后便调用 search 模块的接口 /search/include/search.class.php 的 add() 方法,更新时为 update() 方法,写入全文搜索数据,并把接口返回的 searchid 写到此文章的 searchid 字段值中.
在 /search/include/search.class.php 的 add() 方法中,会把全文搜索内容进行分词,保存到 search 表的 data 字段中,再把作为数组类型保存的文章原始数据缓存到 /search/data/ 目录中.
当前台用户提交全文搜索请求时,先从 search 表查出符合条件的记录的 searchid, type 值,然后读取对应的 /search/data/ 缓存数据,便可在页面显示搜索结果.
一般搜索结果页需要显示结果的标题,url,简单,图片这些基本信息,所以每条全文搜索数据都会把结果页显示用到的信息缓存到 /search/data/ 的缓存文件中.
新闻热点
疑难解答