2012-07-17 71 views
4

我正在使用MySQL和PHP爲我的網站創建一個簡單的搜索功能。現在,如果在搜索欄中輸入單詞「貓」,我將無法檢索帶有「貓」字樣的文章,反之亦然。這與ed的結尾是一樣的。在PHP搜索引擎中處理簡單的語法

我能想到解決這個問題的唯一方法就是從每個單詞末尾的所有「s」和「ed」中刪除長度超過一定長度的單詞(以避免將「Ted」變成「T」 「等)。但是,這個簡單的解決方案並不完美。我希望有人能爲我提供更好的解決方案。

+1

但是'-ed'並不總是這種情況。那麼非常規(捕捉,餵食,跑步等)呢?你不能總是用簡單的字符串操作將過去式轉換成當前(或無限)。你需要一本字典。另外,你如何計劃區分名詞(搜索不應該計算'-ed'和動詞應該)? – 2012-07-17 01:26:57

+0

@PhpMyCoder:我無法這樣做,這正是我爲什麼在SO上提出這個問題的原因。否則,我可以簡單地刪除所有「ed」,我的所有問題都將被解決。 – 2012-07-17 01:29:38

回答

9

你所說的技術被稱爲詞幹。由於對語言有很多影響,在應用程序級別處理自己很難。如果你不想處理這個問題,你可以讓MySQL根據你正在運行的MySQL版本爲你做些繁重的工作。如果您使用的是5.6.4或更高版本,則將其內置到MyISAM表和InnoDB表的全文搜索機制中。在5.5到5.6.3版本中,它是爲MyISAM而不是InnoDB表格內置的。對於5.1版,可以從mnoGoSearch獲得一個插件。在5.1之前,我認爲您需要在應用程序級別處理它,但我沒有證實。

這些鏈接可能會幫助您入門。

注意的停止字是在搜索文本時會被忽略的很常見,往往是短期單詞的列表中該查詢被處理。如果它阻止您獲得預期結果,則有設置可以控制停用詞列表。您可能希望將最小單詞長度設置爲2或3(默認值爲4),並刪除默認列表中的許多單詞。

如果你想處理而產生對自己或與PHP有a detailed technical discussion of the Porter Stemming Algorithm by Martin Porter並至少有兩個PHP實現可用,an older one in PHP4 by Jon Abernathy可能有一些缺陷和a newer one in PHP5 by Richard Heyes

我假設你主要關心英語,但我相信對其他語言也有一些支持。

As mentioned by rnmccall如果您需要更高級的搜索功能,您可能需要使用Sphinx或Apache Lucene。

+0

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html – 2012-07-17 01:35:26

3

刪除問題中描述的後綴的策略通常稱爲詞幹。如果你仍然有興趣採取這種策略,你應該檢查出http://tartarus.org/~martin/PorterStemmer/爲干擾的背景。該頁面還具有Porter stemmer的PHP實現,並鏈接到更現代的算法。

該詞幹搜索方法由Sphinx使用,其用於pydoc等等。

詞幹方法的主要好處是它簡單明瞭,可以輕量級。

但是,如果你想要更復雜的搜索功能,你可能應該使用像Apache Lucene這樣的東西。

0

您可以簡單地使用

SELECT * FROM topics WHERE Title LIKE '%cat%' 

查詢搜索標題爲貓和貓主題。如果要從大型文本內容搜索數據,則可以使用FullTextSearch。在這種情況下,你只能使用MyISAM表格。您可以閱讀FullTextSearch文檔here

0

沒有任何意思ed或任何你想要刪除的東西。因爲您正在從段落中搜索字符串,所以您需要爲搜索提供特定的關鍵字。該關鍵字可以是完整字符串(單詞)或可以是子字符串(單詞的一部分)。

例子: -

你是在一個black孔。

現在你想通過提供bla作爲搜索搜索black string.Then查詢,如: -

SELECT * FROM TABLE_NAME WHERE YOUR_FIELD_NAME LIKE '%BLA%' 

使用此上述查詢讓你content.You一個精確匹配可以提供任何子來自您想要搜索的段落/段落中的字符串。

希望它能幫助你。

0

一個簡單的查詢將是:

select * from table where item like '%name%' 

爲了避免T和特德的事情,使用substr()功能,並獲得字符串轉換成通用的尺寸,然後將這個字符串where子句。

1

我推薦使用Lucene。它也會減少你的db壓力,因爲你沒有運行復雜的查詢 - 只是查找一個索引。你也可以用Lucene運行模糊搜索。

0

可能的解決方案:

1.Simplest要實現 - >使用%操作

像貓%%

2.使用Solr的快速執行的最佳算法中實現在那裏。

注意:你也可以將結果緩存在緩存中