首页 / 知识

Google App Engine:是否可以执行Gql LIKE查询?

2023-04-14 10:42:00

Google App Engine:是否可以执行Gql LIKE查询?

Google App Engine: Is it possible to do a Gql LIKE query?

真的很简单。 在SQL中,如果我想在文本字段中搜索几个字符,则可以执行以下操作:

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

App Engine的文档没有提及如何实现这一目标,但是可以肯定这是一个足够普遍的问题?


BigTable是App Engine的数据库后端,它将扩展到数百万条记录。因此,App Engine不允许您执行任何会导致表格扫描的查询,因为对于填充良好的表格而言,性能可能会令人恐惧。

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

无法为LIKE查询建立索引,因此根本无法使用。

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


我遇到了同样的问题,但是我在Google App Engine页面上发现了一些问题:

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

1
2
3
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查询的方法。例如,如本文所述,它可以进行简单的文本搜索。


您需要使用搜索服务来执行类似于SQL LIKE的全文本搜索查询。

Gaelyk提供了特定于域的语言来执行更加用户友好的搜索查询。例如,以下摘录将找到标题为fern的最新书籍中的前十本书
类型完全匹配thriller的流派:

1
2
3
4
5
6
7
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的匹配运算符=~编写为Like。
它还支持distance(geopoint(lat, lon), location)之类的功能。


App Engine在1.7.0版中启动了一种通用的全文本搜索服务,该服务支持数据存储。

公告中的详细信息。

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


在这里看看Objectify,它就像一个数据存储访问API。具体有一个关于此问题的常见问题解答,这是答案

How do I do a like query (LIKE"foo%")
You can do something like a startWith, or endWith if you reverse the order when stored and searched. You do a range query with the starting value you want, and a value just above the one you want.

1
2
String start ="foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start +"\\uFFFD");

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

1
2
@Index
    public ArrayList<String> searchName;

然后使用objectify搜索索引。

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

这将为您列出所有包含您在搜索中所做的世界的项目


通常,即使这是一个过时的帖子,产生" LIKE"或" ILIKE"的一种方法是从"> ="查询中收集所有结果,然后在python(或Java)中循环搜索包含您所需要内容的元素 正在寻找。

假设您要过滤给定q ='luigi'的用户

1
2
3
4
5
6
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)

我使用GAE Datastore低级Java API对此进行了测试。 我,完美地工作

1
2
3
4
5
6
7
    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);

只需按照这里:
init.py#354"> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/init.py#354

有用!

1
2
3
4
5
6
7
8
9
10
11
12
13
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(...)

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


如果LIKE '%text%'总是与一个单词或几个单词进行比较(认为排列),并且您的数据变化缓慢(缓慢地意味着创建和更新索引的代价并不昂贵-从价格和性能两个方面来说)都不会过高,那么Relation Index Entity (RIE)可能是答案。

是的,您将必须构建其他数据存储实体并适当地填充它。是的,您需要解决一些约束(GAE数据存储区中list属性的长度限制为5000个)。但是结果搜索很快。

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


执行查询字符搜索

最新内容

相关内容

猜你喜欢