2009-12-28 72 views
1

我在一年前在另一個網站上問過這個問題,但從來沒有得到我正在尋找的答案。從那以後我一直在想它。谷歌般的搜索功能

我想impliment類似於谷歌的一些搜索功能(inurl這樣:FOO,網站:bar.com)

所以,如果你進入了一個正常的查詢,有沒有這些功能包括在內,它會尋找一個柱。

但是,如果您包含函數(func:foo bar),它會在第1列搜索foo,第2列搜索bar。

這對PHP和MySQL有什麼好的解決方案。另外,多個功能(func1:foo func2:bar query)也不錯。

回答

1

我不認爲有直接的方式來做到這一點,但你可以寫一個腳本。 您的腳本首先是解析搜索查詢,並找到特殊OCCURENCES,這樣的事情:

preg_match_all("/([\w_]+):([\w_]+)/", $search_query); 

然後,你必須爲你搜索的特殊要求,說你的用戶要求user:marvin tag:php comment:preg。然後你知道上面的正則表達式,你的用戶想看到的評論或marvin標記爲php,幷包括術語preg,你可以建立你的SQL語句相應。

0

我相信你需要一個全文搜索庫。 Lucene是個不錯的選擇。 Zend Search Lucene是Lucene到PHP的一個端口。 Solr是獲得Lucene功能的一個相對簡單的方法。 Sphinx是一種替代工具,因其易於與MySQL集成而聞名。

0

如果存儲在已列函數值,那麼它應該是可以通過建立適當的SQL查詢來做到這一點(在Python,但應該很容易轉換爲PHP):

functions = ['func1', 'func2', ...] 
clauses = [] 
for term in search_query.split(): 
    if ':' in term: 
     func, value = term.split(':', 1) 
     if func in functions: 
      clauses.append('%s=%s' % (func, value)) 
      continue 
    clauses.append('column LIKE %s' % result) 


# The following is vulnerable to SQL injection, so don't do it. A 
# better way would be to use prepared statements. 
sql = 'SELECT result FROM search_table WHERE ' + ' AND '.join(clauses) 

通過查詢更聰明,你可以獲得更多的愛好者,但總的想法應該是一樣的。