首页 文章

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

提问于
浏览
3

我使用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说:

数据源可以是:具有本地数据的数组
一个String,指定一个URL
回调
本地数据可以是一个简单的字符串数组,也可以包含数组中每个项目的对象,带有标签或值属性或两者 .

2 回答

  • 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 .

    Edit

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

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

    • names_lower = bob

    • names_lower = j

    • names_lower =史密斯

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

    我也不清楚答复格式应该是什么 .

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

  • 1

    基本上同意Drew写的所有内容我发布了一个链接到my blog,其中有一个相当精细的例子,用于在数据存储区中搜索信息时自动完成选择关键字 .

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

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

相关问题