我在一年前在另一个网站上问过这个问题,但从来没有得到我想要的答案。从那时起我一直在想它。
我想表达一些类似于谷歌的搜索功能(inurl:foo,site:bar.com)
因此,如果您输入了普通查询,但未包含这些函数,则会搜索一列。
但是如果你包含一个函数(func:foo bar
),它会在第1列搜索foo,在第2列搜索bar。
在PHP和MySQL中,这是一个很好的解决方案。此外,多个函数(func1:foo func2:bar query
)也会很好。
答案 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)
通过对查询更加聪明,您可以获得更多的动力,但总体思路应该是相同的。