仲介交易 HTTP://www.aliyun.com/zixun/aggregation/6858.html">SEO診斷 淘寶客 雲主機 技術大廳
經常看到站長朋友們討論關鍵字優化,也見過站長朋友費心地「積累」關鍵字。 這裡為大家分享一個用自架搜尋引擎來做關鍵字優化的經驗。
聲明:此經驗適用于有一定技術能力的站,要求伺服器有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系統沒有這麼 好的功能。 即使它能自動搜索創建標籤,那它的標籤的相關度也比不上搜尋引擎,因為它不是專做搜尋引擎的,它只是為你提供了一些實用的附加的小功能。
寫到這兒我就把自架搜尋引擎實現關鍵字優化的方案給介紹完了。 因為是介紹解決方案,限於篇幅和我的時間,很多部署細節未提及。 如果你有興趣,可以參閱相關文檔,也可以與我聯繫(QQ:1017273876)。 最後祝站長網和各位站長網站越辦越火,錢越賺越多!