您现在的位置: 365建站网 > 365学习 > 部署自己的搜索引擎实现关键词优化

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

文章来源:365jz.com     点击数:131    更新时间:2009-09-14 10:22   参与评论

经常看到站长朋友们讨论关键词优化,也见过站长朋友费心地“积累”关键词。这里为大家分享一个用自架搜索引擎来做关键词优化的经验。

  声明:此经验适用于有一定技术能力的站,要求服务器有java运行环境,如JDK,TOMCAT。如果你不具备这些条件的话,也可以以手工的方式变相实现,但比较费时间。

  这 个经验是被javaeye论坛启发的。在网上搜技术资料时,这个论坛出现的机率极高。点进去看,大多是一些文章列表。用文章列表的形式去迎合关键词,匹配 的机率当然就大了。而你的文章当然不同于硬堆出来的关键词,搜索引擎看到这么多匹配的正规内容,自然会喜欢。如果从用户体验上来讲,你把自己资料库中最相 关的东西展示出来给用户看,自然也是最佳用户体验,比起让用户找类目,一页一页地翻,肯定是强百倍了。

  道理很简单,我重点讲解怎么去实现。我的实现方案用到了开源搜索引擎solr和开源的中文分词系统paoding(国人贡献的庖丁解牛中文分词软件)。

  solr是基于开源索引lucene的,这两者皆是apache开源组织推出的,官网地址为:

  lucene: http://lucene.apache.org/

  solr: http://lucene.apache.org/solr/ (solr是lucene下的子项目,solr可读作“扫啦”)

  顺便也提一下lucene下的另一子项目nutch,这是一个搜索引擎爬虫,可以爬intranet或internet,很酷吧!如果你想玩高级的采集,不防学一学,当然要有java编程功底。

  转入正题,先说lucene的作用。lucene是一个索引系统,它可以对内容进行关键词索引,这有点像数据库,区别在于后者不仅要索引,还要维护更多的其 它内容,比如数据关系。但后者在全文检索上功能比较差,高级的数据库系统才支持全文检索,而像被广大站长使用的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/

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (131人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 建站公司
· 杰创官网
· 建站工具

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2022 版权所有 鄂ICP备17013400号-1