【发布时间】:2014-02-25 12:01:31
【问题描述】:
关于这个答案:https://stackoverflow.com/a/1554837/1135424 我发现“starts with”可以使用以下方式完成:
MyModel.all().filter('prop >=', prefix).filter('prop <', prefix + u'\ufffd')
它提到要执行“ends with”查询需要存储字符串的反转,然后应用与上述相同的策略。
例如,如果我当前的数据是域字符串,例如:
domains | reverse_domain
------- | --------------
.com.io | oi.moc.
.com.eu | ue.moc.
.com.mx | xm.moc.
如果我想查询以 '.io' 结尾的域,我应该这样做:
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
所以想知道在执行 'ends with' 时,除了颠倒存储数据的顺序之外,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”,那么,如何获取以某事结尾的现有域/字符串?
更新:
虽然测试似乎我只需要将运算符 >= 更改为 ,这给了我 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')
【问题讨论】:
-
你必须在搜索它之前反转后缀,因为索引中的文本也被反转了。
-
你的意思是
'.com.io'[::-1] >= '.io'[::-1]和'.com.io'[::-1] < '.io'[::-1] + u'\ufffd' -
对。您实际上只是在反向列上进行前缀搜索,因此您想使用与startswith“相同的技术”来搜索“oi”。
-
我做了一些测试,除了反转后缀和数据之外,我似乎还必须将
>=运算符更改为<=。
标签: python google-app-engine python-2.7 google-cloud-datastore