AppEngine数据存储区以'查询结尾'结尾

时间:2014-02-25 12:01:32

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

在这个答案:https://stackoverflow.com/a/1554837/1135424我发现'开头'可以使用以下内容完成:

MyModel.all().filter('prop >=', prefix).filter('prop <', prefix + u'\ufffd')

它提到,要执行“结尾”查询,则需要存储字符串的反向,然后应用与上述相同的策略。

例如,如果我的当前数据是域字符串,则类似于:

domains | reverse_domain
------- | --------------
.com.io | oi.moc.
.com.eu | ue.moc.
.com.mx | xm.moc.

如果我想查询以'结尾的域名。我可以这样做

suffix = '.io'
MyModel.all().filter(
    'reverse_domain >=', suffix).filter(
    'reserve_domain <', suffix + u'\ufffd')

但是在测试时,在python命令行上进行字符串比较,我得到了这个:

>>> '.com.io'[::-1] >= '.io'
True
>>> '.com.io'[::-1] < '.io' +  u'\ufffd'
False

更改订单,首先 u'\ ufffd',然后点击后缀

>>> '.com.io'[::-1] < u'\ufffd' + '.io'
True

所以想知道当'结尾'时,除了颠倒存储数据的顺序之外, u'\ ufffd'应该先行,像这样:

MyModel.all().filter(
    'reverse_prop >=', suffix).filter(
    'reverse_prop <', u'\ufffd' + suffix)

datastore filter是否遵循python在比较字符串时所做的相同的词典排序?

基本上如何做:

SELECT domain FROM domains WHERE <domain name> LIKE CONCAT('%', domain)

例如,如果我搜索 google.com.io ,我可以获得域名 .com.io ,因此,如何获取列表以某些东西结尾的现有域/字符串?

更新

虽然测试似乎我只需要将运算符&gt; = 更改为&lt; = ,但这会给我 LIKE'%string'

suffix = '.io'[::-1]
MyModel.all().filter(
    'reverse_domain <=', suffix).filter(
    'reserve_domain <', suffix + u'\ufffd')

如果我想搜索字符串是否以我已有的某条记录结尾:

>>> assert('.com.io'[::-1] <= '.com.io'[::-1] and '.com.io'[::-1] < '.com.io'[::-1] + u'\ufffd')

>>> assert('.com.io'[::-1] <= 'google.com.io'[::-1] and '.com.io'[::-1] < 'google.com.io'[::-1] + u'\ufffd') 

>>> assert('.com.io'[::-1] <= 'gle.com.io'[::-1] and '.com.io'[::-1] < 'gle.com.io'[::-1] + u'\ufffd')

1 个答案:

答案 0 :(得分:0)

如果您的用例涉及搜索顶级域名,我建议将URL拆分为两个单独的属性。这样可以轻松查找具有给定TLD的所有记录,并为其他搜索提供更大的灵活性。

如果您有数百万条记录,您还可以考虑使用整数来表示每个TLD。它会减小数据的大小。

使用单个相等滤波器而不是两个不等式滤波器时,这种方法也可能会快一些。