124

真的很简单。在 SQL 中,如果我想在文本字段中搜索几个字符,我可以这样做:

SELECT blah FROM blah WHERE blah LIKE '%text%'

App Engine 的文档没有提到如何实现这一点,但它肯定是一个常见的问题吗?

4

12 回答 12

82

BigTable 是 App Engine 的数据库后端,将扩展到数百万条记录。因此,App Engine 将不允许您执行任何会导致表扫描的查询,因为对于填充良好的表来说性能会很糟糕。

换句话说,每个查询都必须使用索引。这就是为什么你只能做=,><查询。(实际上您也可以这样做!=,但 API 使用><查询的组合来执行此操作。)这也是开发环境监视您执行的所有查询并自动将任何丢失的索引添加到您的index.yaml文件的原因。

没有办法为LIKE查询建立索引,所以它根本不可用。

观看此 Google IO 会话以获得更好和更详细的解释。

于 2008-09-06T20:29:30.197 回答
77

我面临同样的问题,但我在谷歌应用引擎页面上发现了一些东西:

提示:查询过滤器没有明确的方式来匹配字符串值的一部分,但您可以使用不等式过滤器伪造前缀匹配:

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

也许这可以解决问题;)

于 2009-07-08T08:09:57.043 回答
12

Altough App Engine 不支持 LIKE 查询,请查看属性ListPropertyStringListProperty。当对这些属性进行相等测试时,测试实际上将应用于所有列表成员,例如,list_property = value测试值是否出现在列表中的任何位置。

有时,此功能可用作缺少 LIKE 查询的解决方法。例如,它可以进行简单的文本搜索,如本文所述

于 2010-01-25T22:43:56.310 回答
9

您需要使用搜索服务来执行类似于 SQL 的全文搜索查询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)

于 2013-11-25T22:21:39.170 回答
4

App Engine 在 1.7.0 版本中推出了支持数据存储的通用全文搜索服务

详情见公告

有关如何使用此功能的更多信息:https ://cloud.google.com/appengine/training/fts_intro/lesson2

于 2012-10-02T19:55:19.807 回答
3

看看 Objectify here,它就像一个 Datastore 访问 API。这个问题有一个FAQ,这里是答案

如何进行类似查询 (LIKE "foo%")
如果您在存储和搜索时颠倒顺序,您可以执行 startWith 或 endWith 之类的操作。您使用所需的起始值和刚好高于所需值的值进行范围查询。

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");
于 2011-06-01T17:01:39.267 回答
1

只需点击此处: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(...)
于 2012-06-20T02:35:55.720 回答
1

我使用 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);
于 2014-06-25T16:59:46.583 回答
1

一般来说,即使这是一篇旧文章,产生“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)
于 2015-03-19T18:09:24.337 回答
1

不可能在数据存储应用程序引擎上进行 LIKE 搜索,如果您需要在字符串中搜索单词,那么创建 Arraylist 将如何解决问题。

@Index
    public ArrayList<String> searchName;

然后使用objectify在索引中搜索。

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

这将为您提供一个列表,其中包含您在搜索中所做的世界的所有项目

于 2016-08-12T20:30:50.190 回答
0

如果LIKE '%text%'总是比较一个单词或几个单词(考虑排列)并且您的数据变化缓慢(缓慢意味着创建和更新索引的成本和性能都不是太高),那么关系索引实体(RIE)可能是答案。

是的,您必须构建额外的数据存储实体并适当地填充它。是的,您必须考虑一些限制(其中一个是 GAE 数据存储中列表属性的长度限制为 5000)。但由此产生的搜索速度快如闪电。

有关详细信息,请参阅我的RIE with Java 和 Ojbectify以及RIE with Python帖子。

于 2011-09-23T13:07:05.363 回答
0

“喜欢”通常用作文本搜索的穷人替代品。对于文本搜索,可以使用Whoosh-AppEngine

于 2011-11-26T20:47:13.893 回答