2009-12-28 48 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) 

通过查询更聪明,你可以获得更多的爱好者,但总的想法应该是一样的。