查找符合最多条件的实体

时间:2011-01-11 20:53:48

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

我有一些属性,让我们说

color = blue
age = 22
name = Tom

在数据存储区中的许多实体中,如何获得与大多数属性匹配的实体?我当然可以这样做:

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

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

1 个答案:

答案 0 :(得分:2)

您基本上要求的是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)您需要运行三次(一次运行1,2和3个属性),(c)它不支持订单或者游标,以及(d)它使数据管理变得混乱。唯一的好处是它可以减少您需要从7到3进行的最大过滤器调用次数。

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