2013-03-05 148 views
1

我正在構建一個用戶可以搜索帖子的網站。每篇文章都存儲在數據庫中。當用戶進行搜索時,例如iPad的迷你要買查詢將看起來像:過濾搜索查詢的最佳方式是什麼 - PHP MySQL

SELECT * FROM testtable WHERE title REGEXP 'iPad|Mini|FOR|SALE' 

查詢然後將導致這3個項目:

  • 銷售iPad的迷你
  • 銷售的iPad
  • 尋找正宗的金錶

搜索前兩項成功,但第三項並不屬於第e組。我想過濾出來,只顯示相關的項目搜索。我正在考慮去除常見的詞語,比如,是,等等,但也許你們有什麼建議?

附註:你們推薦「REGEXP」嗎?我剛看到它,使用它,並沒有潛入它。 (不需要回答這只是搜索過濾器的問題,但如果你有一些很好的信息,將是偉大的。)

+0

索引是搜索查詢的最佳方式。 – KSHiTiJ 2013-03-05 09:36:25

+0

你能詳細說明嗎? – 2013-03-05 09:37:28

回答

2

你也應該看看FULLTEXT搜索。 爲了使FULLTEXT您需要的搜索工作MyIsam MySQL表引擎類型也有innoDB的支持,但我不太瞭解它。

+0

+1全文。 – 2013-03-05 09:38:55

+0

我用FULLTEXT創建表,但不知道FULLTEXT搜索。你能給樣品嗎?我現在正在使用谷歌搜索,但也許你有如何做到這一點很好的樣本。 – 2013-03-05 09:41:03

+1

@joespina不需要谷歌它只是看到http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html,看看它是如何工作的。 – 2013-03-05 09:48:16

1

是,刪除常用詞

這些被稱爲stop words。這些詞通常是不相關的。

考慮相關

題爲「iPad的迷你出售」一個帖子是一個用戶搜索[iPad的迷你出售]非常相關。標題爲「ipad出售」的帖子不太相關。標題爲「出售奶酪工廠」的帖子仍然不太相關。

請考慮推算一種算法,用於計算您認爲與您網站上的帖子和用戶搜索的詞語相關的內容。

該算法可能很簡單,只需查看搜索的術語以及帖子標題中術語的出現即可。標題中是否搜索了所有術語?可能非常相關。標題中是否有10%的條款被搜索?可能非常無關緊要。

考慮如何計算相關性分數。設置一個閾值,在該閾值以下,結果被視爲與結果中不相關的結果。從以往的經驗,我建議設置門檻相當高,目的只有高度相關的結果,或許上市相關性較差,只有在沒有高度相關的結果可以發現

使用所產生

順便說一句,在搜索中使用詞幹。詞幹分析算法會將詞彙縮減爲常見詞幹。您將只搜索詞幹而不是完整的搜索詞。請閱讀stemming。查找您正在使用的語言的porter stemming算法的實現;這是一個長期以來的算法,從經驗來看,它對於大多數應用程序來說是快速和非常好的。

REGEXP?

如果您刪除停用詞並使用基於詞幹的方法,這將是一個不太相關的問題。無論如何,這是一個實施問題,並且可能過於主觀地讓你得到一個有意義的答案。嘗試一下,檢查性能。嘗試另一種方法,檢查性能。使用最適合你的方法。

+0

「算法可能很簡單,只需查看搜索條件以及帖子標題中條款的出現即可。」 - 這開啓了我的想法,我真的想學習,並且將是最好的事情來完成一個非常相關和乾淨的搜索。但我該怎麼做?它超出了我所學的範圍。我認爲我可以用PHP做到這一點,但MySQL中是否有內置函數來確定行中存在多少搜索條件?什麼是最好的方法來做到這一點? – 2013-03-05 10:09:07

+1

@joespina:沒有MySQL功能來實現這一點;它是MySQL範圍之外的應用程序級功能。您必須從MySQL檢索所有結果,然後在PHP中處理結果,將每個結果與搜索的術語進行比較,並根據需要包含或排除結果。 – 2013-03-05 11:06:40

+0

感謝您的提示。至少我現在有一些關於如何實現搜索結果相關性的方向! – 2013-03-05 12:15:33

相關問題