天天看點

[連載]Java程式設計(03)---任務驅動方式:尋找高富帥和屌絲

1. Sphin x簡介 

1.1. 什麼是全文檢索 

全文檢索是指以文檔的全部文本資訊作為檢索對象的一種資訊檢索技術 。檢索的對象有可能是文章的标題,也有可能是文章的作者,也有可能是文章摘要或内容。 

1.2. 介紹 

Sphin x是一個基于SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能 ,使得應用程式更容易實作專業化的全文檢索。Sphin x特别為一些腳本語言設計搜尋API接口 ,如PHP ,Python,Perl,Ruby等,同時為MySQL也設計了一個存儲引擎插件。 

1.3. Sphin x的特性 

高速索引 (在新款CPU上,近10 MB/秒);

高速搜尋 (2-4G的文本量中平均查詢速度不到0.1秒);

高可用性 (單CPU上最大可支援100 GB的文本,100M文檔);

提供良好的相關性排名

支援分布式搜尋;

提供文檔摘要生成;

提供從MySQL内部的插件式存儲引擎上搜尋

supports boolean, phrase, and word proximity queries;

支援每個文檔多個全文檢索域(預設最大32個);

支援每個文檔多屬性;

支援斷詞;

支援單位元組編碼與UTF-8編碼;

supports English stemming, Russian stemming, and Soundex for morphology;

支援MySQ(MyISAM和InnoDB 表都支援);

支援PostgreSQL.2. Sphin x安裝(For MySQL) 2.1. Windows下安裝 從 上下載下傳MySQL5.0.45版安裝配置好MySQL,采用utf-8字元 集

==================================================================================================================

要為站點提供自定義搜尋功能,您必須有資料源和搜尋該資料源的功能。對于 Web 應用程式,資料源通常是一個關系資料庫,其中内置了一些搜尋功能(Equality 是一個簡單的搜尋運算符,與 SQL 運算符

<code>LIKE</code> 一樣)。但是,一些搜尋可能比資料庫可以執行的搜尋更加具體,或者搜尋可能過于複雜,而導緻固有的 SQL <code>JOIN</code> 反應遲鈍。

要加速搜尋,您可以重新安排表,并由此簡化底層查詢(表和 SQL 查詢優化高度依賴于模式和引擎。可通過線上搜尋查找有關資料庫性能的各種文章和書籍)。此外,您可以添加一個專門化的搜尋引擎。應用哪種形式的搜尋引擎還依賴于資料的形式(和數量)和預算。有許多選擇可用:您可以将一個 Google 工具連接配接到您的絡中,購買 Endeca 或其他大型商業搜尋産品,或者嘗試 Lucene。但是在很多情況下,使用商業産品都有點小題大做,或者浪費營運預算,并且 Lucene 在 2007 年 7 月編寫時并未提供 PHP API。

作為一個備選方案,考慮一下 ,它是一種開源和免費的搜尋引擎,可以非常快速地搜尋文本。例如,在一個幾乎有 300,000 行及五個索引列(每列包含大約 15 個單詞)的活動資料庫中,Sphinx 可以在 1/100 秒内得到 “這些單詞中任何一個單詞” 的搜尋結果(在運作 Debian Linux? Sarge

的 2-GHz AMD Opteron 處理器、1 GB RAM 的計算機上)。

Sphinx 提供了大量功能,包括:

它可以為能夠表示為字元串的所有資料建立索引。

它可以以各種方式為相同資料建立索引。對于多個索引,每個索引都針對特定目的而定制,您可以選擇最适當的索引來優化搜尋結果。

它可以把屬性與每條索引資料關聯起來。然後您可以使用一個或多個屬性來進一步過濾搜尋結果。

它支援詞法,是以搜尋單詞 “cats” 還會找到詞根 “cat”。

您可以在許多計算機中分發 Sphinx 索引,進而提供故障恢複功能。

它可以建立任意長度的單詞字首索引和可變長度的中綴子字元串的索引。例如,一個零件号可以是 10 個字元寬。字首索引将比對位于字元串開頭處的所有可能的子字元串。中綴索引将比對在字元串内任意位置的子字元串。

您可以在 MySQL V5 内将其作為存儲引擎運作,降低使用其他守護程式的需求(通常被視為另一個故障點)。

您可以在 Sphinx 源代碼附帶的 README 檔案中或通過線上資料找到完整的功能清單。Sphinx Web 站點還列出了已經部署了 Sphinx 的若幹個項目。

Sphinx 是用 C++ 編寫、用 GNU 編譯器建構、支援 64 位支援平台,并在 Linux、UNIX?、Microsoft? Windows? 和 Mac OS X 上運作。建構 Sphinx 十分簡單:下載下傳并解壓縮代碼,然後運作

<code>./configure &amp;&amp; make &amp;&amp; make install</code> 指令。

預設情況下,Sphinx 實用程式将被安裝到 /usr/local/bin/ 中,并且所有 Sphinx 元件的配置檔案都位于 /usr/local/etc/sphinx.conf 中。

Sphinx 有三個元件:索引生成器、搜尋引擎和指令行 search 實用程式:

索引生成器被稱為索引器。它将查詢資料庫,為結果的每行中的每列建立索引,并且将每個索引條目綁定到行的主鍵上。

搜尋引擎是名為 searchd 的守護程式。該守護程式将接收搜尋詞和其他參數,快速周遊一個或多個索引,并傳回結果。如果找到比對,searchd 将傳回一個主鍵數組。對于這些鍵,應用程式可以針對相關資料庫運作查詢來查找包含比對的完整記錄。Searchd 将在端口 3312 上通過套接字連接配接與應用程式進行通信。

便捷的 search 實用程式使您可以從指令行構造搜尋而無需編寫代碼。如果 searchd 傳回比對,則 search 将查詢資料庫并顯示比對集中的行。search 實用程式對于調試 Sphinx 配置和執行臨時搜尋十分有用。

要應用 Sphinx 來解決問題,您必須定義一個或多個資料源以及一個或多個索引。

source 将辨別資料庫來建立索引,提供驗證資訊,并且定義查詢用以構造每行。資料源可以随意地辨別一列或多列作為過濾器,Sphinx 将之稱為組。您将使用組來過濾結果。例如,單詞描述可能得到 900 個比對。如果隻對特定型号的汽車比對感興趣,則可以進一步使用型号組進行過濾。

index 将要求獲得資料源(即一組資料行)并定義應當如何為已從資料源中提取出來的資料編目。

您将在 sphinx.conf 檔案中定義資料源和索引。Body Parts 的資料源是 MySQL 資料庫。清單 5 顯示了名為 catalog 的資料源的部分定義 —— 指定連接配接的資料庫以及如何建立連接配接(主機、套接字、使用者和密碼)的代碼片段。

接下來,建立一個查詢以生成要被索引的行。通常,将建立 <code>SELECT</code> 子句,可能需要把許多表 <code>JOIN</code> 在一起才能得到行。但這裡存在一個問題:搜尋型号和年份必須使用 Assembly 表,但是零件号和零件描述隻能在 Inventory 表中找到。為此,Sphinx 必須能夠把搜尋結果與 32 位整型主鍵綁定在一起。

要獲得右側表單中的資料,需要建立一個視圖 —— MySQL V5 中的新結構,它将把來自其他表的列整合到單獨的合成虛拟表中。使用視圖,各類搜尋所需的所有資料都在一個位置,但是活動資料實際上存在于其他表中。清單 6 顯示了定義 Catalog 視圖的 SQL。

如果用前面所示的表和資料建立名為 body_parts 的資料庫,則 Catalog 視圖應當類似以下内容:

在視圖中,字段 <code>id</code> 将指回 Inventory 表中的零件條目。<code>partno</code> 和 <code>description</code> 列是要搜尋的主要文本,而

<code>assembly</code> 和 <code>model</code> 列用作進一步過濾結果的組。視圖就緒後,構造資料源查詢就是小事一樁。清單 7 顯示了 catalog 資料源定義的其餘部分。

<code>sql_query</code> 必須包括後續查找需要使用的主鍵,并且它必須包括需要索引和用作組的所有字段。兩個 <code>sql_group_column</code> 條目将聲明 Assembly 和 Model 可用于過濾結果。并且 search 實用程式将使用

<code>sql_query_info</code> 來查找比對記錄。在查詢中,<code>$id</code> 被替換為 searchd 傳回的每個主鍵。

最後一個配置步驟是建構索引。清單 8 顯示了資料源 catalog 的索引。

第 1 行将指向 sphinx.conf 檔案中的指定資料源。第 2 行将定義存儲索引資料的位置;按照約定,Sphinx 索引将被存儲到 /var/data/sphinx 中。第 3 行将允許索引使用英文詞法。并且第 5 行至第 7 行将告訴索引器隻索引含有三個字元或更多字元的那些單詞,并且為每個這樣的字元的子字元串建立中綴索引(為了便于引用,清單 9 顯示了 Body Parts 的完整示例 sphinx.conf 檔案)。

繼續閱讀