Google App Engine:是否可以执行GQL LIKE查询?
简单的一个。 在SQL中,如果我想search一个文本字段的几个字符,我可以这样做:
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engine的文档没有提到如何实现这一点,但肯定是一个普遍的问题?
BigTable是App Engine的数据库后端,可扩展到数百万条logging。 因此,App Engine将不允许您执行任何将导致表扫描的查询,因为对于填充良好的表而言,性能会很糟糕。
换句话说,每个查询都必须使用索引。 这就是为什么你只能做=
, >
和<
查询。 (实际上,你也可以做!=
但是API使用>
和<
查询的组合)。这也是为什么开发环境监视你所做的所有查询,并自动向你的index.yaml
文件中添加缺失的索引。
没有办法为LIKE
查询build立索引,所以它根本不可用。
有一个这个谷歌IO会话的手表更好,更详细的解释。
我面临同样的问题,但我发现谷歌应用程序引擎页面上的东西:
提示:查询filter没有明确的方法来匹配string值的一部分,但是您可以使用不等式filter来伪造前缀匹配项:
db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2", "abc", u"abc" + u"\ufffd")
这将匹配每个MyModel实体和一个以字符abc开头的string属性prop。 unicodestringu“\ ufffd”表示最大可能的Unicode字符。 当属性值在索引中sorting时,落在此范围内的值就是以给定前缀开头的所有值。
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
也许这可以做到这一点;)
尽pipeApp Engine不支持LIKE查询,请查看属性ListProperty和StringListProperty 。 当对这些属性进行相等性testing时,testing将实际应用于所有列表成员,例如, list_property = value
testing是否值出现在列表中的任何位置。
有时候这个特性可能会被用来解决缺lessLIKE查询的问题。 例如,它可以做简单的文本search,就像这篇文章所描述的那样 。
您需要使用search服务执行类似于SQL LIKE
全文search查询。
Gaelyk提供领域特定的语言来执行更多用户友好的search查询 。 例如下面的代码片段将会find前十本书,它们都是从最新的,包含fern
的标题和与thriller
完全匹配的风格中挑选出来的:
def documents = search.search { select all from books sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE where title =~ 'fern' and genre = 'thriller' limit 10 }
就像Groovy的匹配运算符=~
。 它支持distance(geopoint(lat, lon), location)
等function。
App引擎在版本1.7.0中推出了支持数据存储的通用全文search服务 。
公告中的细节。
有关如何使用此function的更多信息: https : //cloud.google.com/appengine/training/fts_intro/lesson2
看看这里的 Objectify,它就像是一个Datastore访问API。 这个问题有一个特别的FAQ,这里是答案
我如何做一个像查询(LIKE“foo%”)
你可以做一些像startWith一样的东西,或者在存储和search时颠倒顺序。 你用你想要的起始值做一个范围查询,然后在你想要的值之上加一个值。
String start = "foo"; ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");
请按照以下步骤操作:init.py#354“> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py#354
有用!
class Article(search.SearchableModel): text = db.TextProperty() ... article = Article(text=...) article.save() To search the full text index, use the SearchableModel.all() method to get an instance of SearchableModel.Query, which subclasses db.Query. Use its search() method to provide a search query, in addition to any other filters or sort orders, eg: query = article.all().search('a search query').filter(...).order(...)
我使用GAE Datastore低级Java APItesting了这一点。 我和完美的作品
Query q = new Query(Directorio.class.getSimpleName()); Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query); Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD"); Filter filterNombre = CompositeFilterOperator.and(filterNombreGreater, filterNombreLess); q.setFilter(filter);
一般来说,即使这是一个旧的post,产生“LIKE”或“ILIKE”的方法是从“> =”查询中收集所有结果,然后将结果循环到Python(或Java)正在寻找。
假设您要过滤用户aq ='luigi'
users = [] qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower())) for _qry in qry: if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower(): users.append(_qry)
在数据存储应用程序引擎上执行LIKEsearch是不可能的,如果您需要searchstring中的单词,创buildArraylist将如何实现。
@Index public ArrayList<String> searchName;
然后使用对象化在索引中进行search。
List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();
这会给你一个包含你在search上做的世界的所有项目的列表
如果LIKE '%text%'
总是比较一个字或者几个(思考排列)并且你的数据变化缓慢(慢慢地意味着它并不是非常昂贵 – 无论是在价格上还是在性能上 – 创build和更新索引),那么关系指数实体(RIE)可能是答案。
是的,你将不得不build立额外的数据存储实体并适当地填充它。 是的,有一些限制,你将不得不四处玩耍(一个是在GAE数据存储的列表属性的长度限制5000)。 但search结果是闪电般的。
有关详细信息,请参阅我的RIE Java和Ojbectify和RIE的Pythonpost。
“像”常常被用作穷人替代文本search。 对于文本search,可以使用Whoosh-AppEngine 。
- Google App Engine和Google Compute Engine有什么区别?
- 在Google App Engine上selectJava vs Python
- 使用Python在Google App Engine数据存储中复制实体,而不必在“编译”时知道属性名称
- 如何在Google AppEngine上实现“自动增量”
- 无法从本地App Engine开发服务器访问BigQuery
- Eclipse启动挂起“Android SDK:解决错误标记”
- 如何在Google App Engine中包含第三方Python库?
- 为什么在Google App Engine上使用Django?
- Eclipse和Google App Engine:ImportError:没有名为_sysconfigdata_nd的模块; 无法识别的参数:–high_replication