簡體   English   中英

AppEngine數據存儲區“以”結尾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM