在这个答案: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')
答案 0 :(得分:0)
如果您的用例涉及搜索顶级域名,我建议将URL拆分为两个单独的属性。这样可以轻松查找具有给定TLD的所有记录,并为其他搜索提供更大的灵活性。
如果您有数百万条记录,您还可以考虑使用整数来表示每个TLD。它会减小数据的大小。
使用单个相等滤波器而不是两个不等式滤波器时,这种方法也可能会快一些。