![](/img/trans.png)
[英]AppEngine: Query datastore for records with no condition for a specific property
[英]AppEngine datastore 'ends with' query
關於這個答案: 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.
如果我想查詢以“ .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
因此,想知道是否在執行' 以 ' 結尾 '時,除了反轉存儲數據的順序之外,還應該首先使用u'\\ ufffd' ,如下所示:
MyModel.all().filter(
'reverse_prop >=', suffix).filter(
'reverse_prop <', u'\ufffd' + suffix)
在比較字符串時, 數據存儲區過濾器是否遵循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')
如果您的用例涉及搜索頂級域,則建議將URL分為兩個單獨的屬性。 這樣可以輕松查找具有給定TLD的所有記錄,並為其他搜索提供更大的靈活性。
如果您有數百萬條記錄,則也可以考慮使用整數來表示每個TLD。 它將減少數據的大小。
當您使用單個相等過濾器而不是兩個不相等過濾器時,此方法也可能會更快一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.