close

對於一個網站來說,當內容一多的時候,弄個搜尋引擎也是合理的。只是一般來說,這東西的門檻算高,對於沒接觸過理論的人來說,要自行開發搜尋引擎較為困難。某些網站的作法,都是將查詢的關鍵字放進SQL語法直接查詢,通常都是用select * from table where field like ‘%SearchQuery%’ 。但是,這類的查詢語法是很吃資料庫效能的,一旦使用者一多,是會拖垮網站的速度。

好在網路有現成的搜尋引擎元件可以用,而且還是開放原始碼的,本篇文章將以Lucene.Net做示範。

Lucene.Net是Lucene的.Net版本,最初的版本是用Java寫的,如果想使用最新的版本,建議是使用Java版本。

Lucene.Net的網址如下:

http://incubator.apache.org/lucene.net/

首先,對於搜尋引擎的相關知識先做一個簡單的解說,這門技術屬於資訊檢索(Information Retrieval)的範圍,所謂的資訊檢索,就是如何在大量的文件中找到想要的文件的一門學問,而網路的搜尋引擎只是屬於其中的一小部份。建置搜尋引擎的第一步,就是先對大量的文件建立索引,所謂的索引,就是對於文件內容做分析,將內容拆成一個個的詞,再加以統計。

舉例來說,一份文件假設有”This is the book”這一行內容,搜尋引擎通常會將它拆成”This”、”is”、”the”、”book”這幾個詞,往後的文件如果也有相同的詞,搜尋引擎也會將它記錄下來,並統計這個詞出現在哪幾個文件裡、出現在文件的哪一行。之後,搜尋引擎再利用相關的演算法,計算某份文件在某個詞的分數是幾分,這樣在搜尋時,才能算出文件的排序。

總而言之,建置搜尋引擎,必須要有下列的功能:

  • 建立索引
  • 計算詞(Term)與文件之間的分數
  • 由詞搜尋到相關的文件

有了這些概念,接下來再介紹Lucene.Net的用法。在這裡,以搜尋商品做為示範。

一開始先定義商品具有下列屬性。

2011-11-05_151740

 

之後訂立LuceneClass這個類別,建構子內先設定索引的存放位置,以及在裡面宣告一個IndexSearch型別的變數,這個是之後用來做搜尋的。

2011-11-05_151759

 

接下來是建立索引的程式碼。

2011-11-05_151814

上述的程式碼,會用到IndexWriter,在這裡只要想成是將一份一份的文件寫入索引,而文件會包含一條一條的屬性。所以這邊會用到Document及Field這兩個類別,一個Document會包含多個Field,前面定義的Product類別,裡面的SaleName、Desc及Price就會以Field來記錄,然後再加進Document裡。需要注意的是,Field的建構子,要設定該Field是否需要儲存、是否需要被索引,如果沒有被索引,該Field就沒有辦法被搜尋,只能當做搜尋結果的一部份內容。

 

做完索引後,就是重點的搜尋功能。

2011-11-05_151830

所謂的搜尋條件,學術上稱為Query,所以在Lucene裡就定義了兩個類別:Query及QueryParser。將使用者輸入的查詢透過QueryParser產生Query物件,然後將Query丟進IndexSearch物件做搜尋,最後回傳的結果就是Hits物件,裡面存放的就是搜尋結果。

 

最後用WinForm程式做測試,下面是測試的介面。

2011-11-05_151857

 

測試程式內的建構子及相關的變數。

2011-11-05_151914

 

建立索引的程式碼。

2011-11-05_151931

 

搜尋的程式碼。

2011-11-05_151951

 

在建立完索引後,可以看到資料夾內產生了幾個檔案,這些存放了索引的相關資訊。

2011-11-05_152004

2011-11-05_152028

 

測試結果。

2011-11-05_152046

2011-11-05_152115

2011-11-05_152128

 

在Lucene 3.0之前,對於中文的分詞功能較差,它是將中文內容拆成一個一個的中文字,而不是一個詞,如果想要有較佳的中文分詞功能,可以自行在網路上搜尋對岸強者所寫的中文分詞器。

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()