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

hya*_*123 1 javascript jquery google-app-engine app-engine-ndb google-cloud-datastore

我正在建立一个"工作"或"专业简历"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)
Run Code Online (Sandbox Code Playgroud)

下面是Skill(ndb.Model)skill ndb.StructuredProperty(Skill)里面的Resume(ndb.Model):

class Skill(ndb.Model):
    skill = ndb.StringProperty(required = True)
    description = ndb.TextProperty()
Run Code Online (Sandbox Code Playgroud)

我想实现以下目标:

  • 用于搜索"技能"的文本输入.然后返回Resume与该技能相关联的实体列表.
  • 此外,我们如何使文本输入"自动完成",以便用户可以skill在键入时查看实际可用的内容?重复搜索不存在的技能将是一次糟糕的经历.

谢谢你的任何提示.

Dmy*_*hyi 5

阅读关于通过结构化特性过滤这里.对于您的案例查询将如下所示: 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".
Run Code Online (Sandbox Code Playgroud)

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

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())
Run Code Online (Sandbox Code Playgroud)

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