經(jīng)??吹秸鹃L(zhǎng)朋友們討論關(guān)鍵詞優(yōu)化,也見過(guò)站長(zhǎng)朋友費(fèi)心地“積累”關(guān)鍵詞。這里為大家分享一個(gè)用自架搜索引擎來(lái)做關(guān)鍵詞優(yōu)化的經(jīng)驗(yàn)。
聲明:此經(jīng)驗(yàn)適用于有一定技術(shù)能力的站,要求服務(wù)器有java運(yùn)行環(huán)境,如JDK,TOMCAT。如果你不具備這些條件的話,也可以以手工的方式變相實(shí)現(xiàn),但比較費(fèi)時(shí)間。
這 個(gè)經(jīng)驗(yàn)是被javaeye論壇啟發(fā)的。在網(wǎng)上搜技術(shù)資料時(shí),這個(gè)論壇出現(xiàn)的機(jī)率極高。點(diǎn)進(jìn)去看,大多是一些文章列表。用文章列表的形式去迎合關(guān)鍵詞,匹配 的機(jī)率當(dāng)然就大了。而你的文章當(dāng)然不同于硬堆出來(lái)的關(guān)鍵詞,搜索引擎看到這么多匹配的正規(guī)內(nèi)容,自然會(huì)喜歡。如果從用戶體驗(yàn)上來(lái)講,你把自己資料庫(kù)中最相 關(guān)的東西展示出來(lái)給用戶看,自然也是最佳用戶體驗(yàn),比起讓用戶找類目,一頁(yè)一頁(yè)地翻,肯定是強(qiáng)百倍了。
道理很簡(jiǎn)單,我重點(diǎn)講解怎么去實(shí)現(xiàn)。我的實(shí)現(xiàn)方案用到了開源搜索引擎solr和開源的中文分詞系統(tǒng)paoding(國(guó)人貢獻(xiàn)的庖丁解牛中文分詞軟件)。
solr是基于開源索引lucene的,這兩者皆是apache開源組織推出的,官網(wǎng)地址為:
lucene: http://lucene.apache.org/
solr: http://lucene.apache.org/solr/ (solr是lucene下的子項(xiàng)目,solr可讀作“掃啦”)
順便也提一下lucene下的另一子項(xiàng)目nutch,這是一個(gè)搜索引擎爬蟲,可以爬intranet或internet,很酷吧!如果你想玩高級(jí)的采集,不防學(xué)一學(xué),當(dāng)然要有java編程功底。
轉(zhuǎn)入正題,先說(shuō)lucene的作用。lucene是一個(gè)索引系統(tǒng),它可以對(duì)內(nèi)容進(jìn)行關(guān)鍵詞索引,這有點(diǎn)像數(shù)據(jù)庫(kù),區(qū)別在于后者不僅要索引,還要維護(hù)更多的其 它內(nèi)容,比如數(shù)據(jù)關(guān)系。但后者在全文檢索上功能比較差,高級(jí)的數(shù)據(jù)庫(kù)系統(tǒng)才支持全文檢索,而像被廣大站長(zhǎng)使用的mysql數(shù)據(jù)庫(kù),則沒有這項(xiàng)功能。 lucene則不一樣,它的意義不在于存儲(chǔ)和維護(hù)數(shù)據(jù),它生來(lái)就是做索引的,所以它會(huì)對(duì)文本內(nèi)容進(jìn)行分詞索引。打個(gè)比方,如果你的文本內(nèi)容里有 “hello world"一句話,那么它會(huì)分析出hello,world兩個(gè)詞,并會(huì)把此條內(nèi)容作為一個(gè)索引條目添加到hello和world兩個(gè)關(guān)鍵詞索引目錄中。 這是不同于SQL里的like查詢的,數(shù)據(jù)庫(kù)沒有對(duì)字段內(nèi)容進(jìn)行分析,只是針對(duì)字段做了索引,當(dāng)你要like查詢字段內(nèi)空時(shí),它實(shí)際上是一條一條的做字符串匹配,這樣效率很低下,無(wú)法承受重壓。所以很少有人用like做大業(yè)務(wù)量的搜索。
有l(wèi)ucene了,solr是干什么的?lucene 只提供了編程接口,而solr是個(gè)開箱即用的東西。請(qǐng)參考官方的說(shuō)明,相信你很快就可以架起一個(gè)solr搜索服務(wù)。solr所需要配置的只有一個(gè)地方,就是schema.xml,你要在這里配上你的CMS系統(tǒng)最終文章所用到的字段,比如作者,分類,標(biāo)題,內(nèi)容等等,同時(shí)要配好這些字段的類型。不同的字段類 型會(huì)影響其搜索表現(xiàn)。solr架好了,如何使用呢?它提供了兩個(gè)接口(簡(jiǎn)單吧,只有兩個(gè)接口),一個(gè)是update,一個(gè)是select,分別對(duì)應(yīng)更新與 查詢(刪除屬于更新)。update的具體實(shí)現(xiàn)就是向基指定URL POST一個(gè)XML文檔。關(guān)鍵部分格式大致如下:
1、添加/更新(是的,無(wú)論是添加還是更新,只需要一個(gè)格式。也就是,如果指定ID的記錄已存在,則更新,否則添加)
<?xml version="1.0" encoding="UTF-8" ?>
<add><doc>
<field name=\"id\">[你的文章ID]</field>
<field name="title">[文章標(biāo)題]</field>
<field name="content">[文章內(nèi)容]</field>
<!-- 其它字段略 -->
</doc></add>
2、刪除分為按ID刪除和按查詢刪除,后者刪除所有符合查詢條件的記錄。
<delete><id>[文章的ID]</id></delete>
<delete><query>[查詢字符串]</query></delete>
再來(lái)看看select,查詢也比較簡(jiǎn)單。一般schema.xml里可以定義默認(rèn)查詢字段,這個(gè)字段甚至可以是幾個(gè)字段的組合,這樣如果僅用關(guān)鍵字查詢,就 會(huì)去這些字段尋找。如果要指定字段,可以以[字段名]:[查詢關(guān)鍵字] 的格式來(lái)查詢。復(fù)雜一點(diǎn)的話,它也支持邏輯組合的,有興趣可以去看相關(guān)文檔。select 走的是 GET 接口,你可以用GET方式發(fā)送查詢請(qǐng)求,主要字段是q,這也是各大搜索引擎都使用的查詢關(guān)鍵字字段名。需要提的是,select查詢出來(lái)的結(jié)果是xml格 式的,你需要寫個(gè)程序去解析XML文檔,拿出里面的數(shù)據(jù)。然后就跟從數(shù)據(jù)庫(kù)中讀到的數(shù)據(jù)一樣,你愛怎么用就怎么用了。查詢結(jié)果格式如下:
<?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">&lt;p&gt;小破孩為了去找小丫而過(guò)景陽(yáng)崗,過(guò)崗前也喝了超過(guò)三碗酒。俗話 說(shuō)三碗不過(guò)崗,店家極力勸小破孩不要過(guò)崗,小破孩沒辦法,給了店家一點(diǎn)money,店家才不說(shuō)什么了,并且送了小破孩一根棒子好打虎。小破孩能過(guò)崗嗎?請(qǐng) 看小破孩系列動(dòng)漫短片《景陽(yáng)崗》。&lt;/p&gt;</str>
<date name="created">2009-08-04T17:18:44Z</date>
<str name="description">小破孩為了去找小丫而過(guò)景陽(yáng)崗,過(guò)崗前也喝了超過(guò)三碗酒。俗話說(shuō)三碗不過(guò)崗,店家極力勸小破孩不要過(guò)崗,小 破孩沒辦法,給了店家一點(diǎn)money,店家才不說(shuō)什么了,并且送了小破孩一根棒子好打虎。小破孩能過(guò)崗嗎?請(qǐng)看小破孩系列動(dòng)漫短片《景陽(yáng) 崗》。</str>
<str name="id">5ed7054bf108454db2b0216fbc006934</str>
<str name="keywords">景陽(yáng)崗 三碗不過(guò)崗 小破孩 打虎</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">三碗不過(guò)崗:小破孩景陽(yáng)崗打虎記</str>
</doc>
<doc>
<str name="categoryId">a8ea126f3128443fbb2d17e0d5e3c55f</str>
<str name="categoryName">小破孩</str>
<str name="content">&lt;p&gt;小破孩射下九個(gè)太陽(yáng)之后,遭到了報(bào)復(fù),丫丫被烏鴉叼到了月亮上 面,整天哭泣。小破孩十分著急,這下該怎么辦呢?現(xiàn)在,你來(lái)幫小破孩去拯救丫丫吧,操作小破孩登上月球,看你的 了!&lt;/p&gt;</str>
<date name="created">2009-08-04T17:18:44Z</date>
<str name="description">小破孩射下九個(gè)太陽(yáng)之后,遭到了報(bào)復(fù),丫丫被烏鴉叼到了月亮上面,整天哭泣。小破孩十分著急,這下該怎么辦呢?現(xiàn)在,你來(lái)幫小破孩去拯救丫丫吧,操作小破孩登上月球,看你的了!</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">小破孩奔月小游戲,嫦娥我來(lái)啦!</str>
</doc>
<!-- 這里限于篇幅略去了其它結(jié)果 -->
</result>
</response>
這時(shí)候其實(shí)還有一個(gè)問題,就是關(guān)鍵詞有時(shí)候匹配的并不是一個(gè)詞。我們知道英文單詞是以空格分開的,但漢語(yǔ)詞匯卻復(fù)雜多了,甚至有些句字人閱讀起來(lái)都會(huì)有歧義。lucene是外國(guó)人的玩藝兒,沒有內(nèi)置的中文分詞系統(tǒng),這樣一來(lái)你搜中文時(shí),只要有相臨的字串匹配,都會(huì)命中。這樣會(huì)造成匹配度的下降,再來(lái)不良用 戶體驗(yàn)。也許你覺得這沒什么,挺好,一個(gè)結(jié)果不漏。但是你想想,各大搜索引擎都不是白癡,你的結(jié)果頁(yè)匹配度不高,會(huì)影響你關(guān)鍵字的權(quán)重的吧。
不多說(shuō)了,請(qǐng)出國(guó)人的開源分詞系統(tǒng)庖丁解牛(paoding)。sourceforge曾因嫌中國(guó)人只索取不貢獻(xiàn)而屏蔽掉中國(guó)的IP,看到庖丁解牛,作為中 國(guó)人我都感到驕傲了。誰(shuí)說(shuō)中國(guó)人不貢獻(xiàn)了?庖丁解牛跟商業(yè)中文分詞軟件相比應(yīng)該還有差距,但足夠我們做關(guān)鍵詞優(yōu)化用了。你需要在solr 的schema.xml 配置文件里加上相關(guān)配置,在庖丁的配置文件中也要配好字典路徑,這樣你的搜索引擎就大功告成了。
下面要做前端的優(yōu)化設(shè)計(jì)了。你可以做一些流行關(guān)鍵詞的標(biāo)簽放在主頁(yè)上,這些標(biāo)簽頁(yè)指向你的搜索結(jié)果頁(yè)面。效果可參考我部署的一個(gè)案例:http://www.kaoly.com/t-%E9%BB%84%E9%87%91%E7%9F%BF%E5%B7%A5.html 。說(shuō)明一下,一些免費(fèi)CMS系統(tǒng)也有標(biāo)簽功能,甚至也有搜索功能,但其搜索功能是沒法跟lucene比的,而其標(biāo)簽更多的是手動(dòng)或半自動(dòng)維護(hù),相關(guān)度也難 以跟搜索引擎直接去搜相比。你想,如果你的搜索引擎算法好,能更接近大型搜索引擎,那你預(yù)先搜出來(lái)的結(jié)果肯定也是你所有內(nèi)容中最合大型搜索引擎胃口的。這 道理相信大家都明白。更不要說(shuō)標(biāo)簽建立的方便性,你發(fā)現(xiàn)好的關(guān)鍵詞,可以隨時(shí)加一個(gè)標(biāo)簽,簡(jiǎn)單到只需做個(gè)鏈接就可以了。相信常見的免費(fèi)CSM系統(tǒng)沒有這么 好的功能。即使它能自動(dòng)搜索創(chuàng)建標(biāo)簽,那它的標(biāo)簽的相關(guān)度也比不上搜索引擎,因?yàn)樗皇菍W鏊阉饕娴?,它只是為你提供了一些?shí)用的附加的小功能。
本文作者:http://www.kaoly.com/如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇