Open Source Search Engine 很多, 但是要找到穩定又支援 Unicode, 評價又不錯的, 目前看到的就是 Apache Lucene, 主要是 Java base, 其它語言的版本暫不比較(有些語言的版本是要付費, 而且速度並不比 Java 快).
主要原因是有很多大廠在用, 目前使用 Lucene 的站比較紅的有 Joost, Digg, CNet 等, 參考自: WikiPedia Lucene. (我猜目前最多企業使用的應該是 SQL Like 吧!. Orz..)
本篇先研究將環境建立, 和基本如何 build index, query search 的功能, 其它深入的, 以後有空研究再慢慢寫吧~ 🙂
Apache Lucene 下載點: Lucene Download
首先建立 java 環境(Lucene 需要 java compile)
- apt-get install free-java-sdk # 會安裝這麼一堆 (classpath-tools fastjar fontconfig free-java-sdk java-common jikes jikes-sablevm libatk1.0-0 libcairo2 libdatrie0 libffi4 libgtk2.0-0 libgtk2.0-common libpango1.0-0 libpango1.0-common libsablevm-classlib1-java libsablevm-native1 libsablevm1 libthai-data libthai0 libxcursor1 libxfixes3 libxft2 libxi6 libxinerama1 libxrandr2 libxrender1 sablevm)
建立要被 search 的文件暫存檔(build index 要用)
- mkdir /tmp/dump
- cd /tmp/dump
- vim dump.php # 以 lifetype 為例, 拉 category 來用(id -> cateogry name)
<?php
$dbh = mysql_connect('localhost', 'root', '');
mysql_select_db('lifetype', $dbh);$sql = 'select id,name from plog_articles_categories;';
$r = mysql_query($sql, $dbh);
while($t = mysql_fetch_assoc($r)) {
$fp = fopen($t['id'], 'w');
$content = $t['id'] . ',' . $t['name'];
fwrite($fp, $content);
fclose($fp);
}
?> - php dump.php # 這樣子就會產生以 id 為檔名的檔案, 內容應該一看就懂.
抓 Lucene Source code
- cd $HOME/search
- wget http://apache.ntu.edu.tw/lucene/java/lucene-2.2.0.tar.gz
- tar zxvf lucene-2.2.0.tar.gz
先設定 java classpath 和 lucene 所需 jar 檔路徑參數
- vim ~/.bashrc # 加入下述兩行
- LECENE=$HOME/search/lucene-2.2.0
- CLASSPATH=$CLASSPATH:$LECENE/lucene-core-2.2.0.jar:$LECENE/lucene-demos-2.2.0.jar; export CLASSPATH
- 再 source ~/.bashrc
Compile Lucene source code
- cd ~/search/lucene-2.2.0/src/demo/org/apache/lucene/demo # compile 範例程式即可使用
- javac *.java
Build index(索引)
- java org.apache.lucene.demo.IndexFiles /tmp/dump/ # 這樣就會開始 build index
- 跑完會在 ~/search/lucene-2.2.0/src/demo/org/apache/lucene/demo 產生一個 index 目錄, 存 build 完成的 index file.
- 如果要再重建索引, 必須要將此目錄砍掉才能再重 build index: rm -fr index
Query Search
- java org.apache.lucene.demo.SearchFiles # 就可以開始 Query 囉~
- 如下呈現方式:
Searching for: note (輸入 note, 就會將有 note 的檔名都列出來)
5 total matching documents
1. /tmp/dump/17
2. /tmp/dump/15
3. /tmp/dump/16
4. /tmp/dump/18
5. /tmp/dump/19
Query 語法可以參考: Apache Lucene - Query Parser Syntax
大致上這樣子就完成囉, 目前要研究修改成 Web API/中文斷詞 等.
推薦參考連結:
- Lucene:基於Java的全文檢索引擎簡介(筆記by 車東)
- 利用Lucene制作中文搜尋應用
- Chinese Word Segementer for Lucene - 看來像是加上中文斷詞的程式
- Lucene 學習筆記(1), (2), (3)
- Lucene Tutorial
- Lucene中的基本概念
- Lucene API Document
- 深入 Lucene 索引機制
- 中文書: 征服Ajax+Lucene建構搜尋引擎