2012-08-16 90 views
1

這是一個我一直在努力的問題的概括。我的情況是,我有一個WordPress網站,其中包含多種「帖子類型」(例如文章,博客文章,產品等)。如今這些常見做法,我希望在不同的類別中顯示來自每個帖子類型的搜索結果。搜索多種內容類型

我的問題在於構建搜索。我應該爲每個帖子類型運行單獨的數據庫查詢,還是應該運行一個大的查詢並通過PHP分離所有內容?我傾向於傾向於後者,但我遇到的問題是分頁。我可能不得在查詢上設置任何LIMIT,因爲如果我有一個帖子類型的幾個匹配項,搜索將不會返回其他帖子類型的任何結果。

因此,從性能和一般最佳實踐的角度來看,最好有一個沒有LIMIT子句的大查詢,或者爲每個搜索運行多個查詢?

注意:這與a question類似,我在WordPress Stack Exchange站點上詢問了一段時間。然後我接受了多個查詢解決方案,但我仍然很不確定這一點。

+0

爲什麼不是多個查詢解決方案?從用戶的角度來看更好:我不想在搜索某種類型的數據時支付大的搜索費用。從代碼的角度來看,它更好,因爲它更容易獨立發展這種搜索。它更乾淨更輕。 – inigomedina 2012-08-17 07:31:54

+0

我肯定會允許用戶將搜索範圍縮小到特定的內容類型,如果他們想要的話,那麼我肯定會在數據庫中進行過濾。在這個問題中,我關注的是用戶沒有指定內容類型的情況。我不確定運行通過PHP或幾個較小搜索過濾的大型搜索會花費多少。那有意義嗎? – 2012-08-17 23:52:19

回答

1

根據我的經驗,通常要求數據庫儘可能少做一些工作,並讓PHP完成大部分繁重的工作。它通常更快。

因此,我會嘗試做兩個非常簡單的查詢(每個表一個),然後將它們與PHP代碼合併/排序。

如果您的數據集非常大,或者您的虛擬主機是廢話,那麼您的PHP腳本可能會耗盡內存......然後,只有這樣,開始尋找正確的方法是個好主意在MySQL中這樣做(我懷疑臨時表可能是正確的地方)。

但是,如果你遇到PHP的性能限制,那麼我懷疑你在MySQL中做的任何事情實際上會變得更慢,你將不得不改變你的數據庫結構以獲得良好的性能。做到這一點的一種方法是保留現有的表結構,但是要有第三個表,其中包含所有表的重複數據 - 僅用於搜索,以及一些代碼保持所有表的同步。

例如,我們有一個包含該網站的用戶上傳的每一個PDF文檔中的表格,我們有一個包含每一個字那就是任何文件另一個表,並在這些之間的許多一對多連接表。

無論何時上傳新的pdf,我們都會查找其中的每個單詞,並將記錄插入到鏈接表中。這樣我們實際上從來不必在PDF文檔中進行搜索,我們只搜索已經結構化的索引表以允許快速搜索。

+0

感謝您的深刻解答。我對你提到的2個簡單查詢的性質有點好奇。每個人的目的是什麼? – 2012-08-16 20:39:04

+0

那麼,我會在每個表上有一個基本的查詢,比如select * from wp_posts,其中post_title就像'%foo%'或post_content',像'%foo%'',然後將它們連接到一個單獨的結果數組中,任何其他後處理(例如:對於wordpress,你需要'strip_tags()'然後再次驗證搜索 - 使搜索項採用HTML或CSS語法,但不包含在實際的發佈內容中)。 – 2012-08-16 20:58:42

+0

呼籲通過'strip_tags()'運行結果並重新檢查,但這聽起來是資源密集型的。 好吧,我可能會結束運行2或3個查詢總數。我爲'wp_posts'表考慮1,'wp_terms'表爲1,'wp_postmeta'表爲1。這聽起來是否適合你? – 2012-08-16 21:16:38

0

對於這種類型的搜索,我會打開我的想法索引,使用像Solr的解決方案。你可以用這樣的解決方案做很多事情,並且它們可以很好地匹配以通用方式搜索的用戶類型。

+0

這看起來很健壯。我不確定我是否能夠在我的共享主機環境中安裝它。感謝您的建議。 – 2012-08-21 19:22:08

相關問題