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 = valuetesting是否值出现在列表中的任何位置。

有时候这个特性可能会被用来解决缺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 。