类似谷歌的搜索功能

时间:2009-12-28 21:29:02

标签: php mysql full-text-search

我在一年前在另一个网站上问过这个问题,但从来没有得到我想要的答案。从那时起我一直在想它。

我想表达一些类似于谷歌的搜索功能(inurl:foo,site:bar.com)

因此,如果您输入了普通查询,但未包含这些函数,则会搜索一列。

但是如果你包含一个函数(func:foo bar),它会在第1列搜索foo,在第2列搜索bar。

在PHP和MySQL中,这是一个很好的解决方案。此外,多个函数(func1:foo func2:bar query)也会很好。

3 个答案:

答案 0 :(得分:1)

我不认为有直接的方法可以做到这一点,但你可以写一个脚本。 您的脚本首先解析搜索查询并查找特殊事件,如下所示:

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

然后您对搜索有特殊要求,请说您的用户要求user:marvin tag:php comment:preg。然后,您知道上面的正则表达式,您的用户希望看到评论或marvin标记为php并包含术语preg,您可以相应地构建您的sql语句。

答案 1 :(得分:0)

我相信你需要一个全文搜索库。 Lucene是个好人。 Zend Search Lucene是Lucene到PHP的一个端口。 Solr是获取Lucene功能的一种相对简单的方法。 Sphinx是一种替代工具,因其易于与MySQL集成而闻名。

答案 2 :(得分: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)

通过对查询更加聪明,您可以获得更多的动力,但总体思路应该是相同的。