全文搜尋 (Lucene 和 Ferret)

搜尋器改變了人們的習慣。當有能力在互聯網上用 0.01 秒的搜尋就找到想要的資料時,如果我們的軟件要花個幾秒甚至幾分鐘才找到資料,用家就會覺得這個軟件很差勁了。

怎樣去做搜尋?

最近單的方法莫過於 SELECT * FROM MYTABLE WHERE CONTENT LIKE '%KEYWORD1%' OR '%KEYWORD2%' 。我們的專案就是用這個方法搜尋用戶地址。這個方法完全沒有問題 — 起碼 — 在這一年多的開發、測試環境也沒有問題。直到在實際環境中 — 有上百萬條記錄的資料庫 — 這種搜尋對資料庫的壓力太大了。試想著每次也由頭到尾由「黃頁」找一個人吧。每條查詢花上2秒以上的時間,我們的系統可是有 3000 個同時的用家啊!

全文搜索

全文搜索是另一個方法。它的原理是把文件每一個字也加進索引中,就如查「黃頁」可以直接打開相關的頁數一樣,效率比傳統方法快上一個數量級。

Lucene 是一個 Java 的全文搜索工具,利用它任何 Java 軟件也可以為任何文件作全文搜索。它分成兩部份:索引和搜尋。前者把文件經整理和分詞化成可以搜尋的索引;後者則由用者的查詢返回相關結果。Lucene 的擴展性很高,開發者可以編寫不同的 document parser 讓 lucene 支援任何文檔,擴展 Analyzer 以支援不同的語言,也可以自定 query parser 改變搜尋的特性。

Lucene 的發展相當成熟,我可不用班門弄斧寫教學了,初學者請讀 IBM developerWorks 实战 Lucene,第 1 部分: 初识 Lucene  。

Ruby on Rails 的全文搜索

提起全文搜索不能不提 Ruby on Rails 的全文搜索解決方案:act_as_ferret了,它是個基於 Lucene 設計的,Ruby on Rails 的全文搜尋工具。 只需要在 Model 中加一句:act_as_ferret,你的 data model 就立即有全文搜索功能!這在以前就像奇跡啊!要搜尋也易如反掌,如 Address.find_by_content('district:mong kok AND name:tong') 就行了,Query 是跟 Lucene 一樣的,使用過 Lucene 的開發者不會有問題。

小小的問題:Terret 的預設 Analyzer 並不支援 CJK 的分詞,完全不能索引中文文件。不過用 lukhnos 發表的簡單 regular expression analyzer 己經可以解決基本的問題了。

相關連結: 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值