1

我有一個User實體類,看起來像這樣:搜索在谷歌App Engine的現有用戶

@Entity 
public class User { 

    @Id 
    private Long id; 
    @Index 
    private String username; 
    private Long dateOfBirth; 
    // More fields... 
} 

我想創建一個搜索數據存儲的所有User實體或多或少匹配的API方法搜索文本並返回可能的結果列表。例如;

public CollectionResponse<User> searchForUser(@Named("text") searchText searchText) { 
    // Some code here. 
} 

此API方法將用於Android應用程序,其中用戶一次輸入用戶名一個字符。每次輸入一個字符時,我都會使用searchForUser()方法運行它們到目前爲止輸入的內容,並返回可能的建議列表。

有沒有人有任何建議如何開始使用這種方法,如果你以前做過?謝謝。

+0

壞主意。您會將所有用戶名都公開給任何在您的應用中甚至不是註冊用戶的用戶。 –

+0

@AndreiVolgin我沒有打擾到它的問題,但我有額外的參數,確保只有註冊用戶可以調用該方法(以及我的API中的所有方法)。不過謝謝你的關心! – Micro

+0

您不應該向註冊用戶顯示用戶名。 (1)削弱安全性。 (2)削弱了用戶的隱私。 –

回答

2

根據您的使用情況,您將始終返回一定數量的結果(例如5)。因此,您可以在用戶名屬性上使用不等過濾器運行標準查詢,並對返回的結果數量設置限制。確保您在用戶名上添加排序順序。例如,如果用戶鍵入「an」,則將搜索所有使用用戶名> =「an」的實體。

當您獲得結果時,請刪除那些不以用戶輸入開頭的結果。例如,

andre - add to response 

andrei - add to response 

boris - do not add and stop - all subsequent entries won't match 

現在你知道只有兩個結果匹配用戶輸入。

+0

「username> =」「不等式過濾器如何正確工作?它如何完全匹配......你知道嗎? – Micro

+0

它像其他任何篩選器上的索引屬性一樣工作。 「a」將在「b」之前等。 –

+0

您可以使用第二個不等式過濾器來改善這一點。來自Objectify FAQ:'ofy().load().type(MyEntity.class).filter(「field> =」,start).filter(「field <」,start +「\ uFFFD」);' – stickfigure