如何使用GAE创建自动完成?

时间:2011-10-17 15:14:53

标签: google-app-engine jquery-ui google-cloud-datastore

我使用jQuery UI autocomplete widget。我也有GAE数据存储区:

class Person(db.Model):
    # key_name contains person id in format 'lastname-firstname-middlename-counter',
    # counter and leading dash are omitted, if counter=0
    first_name = db.StringProperty()
    last_name = db.StringProperty()
    middle_name = db.StringProperty()

如果用户可以输入姓氏,名字和/或中间名,我如何在自动填充小部件中搜索此人?

因此,我将用户输入字符串设为self.request.get('term')。我应该如何在我的数据存储区中搜索相同的内容(因为我需要查看每个字段,可能还有3个字段的组合值)?如何优化这样的查询? 我也不清楚答复格式应该是什么。 jQuery doc说:

  

数据源可以是:

an Array with local data
a String, specifying a URL
a Callback
     

本地数据可以是一个简单的字符串数组,也可以包含   数组中每个项目的对象,带有标签或值   财产或两者兼而有之。

2 个答案:

答案 0 :(得分:6)

这里有一些巧妙的技巧。考虑这个增强模型:

class Person(db.Model):
  first_name = db.StringProperty()
  last_name = db.StringProperty()
  middle_name = db.StringProperty()
  names_lower = db.StringListProperty()

您需要让names_lower与真实字段保持同步,例如:

p.names_lower = [p.first_name.lower(), p.last_name.lower(),
                 p.middle_name.lower()]

您可以使用DerivedProperty更优雅地完成此任务。

现在,您的查询:

term = self.request.get('term').lower()
query = Person.all()
query.filter('names_lower >=', term)
query.filter('names_lower <=', unicode(term) + u"\ufffd")

这会给你:

  • 使用一个索引匹配所有3个属性
  • 不区分大小写的匹配
  • 通配符后缀匹配

因此,对“smi”的查询将返回任何名称以“smi”开头的人。

将小写名称复制到ListProperty可启用不区分大小写的匹配,并允许我们使用一个查询搜索所有3个字段。 “\ ufffd”是最高可能的unicode字符,因此它是我们子字符串匹配的上限。如果由于某种原因您需要完全匹配,请过滤'names_lower =', term

修改

  

我应该如何在我的数据存储区中搜索相同内容(因为我需要查看)   在每个领域,可能是3个领域的组合值)?如何   优化这样的查询?

原始解决方案已经考虑到了这一点。通过获取3个字段并将它们复制到单个ListProperty,我们实际上创建了一个单个索引,每个人有多个条目。如果我们有一个名叫Bob J Smith的人,我的索引中会有3个点击:

  • names_lower = bob
  • names_lower = j
  • names_lower = smith

这消除了在每个字段上运行不同查询的需要。

  

我也不清楚回复格式应该是什么。

仔细阅读the docs。格式化jQuery的输出应该非常简单。您的数据源将是指定URL的字符串,您需要将响应格式化为JSON。

答案 1 :(得分:1)

基本同意Drew写的所有内容我发布了一个指向my blog的链接,其中包含了在数据存储区中搜索信息时自动完成选择关键字的相当详尽的示例。

所有在GAE中使用Python完成并使用YUI3而不是jQuery(插入jQuery或任何其他库代替将是微不足道的。)

不久,我们的想法是数据存储包含使用关键字索引的一组文档(使用关系索引实体)。当用户输入要搜索的单词时,系统会使用这些文档中的关键字自动填充它们。