【问题标题】:Find entity that matches the most criteria查找符合最多条件的实体
【发布时间】:2011-01-11 20:53:48
【问题描述】:

我有一些属性,比如说

color = blue
age = 22
name = Tom

在数据存储中的许多实体中,我怎样才能获得与大多数属性匹配的实体?当然可以:

query.filter('color =', 'blue')
query.filter('age =', '22')
query.filter('name =', 'Tom')

但是,如果不存在具有确切属性的此类实体,则不会给出结果。如何获得至少两个过滤器匹配的实体,或者如果仍然不起作用,一个过滤器..?它不需要计算值的相似性或其他东西,只需给我大多数过滤器尽可能匹配的实体。

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore gql


    【解决方案1】:

    您基本上是在要求 OR 运算符,这对于单个查询是不可能的。我认为你有两个选择:

    1) 通过继承 MultiQuery 来添加 OR 运算符。这仍然会在后台执行多个查询,并且排序和游标将不起作用。

    2) 预先计算三个属性的所有可能组合,将它们放入 StringListProperty,然后使用 IN 运算符。例如,您的模型如下所示:

    m.col_age_name = ['c:blue, a:22', 'c:blue, n:Tom', \
                      'a:22, n:Tom', 'a:22, c:blue, n:Tom']
    

    然后你运行过滤器:

    q.filter('col_age_name IN', ['c:blue, a:22', 'c:blue, n:Tom', 'a:22, n:Tom'])
    

    此解决方案存在问题:(a) 它在后台执行多个查询,(b) 您需要运行 3 次(1、2 和 3 属性一次),(c) 它不支持顺序或游标,以及 (d) 它使管理数据变得一团糟。唯一的好处是它将您需要进行的过滤器调用的最大数量从 7 个减少到 3 个。

    这显然比它的价值更麻烦。我只会运行这个简单的查询七次,它有缺点 (a) 和 (c) 而不是 (d)。

    【讨论】:

    • 用每种组合运行它七次似乎是一个解决方案,但我拥有的属性不止我举的三个例子......所以我觉得它总是会以混乱。
    • 使用 IN 运算符需要 N 个过滤器调用,其中 N 是属性数。运行简单查询需要 2^N-1 次调用。但在幕后,他们都做了 2^N-1 次查询。我会用简单的方法来做,没有 IN 运算符。您可以使用 itertools.combinations 来帮助管理所有不同的查询。 docs.python.org/library/itertools.html#itertools.combinations
    猜你喜欢
    • 2016-10-24
    • 2014-08-12
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2018-04-13
    相关资源
    最近更新 更多