Python 查找与most条件匹配的实体
比如说,我有一些属性Python 查找与most条件匹配的实体,python,google-app-engine,google-cloud-datastore,gql,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') 但若不存在具有确切属性的实体,则不会给出结果。如何获取至少有两个筛选器匹配的实体,或者如果仍然不匹配,如何获取一个筛选器。。?它不需要计算值的相似性或其
color = blue
age = 22
name = Tom
在数据存储中的许多实体中,如何获得与大多数属性匹配的实体?我当然可以做到:
query.filter('color =', 'blue')
query.filter('age =', '22')
query.filter('name =', 'Tom')
但若不存在具有确切属性的实体,则不会给出结果。如何获取至少有两个筛选器匹配的实体,或者如果仍然不匹配,如何获取一个筛选器。。?它不需要计算值的相似性或其他什么,只要给我大多数过滤器尽可能匹配的实体就可以了。您基本上要求的是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)。使用每种组合简单运行七次似乎是一个解决方案,但我有三个以上的属性作为示例。。。所以我觉得它最终总是会一团糟。使用in运算符需要N个筛选器调用,其中N是属性数。运行简单查询需要2^N-1次调用。但在引擎盖下,他们都做2^N-1查询。我会用一种简单的方法来做,不需要输入操作符。您可以使用itertools.compositions来帮助管理所有不同的查询。