点击这里给我发消息 点击这里给我发消息

部署自己的搜索引擎实现关键词优化

添加时间:2010-6-22
    相关阅读: 设计 软件 案例 页面 搜索引擎 数据库 程序

经常看到使用的mysql数据库,则没有这项功能。 lucene则不一样,它的意义不在于存储和维护数据,它生来就是做索引的,所以它会对文本内容进行分词索引。打个比方,如果你的文本内容里有 “hello world"一句话,那么它会分析出hello,world两个词,并会把此条内容作为一个索引条目添加到hello和world两个关键词索引目录中。 这是不同于SQL里的like查询的,数据库没有对字段内容进行分析,只是针对字段做了索引,当你要like查询字段内空时,它实际上是一条一条的做字符串匹配,这样效率很低下,无法承受重压。所以很少有人用like做大业务量的搜索。

  有lucene了,solr是干什么的?lucene 只提供了编程接口,而solr是个开箱即用的东西。请参考官方的说明,相信你很快就可以架起一个solr搜索服务。solr所需要配置的只有一个地方,就是schema.xml,你要在这里配上你的CMS系统最终文章所用到的字段,比如作者,分类,标题,内容等等,同时要配好这些字段的类型。不同的字段类 型会影响其搜索表现。solr架好了,如何使用呢?它提供了两个接口(简单吧,只有两个接口),一个是update,一个是select,分别对应更新与 查询(删除属于更新)。update的具体实现就是向基指定URL POST一个XML文档。关键部分格式大致如下:

  1、添加/更新(是的,无论是添加还是更新,只需要一个格式。也就是,如果指定ID的记录已存在,则更新,否则添加)

<?xml version="1.0" encoding="UTF-8" ?>
<add><doc>
       <field name=\"id\">[你的文章ID]</field>
       <field name="title">[文章标题]</field>
       <field name="content">[文章内容]</field>
       <!-- 其它字段略 -->
</doc></add>

       2、删除分为按ID删除和按查询删除,后者删除所有符合查询条件的记录。

       <delete><id>[文章的ID]</id></delete>
       <delete><query>[查询字符串]</query></delete>

       再来看看select,查询也比较简单。一般schema.xml里可以定义默认查询字段,这个字段甚至可以是几个字段的组合,这样如果仅用关键字查询,就 会去这些字段寻找。如果要指定字段,可以以[字段名]:[查询关键字] 的格式来查询。复杂一点的话,它也支持逻辑组合的,有兴趣可以去看相关文档。select 走的是 GET 接口,你可以用GET方式发送查询请求,主要字段是q,这也是各大搜索引擎都使用的查询关键字字段名。需要提的是,select查询出来的结果是xml格 式的,你需要写个程序去解析XML文档,拿出里面的数据。然后就跟从数据库中读到的数据一样,你爱怎么用就怎么用了。查询结果格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
 <str name="indent">on</str>
 <str name="start">0</str>

 <str name="q">小破孩</str>
 <str name="rows">10</str>
 <str name="version">2.2</str>
</lst>
</lst>
<result name="response" numFound="27" start="0">
<doc>
<str name="categoryId">a8ea126f3128443fbb2d17e0d5e3c55f</str>
 <str name="categoryName">小破孩</str>
 <str name="content">&amp;lt;p&amp;gt;小破孩为了去找小丫而过景阳岗,过岗前也喝了超过三碗酒。俗话 说三碗不过岗,店家极力劝小破孩不要过岗,小破孩没办法,给了店家一点money,店家才不说什么了,并且送了小破孩一根棒子好打虎。小破孩能过岗吗?请 看小破孩系列动漫短片《景阳岗》。&amp;lt;/p&amp;gt;</str>
 <date name="created">2009-08-04T17:18:44Z</date>
 <str name="description">小破孩为了去找小丫而过景阳岗,过岗前也喝了超过三碗酒。俗话说三碗不过岗,店家极力劝小破孩不要过岗,小 破孩没办法,给了店家一点money,店家才不说什么了,并且送了小破孩一根棒子好打虎。小破孩能过岗吗?请看小破孩系列动漫短片《景阳 岗》。</str>
 <str name="id">5ed7054bf108454db2b0216fbc006934</str>
 <str name="keywords">景阳岗 三碗不过岗 小破孩 打虎</str>
<date name="modified">2009-08-27T20:46:09Z</date>
 <int name="status">1</int>
 <date name="timestamp">2009-08-27T15:59:48.821Z</date>
 <str name="title">三碗不过岗:小破孩景阳岗打虎记</str>
</doc>
<doc>
 <str name="categoryId">a8ea126f3128443fbb2d17e0d5e3c55f</str>
 <str name="categoryName">小破孩</str>
 <str name="content">&amp;lt;p&amp;gt;小破孩射下九个太阳之后,遭到了报复,丫丫被乌鸦叼到了月亮上 面,整天哭泣。小破孩十分着急,这下该怎么办呢?现在,你来帮小破孩去拯救丫丫吧,操作小破孩登上月球,看你的 了!&amp;lt;/p&amp;gt;</str>
 <date name="created">2009-08-04T17:18:44Z</date>
 <str name="description">小破孩射下九个太阳之后,遭到了报复,丫丫被乌鸦叼到了月亮上面,整天哭泣。小破孩十分着急,这下该怎么办呢?现在,你来帮小破孩去拯救丫丫吧,操作小破孩登上月球,看你的了!</str>
 <str name="id">4c0cfeb8990c455da88aeaabd864bca8</str>
 <str name="keywords">小破孩 奔月 小游戏</str>
 <date name="modified">2009-08-27T16:48:39Z</date>
 <int name="status">1</int>
 <date name="timestamp">2009-08-27T15:59:43.021Z</date>
 <str name="title">小破孩奔月小游戏,嫦娥我来啦!</str>
</doc>
<!-- 这里限于篇幅略去了其它结果 -->

</result>
</response>

    这时候其实还有一个问题,就是关键词有时候匹配的并不是一个词。我们知道英文单词是以空格分开的,但汉语词汇却复杂多了,甚至有些句字人阅读起来都会有歧义。lucene是外国人的玩艺儿,没有内置的中文分词系统,这样一来你搜中文时,只要有相临的字串匹配,都会命中。这样会造成匹配度的下降,再来不良用 户体验。也许你觉得这没什么,挺好,一个结果不漏。但是你想想,各大搜索引擎都不是白痴,你的结果页匹配度不高,会影响你关键字的权重的吧。

  不多说了,请出国人的开源分词系统庖丁解牛(paoding)。sourceforge曾因嫌中国人只索取不贡献而屏蔽掉中国的IP,看到庖丁解牛,作为中 国人我都感到骄傲了。谁说中国人不贡献了?庖丁解牛跟商业中文分词软件相比应该还有差距,但足够我们做关键词优化用了。你需要在solr 的schema.xml 配置文件里加上相关配置,在庖丁的配置文件中也要配好字典路径,这样你的搜索引擎就大功告成了。

  下面要做前端的优化设计了。你可以做一些流行关键词的标签放在主页上,这些标签页指向你的搜索结果页面。效果可参考我部署的一个案例:http://www.kaoly.com/t-%E9%BB%84%E9%87%91%E7%9F%BF%E5%B7%A5.html 。说明一下,一些免费CMS系统也有标签功能,甚至也有搜索功能,但其搜索功能是没法跟lucene比的,而其标签更多的是手动或半自动维护,相关度也难 以跟搜索引擎直接去搜相比。你想,如果你的搜索引擎算法好,能更接近大型搜索引擎,那你预先搜出来的结果肯定也是你所有内容中最合大型搜索引擎胃口的。这 道理相信大家都明白。更不要说标签建立的方便性,你发现好的关键词,可以随时加一个标签,简单到只需做个链接就可以了。相信常见的免费CSM系统没有这么 好的功能。即使它能自动搜索创建标签,那它的标签的相关度也比不上搜索引擎,因为它不是专做搜索引擎的,它只是为你提供了一些实用的附加的小功能。

本文作者:http://www.kaoly.com/
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册