代码之家  ›  专栏  ›  技术社区  ›  Ankit Jaiswal

如何用googleappengine实现类似Django的“contains”过滤查询?

  •  4
  • Ankit Jaiswal  · 技术社区  · 14 年前

    Employee.all().filter('name >=',value).filter('name <',unicode(value) + u'\ufffd')
    

    基本上,需求是实现一个搜索功能,所有的字符串都包含搜索字符串作为结果。

    提前谢谢。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Noctis Skytower    12 年前

    您需要做的是创建一个具有不同字符串排列的字符串列表属性,并对该列表进行查询。

    请查看appengine.ext.search.SearchableModel以获取示例实现。 nonrel-search

        2
  •  0
  •   Wooble    14 年前

    最好的方法是添加一个关键字索引,并根据您的问题执行“begins with”类型的查询,但即使这样,对于“foo bar baz”这样的实体,您也可以在搜索“ba”而不是“ar b”时进行匹配。

    这听起来像是一个伟大的工作 BigQuery ,它现在正在预览中,有一个等待访问的列表。

        3
  •  0
  •   Swizec Teller    14 年前

    最近我遇到了同样的问题,并用一个重写的过滤器函数创建了自己的模型管理器,该函数也能理解\uu包含的内容。我猜你用的是Django。

    class UserFeedManager(models.Manager):    
        def filter(self, *args, **kwargs):
            keywordargs = {}
            for (arg, val) in kwargs.items():
                if '__contains' in arg:
                    contains.append((arg.split('__')[0], val))
                else:
                    keywordargs[arg] = val
    
            result = []
            if len(contains) > 0:
                for entry in super(UserFeedManager, self).filter(*args, **keywordargs):
                    if all(map(lambda (attr, val): val in entry.__getattribute__(attr),
                               contains)):
                        result.append(entry)
            else:
                result = super(UserFeedManager, self).filter(*args, **keywordargs)
    
            return result
    

        4
  •  0
  •   Ehud    12 年前
    querySet = Entity.objects.all()
    ids = []
    for i,obj in enumerate(querySet.iterator()):
        str_to_search =obj.name
        if str_to_search.find('blahblah') != -1:
            ids.append(obj.id)
    querySet = querySet.filter(id__in = ids)