X

Search Engine - Apache Lucene 入手指南

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 要用)

  1. mkdir /tmp/dump
  2. cd /tmp/dump
  3. 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);
    }
    ?>

  4. php dump.php # 這樣子就會產生以 id 為檔名的檔案, 內容應該一看就懂.

抓 Lucene Source code

  1. cd $HOME/search
  2. wget http://apache.ntu.edu.tw/lucene/java/lucene-2.2.0.tar.gz
  3. tar zxvf lucene-2.2.0.tar.gz

先設定 java classpath 和 lucene 所需 jar 檔路徑參數

  1. vim ~/.bashrc # 加入下述兩行
  2. LECENE=$HOME/search/lucene-2.2.0
  3. CLASSPATH=$CLASSPATH:$LECENE/lucene-core-2.2.0.jar:$LECENE/lucene-demos-2.2.0.jar; export CLASSPATH
  4. 再 source ~/.bashrc

Compile Lucene source code

  1. cd ~/search/lucene-2.2.0/src/demo/org/apache/lucene/demo # compile 範例程式即可使用
  2. 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/中文斷詞 等.

推薦參考連結:

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post