本帖最后由 rikioy 于 2011-11-29 17:32 编辑
在了解这个功能之前,我是想在插件中实现一个搜索自定义表的功能。最普通的方法就是select每次的数据。但这样很显然是最初级的方法。就想了解一下DX在这块是怎么实现的呢?是不是更高级一些。在看代码之前问了一下同事,DX的搜索没啥好看的。大站要用纵横搜索,要不搜索的压力很大。恩,我想也是的。搜索这块是要单独地处理才能应付大搜索量大数据量。但是纵横搜索目前不能对系统中自定义的内容提供搜索。所以你要做一些东西,初期还是需要自己实现的。这篇文章就写给那些想自己开发插件,并且有数据搜索功能的朋友吧。
首先,论坛中搜索主要是通过论坛版面上面的searchbar。在这个searchbar里我们加上我们要搜索的自定义内容栏目。
在 /template/default/common/pubsearchform.htm 中
- <!--{block slist[user]}--><li><a href="javascript:;" rel="user"{if (CURSCRIPT == 'home' && !in_array($do, array('blog', 'album', 'thread', 'activity', 'poll', 'reward', 'debate', 'trade'))) || $mod == 'ranklist'} class="curtype"{/if}>{lang users}</a></li><!--{/block}-->
复制代码
这段下面 加上类似这样的代码
- <!--{block slist[boardgame]}--><li><a href="javascript:;" rel="boardgame"{if ($cursearch == 'boardgame') } class="curtype"{/if}>{lang boardgame}</a></li><!--{/block}-->
复制代码 rel是关键字,后面都要用到。{lang boardgame} 这个是在语言包中定义的中文汉字。
$cursearch 这个你可以在你的程序脚本中给赋值,这样,到这个脚本,就自动切换成搜索这个了。就类似你到家园中,搜索框默认搜索的是用户。你打开版面,搜索框默认搜索的是帖子。
编辑好后。在我们的search bar中就有了这项了。
然后我们编辑 /search.php 文件,在 $modarray 中加入我们上面的值 boardgame
- $modarray = array('my', 'user', 'curforum', 'newthread','boardgame');
复制代码 把我们 ref 中的关键词 加入到$modarray 中。
然后在 /source/module/search/ 中加入 search_boardgame.php 文件 其中 boardgame 就是上面的ref中的值
在search_boardgame.php中写处理代码,这样我们就能用我们自己的模块处理搜索了。
dx搜索是这样做的
如果搜索的是新内容,从来没有被人搜索过的内容。则DZ进行一次搜索。然后把搜索结果的id序列和一些其他信息储存在
pre_common_searchindex 表格中。
下次再有人查询这个关键字的时候。首先会查询 pre_common_searchindex 表,如果有记录的话。则从表中取到结果的id序列,直接select in来取这些记录。
当然pre_common_searchindex中的记录是有实效的。过期无效。系统中每天晚上有计划任务清除这个表。
|