2010-09-02 74 views
0

在開發中有一個Web應用程序;要求是提供搜索由PK/FK連接表相關的主表中重要領域以及其他領域網絡應用中多個字段的搜索策略

架構是這樣的

PROJECTS 
projectID 
projectTitle 
projectTown 
projectCountryID (FK to countries table) 
agencyID (FK to agencies table) 

COUNTRIES 
countryID 
countryName 

AGENCIES 
agencyID 
agencyName 

TAGS_PROJECTS (many-many relationship between tags and projects) 
id 
projectID 
tagID 

TAGS 
tagID 
tagName 

,因此用戶輸入搜索詞單一搜索領域並且我們想要查看它是否發生在projects.projectTitle,projects.projectTown,countries.countryName,agencies.agencyName或tags.tagName中,用於分配給項目的任何標記

數據集將隨着時間的推移而增長項目表中的10,000-50,000行的順序,以及其他表中的000的順序

我打算建立一個測試平臺並運行不同方法的測試,但我想知道是否有人曾經處理類似的情況,並有任何建議提供?

我正在考慮,將測試的方法分別是:

單個查詢 我想這將有可能寫一個SQL查詢來進行搜索,但是這樣的查詢可能會不小心優化表現不佳一旦數據增長到全尺寸。問題是我不會在項目啓動後參與,所以不會有完整的,真實的數據進行實驗

多個查詢 由於網站和數據庫將輕微加載,一些小的查詢可能會在代碼最簡單快捷。將發出幾個SQL查詢,然後將每個搜索的結果集合併到PHP中。

冗餘搜索表 當我編輯項目時,我正在考慮將一行作爲手工索引編寫到另一個表中 - 這將從標記,國家,機構等相關字段的文本值中將它們連接成一個字符串並使用projectID將其粘貼到搜索表中;每個項目的項目表中都會有一行,基本上代表我們可以搜索的關鍵數據的非規範化視圖。

我已經看了一下使用MySQL的一些看法,但是對這些缺乏索引感到緊張;至少冗餘搜索表可以仔細索引

技術手 - PHP 5.1.6和MySQL 5.0.22在RHEL5

運行的任何想法,意見或戰爭的故事歡迎

感謝您的時間

伊恩

回答

0

我肯定會考慮的MySQL這樣做的FULLTEXT功能。我已經answered a question關於不同的搜索方法,並且該解決方案大多是您所需要的。

基本上,在該答案中描述的FULLTEXT示例中,您可以簡單地使用SELECT來創建臨時表,該SELECT將聲明所有希望從中搜索的表的所有字段(+他們的索引列)並聲明您的FULLTEXT這些領域的索引。然後,簡單地查詢該臨時表...

+0

嗨Yanick,謝謝你。每次填充臨時表有什麼好處,這將需要我執行所有昂貴的連接,我試圖避免,每次運行查詢時?如果我想使用MyISAM的FULLTEXT功能,爲什麼不維護一個單獨的MyISAM表?謝謝,Ian – Polsonby 2010-09-03 07:59:32

+0

@Flubba,JOIN語句並不昂貴,至少比FROM多個表更便宜...無論如何,是的,您可以使用AFTER INSERT/UPDATE/DELETE觸發器維護單獨的MyISAM表,或者您可以使用第三方搜索並在延遲的時間段後運行索引器。在任何情況下,維護獨立的啓用FULLTEXT的表格都不應該由您的項目本身完成,因此,如果您需要更改技術,您將無法完成搜索。 – 2010-09-03 19:24:32

+0

有趣的想法,歡呼聲。 .. – Polsonby 2010-09-06 08:47:45

0

我會建議,而不是自己構建此搜索功能,您可以使用庫的特定搜索產品。 你可以使用SOLR。有了這樣的產品,讓它索引數據源通常相當容易,在這種情況下,它是一個數據庫。 在SOLR的情況下你可以

例如使用SOLR會給你很多額外的和高級的功能,你可以很容易地在你的web應用程序中使用。例如分面搜索,拼寫建議,尋找同義詞,功能找到類似的話(錯別字),不僅精確匹配,還有更多:features of SOLR

還有可用的SOLR客戶端代碼的PHP:http://code.google.com/p/solr-php-client/

除了SOLR有是許多其他搜索產品實現這種搜索功能,無論是自由和商業。

要自己構建這種功能並非不可能,但使用成熟的產品可以獲得經過測試的產品以及許多改進用戶體驗非常困難的功能。