db.names.contains(...) is not valid DAL code nor would it be able to produce valid SQL (i.e., you have to specify fields). So, you need something like your second example, but replace all the "&" operators with "|". Anyway, there is no need to do that, because the grid search already does exactly that, which is why all you have to do is disable the Javascript search widget (as described in the linked post) to get the behavior you want.
Alternatively, you can code your own search function:
def mysearch(sfields, keywords):
keywords = keywords.strip()
return reduce(lambda a, b: a | b, [field.contains(keywords) for field in db.names])
Then pass that as the "searchable" argument to the grid.
Anthony