2010-09-09 42 views
0

假設我有一個名爲DB的MySQL數據庫和一個名爲ContactInfo的表。下面是它的結構和一些示例數據(僅一個項目):從數據庫中進行全文搜索

表----的ContactInfo:


 
----------------------------------------------------------- 
name fullname          phone 
----------------------------------------------------------- 
NASA National Aeronautics and Space Administration 00000 
----------------------------------------------------------- 

現在我想搜索的表下的數據「 ContactInfo「使用以下方式:

1)無論我輸入」NASA「或」國家航空航天局「或電話號碼,都應該將右邊的行我。 2)當我進入「國家航空局」或「國家航天局」或「美國航空航天局」或「美國航空航天局」時,它們在數據庫中並不完全匹配,但第一行應該是由於第一行中的內容與請求的字符串相關,因此返回給我。

方式二可以被看作是隱蔽的搜索。

我已經考慮過使用諸如「Hpyer estraier」和「Lucene」之類的「全部上下文搜索」。不過,我發現我的要求不同或多或少。

使用「Hyper estraier」或「Lucene」時,首先根據解析的純文本創建索引。然後開始搜索。

那麼這是否意味着我應該將數據庫中的數據更改爲多個純文本文件(表中的每個記錄爲單個文件),然後根據這些文件構建索引?

順便說一句,我剛剛發現MySQL支持全文搜索,但是我們必須處理一些中文字符,但似乎mysql確實支持中文字符全文搜索。

那麼,任何人都可以給我一個建議?

回答

0

您可以將sphinx與mysql結合使用。 sphinx是一個獨立的工具,但它有一個mysql代理模式,它基本上像一個mysql服務器,可以用任何mysql連接器查詢。 或者,作爲替代方案,還有一個用於mysql的sphinx存儲引擎插件,它允許您使用當前的mysql連接查詢sphinx,並對其他表執行連接。

Definetly不是基切和骯髒的解決方案,但它是值得進一步研究:http://sphinxsearch.com/

+0

似乎sphinx只支持php,但我們的應用程序是在java.and下構建的,而我發現另一個sphinx-4,有什麼不同? – hguser 2010-09-09 11:06:09

+0

Java不需要在sphinx支持中構建。您可以使用SphinxSE'SE =存儲引擎http://sphinxsearch.com/docs/current.html#sphinxse-using或SphinxQL http://sphinxsearch.com/docs/current.html#sphinxql這是一個守護程序一個真正的MySQL服務器,讓我們來執行查詢。兩種方法都要求sphinx守護進程啓動並運行。 SphinxQL更容易設置,因爲SphinxSE要求您使用sphinx支持重新編譯MySQL,但SphinxSE更方便查詢,因爲您可以從sphinx搜索中查詢product_id,並且可以一步直接加入產品表。 – 2010-09-09 14:33:25

0

你可以使用這樣的事情,爲此目的:

SELECT * 
    FROM `ContactInfo` 
WHERE `name` LIKE '%your-query%' 
    OR `fullname` LIKE '%your-query%' 
    OR `phone` LIKE '%your-query%' 

爲了支持你的情況#2,您需要% -characters替換your-query所有空間,使字符之間的任意組合輸入的話。記住要避免用戶輸入以防止SQL注入。

將所有數據放入(單獨的)文本文件中似乎對於存儲數據確實是無效的。

+0

情形#2,對於英文字符您的建議的工作,但似乎不適合中國字。由於英文單詞以空格開始和結束,但中文單詞不會。 – hguser 2010-09-09 10:58:59

+0

您可以使用帶有字邊界快捷鍵('\ b')的正則表達式來構建此文件,如[這裏](http://unicode.org/reports/tr18/#Tailored_Word_Boundaries)中記錄的那樣。 – jwueller 2010-09-09 11:14:06

+0

謝謝,我會試一試。我想知道與全文serach相比,哪種效率更好? – hguser 2010-09-09 11:41:05