很简单。在SQL中,如果我想要搜索文本字段中的一些字符,可以这样做:
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engine的文档中没有提到如何解决这个问题,但是这肯定是一个相当普遍的问题吧?
很简单。在SQL中,如果我想要搜索文本字段中的一些字符,可以这样做:
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engine的文档中没有提到如何解决这个问题,但是这肯定是一个相当普遍的问题吧?
BigTable是App Engine的数据库后端,可以扩展到数百万条记录。由于这个原因,App Engine不允许您执行任何会导致扫描表的查询,因为对于一个人口稠密的表来说性能将非常糟糕。
换句话说,每个查询都必须使用索引。这就是为什么您只能进行=
,>
和<
查询的原因。(实际上,您也可以做!=
查询,但API使用>
和<
查询的组合来执行此操作。) 这也是为什么开发环境监视您执行的所有查询,并自动向您的index.yaml
文件添加任何缺少的索引。
无法为LIKE
查询创建索引,因此无法使用LIKE
查询。
观看此Google IO会话,以获得更好、更详细的解释。
db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
"abc",
u"abc" + u"\ufffd")
这将匹配所有具有以字符abc开头的字符串属性prop的MyModel实体。Unicode字符串u"\ufffd"表示最大可能的Unicode字符。当属性值在索引中排序时,落在此范围内的值都是以给定前缀开头的所有值。
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
也许这个可以解决问题 ;)
list_property = value
测试值是否出现在列表中的任何位置。LIKE
的全文搜索查询。
Gaelyk提供了特定领域语言,以执行更友好的搜索查询。例如,以下片段将找到包含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
}
Like操作符在Groovy中被称为匹配操作符=~
。它还支持函数,例如distance(geopoint(lat, lon), location)
。
App Engine在1.7.0版本中推出了一个通用的全文搜索服务,支持数据存储。
有关详细信息,请参见公告。
有关如何使用此功能的更多信息:https://cloud.google.com/appengine/training/fts_intro/lesson2
String start = "foo";
... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");
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)
请跟随这里:
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, e.g.:
query = article.all().search('a search query').filter(...).order(...)
在数据存储应用程序引擎上无法进行LIKE搜索,如果您需要在字符串中搜索单词,则创建ArrayList将会起到作用。
@Index
public ArrayList<String> searchName;
List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();
我使用GAE Datastore低级Java API进行了测试。它与我的工作完美匹配。
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);