Google App Engine:是否可以执行Gql LIKE查询?
真的很简单。在SQL中,如果要在文本字段中搜索几个字符,可以执行以下操作:
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engine的文档没有提及如何实现此目标,但是可以肯定这是一个足够普遍的问题?
解决方案
回答
BigTable是App Engine的数据库后端,它将扩展到数百万条记录。因此,App Engine不允许我们执行任何会导致表格扫描的查询,因为对于填充良好的表格而言,性能可能会令人恐惧。
换句话说,每个查询都必须使用索引。这就是为什么我们只能执行" =",">"和" <"查询的原因。 (实际上,我们也可以执行!=
,但是API会使用>
和<
查询的组合来执行此操作。)这也是开发环境监视我们执行的所有查询并自动向其中添加所有缺失索引的原因。index.yaml
文件。
无法为" LIKE"查询建立索引,因此它根本不可用。
观看此Google IO会话,以获取更好,更详细的解释。
回答
我遇到了同样的问题,但是我在Google App Engine页面上发现了一些问题:
提示:查询过滤器没有明确的方式来仅匹配一部分字符串值,但是我们可以使用不等式过滤器来伪造前缀匹配项:
db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2", "abc", u"abc" + u"\ufffd")
这会将每个MyModel实体与一个以字符abc开头的字符串属性prop匹配。 unicode字符串u" \ ufffd"表示最大的Unicode字符。当属性值在索引中排序时,落入该范围的值就是所有以给定前缀开头的值。
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
也许这可以解决问题;)
回答
尽管App Engine不支持LIKE查询,但请查看属性ListProperty和StringListProperty。当对这些属性进行相等性测试时,该测试实际上将应用于所有列表成员,例如," list_property = value"测试值是否出现在列表中的任何位置。
有时,此功能可以用作缺少LIKE查询的变通办法。例如,如本文所述,它使得进行简单的文本搜索成为可能。