【问题标题】:Google App Engine: autocomplete search for entity nameGoogle App Engine:自动完成实体名称搜索
【发布时间】:2014-01-05 17:58:53
【问题描述】:

我正在构建一个“工作”或“专业简历”网络应用。这是我设置的数据模型:

我有一个简历模特:

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)Resume(ndb.Model) 中的@:

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

我想实现以下目标:

  • 用于搜索“技能”的文本输入。然后返回与该技能关联的Resume 实体列表。
  • 此外,我们如何使文本输入“自动完成”,以便用户在输入时可以看到skills 实际可用的内容?反复寻找不存在的技能会是一种糟糕的体验。

感谢您的任何提示。

【问题讨论】:

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


    【解决方案1】:

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

    在应用引擎上自动完成有点困难。您可以为此使用前缀查询。我认为您应该将所有可用的技能存储在单独的类型中,并将键作为小写技能名称。 "Python" -> ndb.Key('Skills', '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".
    

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2012-08-26
    • 2014-07-14
    相关资源
    最近更新 更多