我使用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 回答
这里有一些巧妙的技巧 . 考虑这个增强模型:
你需要让names_lower与真实字段保持同步,例如:
你可以用DerivedProperty更优雅地做到这一点 .
现在,您的查询:
这给你:
使用一个索引匹配所有3个属性
不区分大小写的匹配项
通配符后缀匹配
因此,对“smi”的查询将返回任何名称以“smi”开头的人 .
将较小的名称复制到ListProperty可启用不区分大小写的匹配,并允许我们使用一个查询搜索所有3个字段 . "\ufffd"是可能的最高unicode字符,因此它是我们子字符串匹配的上限 . 如果由于某种原因您想要完全匹配,请过滤
'names_lower =', term
.Edit :
这已经在原始解决方案中得到了解决 . 通过获取3个字段并将它们复制到单个ListProperty,我们实际上创建了一个单个索引,每个人有多个条目 . 如果我们有一个名叫Bob J Smith的人,我的索引中会有3个点击:
names_lower = bob
names_lower = j
names_lower =史密斯
这消除了在每个字段上运行不同查询的需要 .
仔细阅读the docs . 格式化jQuery的输出应该非常简单 . 您的数据源将是指定URL的字符串,您需要将响应格式化为JSON .
基本上同意Drew写的所有内容我发布了一个链接到my blog,其中有一个相当精细的例子,用于在数据存储区中搜索信息时自动完成选择关键字 .
所有这些都是在GAE中用Python完成的,并使用YUI3而不是jQuery(插入jQuery或任何其他库代替将是微不足道的) .
简而言之,这个想法是数据存储包含使用关键字索引的一组文档(使用关系索引实体) . 当用户输入要搜索的单词时,系统会使用这些文档中的关键字自动填充它们 .