1

我正在构建'jobs'或'professional resume'webapp。这是我的数据模型建立:Google App Engine:实体名称的自动完成搜索

我有一份简历型号:

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)skillndb.StructuredProperty(Skill)Resume(ndb.Model)内:

class Skill(ndb.Model): 
    skill = ndb.StringProperty(required = True) 
    description = ndb.TextProperty() 

我想实现以下内容:

  • 输入文字以搜索'ski二'。然后返回与该技能相关联的Resume实体列表。
  • 此外,我们如何才能使文本输入“自动完成”,以便用户在键入时可以看到什么skill实际可用?重复搜索不存在的技能会是一种糟糕的体验。

谢谢你的任何提示。

回答

5

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

自动完成在应用程序引擎上有点难度。你可以为此使用前缀查询。我认为你应该把所有可用的技能以单独的方式存储,并将其作为较低的技巧名称。 “巨蟒” - > ndb.Key( '技能', '巨蟒')

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自动完成相关的东西。此操作将被引用为“读取”,而不是“小型”操作。 也可以通过将所有可能的前缀与单词保存到数据存储中来构建自动完成。这里有一些示例代码...

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。但是根据查询很容易在内存中对它们进行过滤。对于大数据集,您需要改进此方法。

+0

对于自动完成请参阅https://stackoverflow.com/questions/7795814/how-to-create-autocomplete-with-gae – blueCat