2012-01-10 99 views
2

說我有,看起來實體有點像這樣:谷歌應用程序引擎 - 關鍵字搜索+排序的其他屬性

class MyEntity(db.Model): 
    keywords   = db.StringListProperty() 
    sortProp   = db.FloatProperty() 

我有一個過濾器,通過這樣做了關鍵字搜索:

query = MyEntity.all()\ 
       .filter('keywords >=', unicode(kWord))\ 
       .filter('keywords <', unicode(kWord) + u"\ufffd")\ 
       .order('keywords') 

這很好。我遇到的問題是,如果我嘗試使用'sortProp'命令:

   .order('sortProp') 

排序無效。我知道爲什麼 - 文件明確表示,這是不可能的,使用了多值屬性平等過濾器時,該排序順序將被忽略(從谷歌文檔):

的一個重要警告是既具有平等查詢過濾器和多值屬性上的排序順序。在這些查詢中,排序 訂單被忽略。對於單值屬性,這是一個簡單的 優化。每個結果都將具有相同的屬性值, 因此結果不需要進一步排序。但是,多值 屬性可能具有其他值。由於忽略排序順序爲 ,因此與應用排序順序相比,查詢結果可能以不同的順序返回 。 (恢復下降排序順序 將是昂貴的,並且需要額外的指標,而這個用例是 罕見,所以查詢規劃離開它關閉。)

我的問題是:沒有人知道一個很好的解決方法爲這個?有沒有更好的方法來做一個關鍵字搜索,以規避這種限制?我真的很想結合使用關鍵字和其他屬性的排序。我能想到的唯一解決方案是在查詢後對列表進行排序,但如果這樣做的話,我失去了對查詢進行偏移的能力,如果數據集很大,我甚至可能無法獲得排序順序最高的結果。

感謝您的提示!

+0

如果全文檢索是你是什麼之後,你可能想上申請到委託人的測試人員計劃爲新的API:https://docs.google.com/a/google.com/spreadsheet/viewform?formkey= dEdWcnRJUXZ2VGR3YmVsT1Q1WVB2Smc6MQ – proppy 2012-01-10 10:38:47

回答

1

而不是做前綴匹配,適當記號化,莖和規範你的字符串,並在其上做相等比較。

+0

這最終成爲最簡單的方法,並且運作良好。 – 2012-01-11 03:21:39

2

解決方法1: 應用所產生的關鍵詞算法,那麼你就不用做了對比查找。

解決方法2: 存放在單獨的實體組(「表」)中的所有唯一關鍵字。從這個組中找到符合您標準的關鍵字。然後用keywords IN [kw1, kw2, ...]進行查詢。確保匹配關鍵字的數量不是太大,例如,你可以只選擇第一10

解決方法3:在應用端的項目 重排列表

解決方法4:使用 爲IndexTank全文本搜索,或者申請@proppy提及的「Trusted Tester Program」。

+0

+1我會去沒有2. – 2012-01-10 14:26:57