亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用部分字符串作為過濾器搜索Go GAE數據存儲區中的條目

使用部分字符串作為過濾器搜索Go GAE數據存儲區中的條目

Go
慕容森 2021-05-03 15:52:44
我在數據存儲區中有一組條目,我想在用戶類型查詢時搜索/檢索它們。如果我有完整的字符串,這很容易:q := datastore.NewQuery("Products").Filter("Name =", name).Limit(20)但我不知道如何使用部分字符串,請幫忙。
查看完整描述

3 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

q := datastore.NewQuery("Products").Filter("Name >", name).Limit(20)

like應用引擎上沒有任何操作,但是您可以使用“ <”和“>”

例子:

'moguz'>'moguzalp'


查看完整回答
反對 回復 2021-05-10
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

嘎!我剛剛意識到您的問題是特定于Go的。我下面的代碼適用于Python。道歉。我對Go運行時也很熟悉,以后可以將其翻譯成Python。但是,如果所描述的原理足以使您朝正確的方向前進,請告訴我,我也不會打擾。


AppEngine數據存儲區不直接支持此類操作,因此您必須滾動自己的功能來滿足此需求。這是一個快速,可行的解決方案:


class StringIndex(db.Model):

    matches = db.StringListProperty()


    @classmathod

    def GetMatchesFor(cls, query):

        found_index = cls.get_by_key_name(query[:3])

        if found_index is not None:

            if query in found_index.matches:

                # Since we only query on the first the characters,

                # we have to roll through the result set to find all

                # of the strings that matach query. We keep the

                # list sorted, so this is not hard.

                all_matches = []

                looking_at = found_index.matches.index(query)

                matches_len = len(foundIndex.matches)


                while start_at < matches_len and found_index.matches[looking_at].startswith(query):

                    all_matches.append(found_index.matches[looking_at])

                    looking_at += 1


                return all_matches


        return None


    @classmethod

    def AddMatch(cls, match) {

        # We index off of the first 3 characters only

        index_key = match[:3]


        index = cls.get_or_insert(index_key, list(match))

        if match not in index.matches:

            # The index entity was not newly created, so

            # we will have to add the match and save the entity.

            index.matches.append(match).sort()

            index.put()

要使用此模型,您每次添加可能在其上進行搜索的實體時,都需要調用AddMatch方法。在您的示例中,您有一個Product模型,用戶將在上進行搜索Name。在您的Product類中,您可能具有AddNewProduct創建新實體并將其放入數據存儲區的方法。您將添加該方法StringIndex.AddMatch(new_product_name)。


然后,在從AJAXy搜索框調用的請求處理程序中,您將使用StringIndex.GetMatchesFor(name)來查看所有以中的字符串開頭的存儲產品name,并以JSON或其他形式返回這些值。


代碼內部發生的事情是,名稱的前三個字符用于包含字符串列表的實體的key_name,所有存儲的名稱均以這三個字符開頭。使用三(相對于其他數字)絕對是任意的。系統的正確數字取決于您索引的數據量??梢源鎯υ赟tringListProperty中的字符串數量有限制,但是您還想平衡數據存儲中StringString實體的數量。進行一點數學運算即可為您提供合理數量的字符。


查看完整回答
反對 回復 2021-05-10
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

如果關鍵字數量有限,則可以考慮添加部分搜索字符串的索引列表屬性。

請注意,每個實體最多只能有5000個索引,實體總大小不能超過1MB。

但是您也可以等待Go SQL運行時可以使用Cloud SQL全文搜索API。


查看完整回答
反對 回復 2021-05-10
  • 3 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號