Google App Engine:自动完成实体名称搜索

时间:2013-12-17 19:40:44

标签: javascript jquery google-app-engine google-cloud-datastore app-engine-ndb

我正在建立一个“工作”或“专业简历”webapp。这是我的数据模型设置:

我有简历模型:

class Resume(ndb.Model):
    full_name = ndb.StringProperty(required = True)
    education = ndb.StructuredProperty(Education, repeated = True)
    experience = ndb.StructuredProperty(Experience, repeated = True)
    skill = ndb.StructuredProperty(Skill, repeated = True)

以下是Skill(ndb.Model)skill ndb.StructuredProperty(Skill)的{​​{1}}:

Resume(ndb.Model)

我想实现以下目标:

  • 用于搜索“技能”的文本输入。然后返回与该技能相关联的class Skill(ndb.Model): skill = ndb.StringProperty(required = True) description = ndb.TextProperty() 个实体的列表。
  • 此外,我们如何使文本输入“自动完成”,以便用户可以看到Resume在键入时实际可用的内容?重复搜索不存在的技能将是一次糟糕的经历。

感谢您的任何提示。

1 个答案:

答案 0 :(得分:5)

了解结构化属性here的过滤。对于您的案例查询将如下所示:     Resume.query(Resume.skill.skill == 'python').fetch(10)

自动填充在app引擎上有点难度。您可以为此使用前缀查询。我认为你应该将所有可用的技能与密钥作为较低的技能名称存储在一起。 “Python” - > ndb.Key('技能','python')

def query_by_prefix(model, prefix):
  """ Returns NDB query with filter by key prefix.
  """
  prefix = str(prefix)
  return (model.query(ndb.AND(model.key >= ndb.Key(model, prefix),
                              model.key <= ndb.Key(model, prefix + u'\ufffd'))))
class Skills(ndb.Model):
   """ Save here some skills just with keys.
   """
   pass
skills = query_by_prefix(Skills, 'p').fetch(10)  # you will get up to 10 skills which starts with "p".

你应该考虑memcaching autocomplete相关的东西。此操作将被引用为“读取”,而不是“小”操作。 通过将所有可能带有单词的前缀保存到数据存储区中,也可以构建自动完成功能。这里有一些示例代码......

class Autocomplete(ndb.Model):
  """ Key here is first letter of the skill. Skills with the same letter should be saved in one entity. 
  """
  skills = ndb.PickleProperty()

# populate our Autocomplete model first.. 
all_skills = ['python', 'app-engine', 'django', 'java', 'android']
d = dict()
[d.setdefault(w[0:1], []).append(w) for w in all_skills]  # build dict like {'a': ['android', 'app-engine']}
ndb.put_multi([Autocomplete(key=ndb.Key(Autocomplete, k), skills=d[k]) for k in d.keys()])   # put all this stuff into model...

# do the query
query = 'a'
results = Autocomplete.get_by_id(query[0:1].lower())

你会在结果中看到android和app-engine。但根据查询,很容易在内存中过滤它们。对于大数据集,您需要改进此方法。