设计决定在大量字符串上执行多个搜索 - 谷歌应用引擎

时间:2010-08-31 19:52:27

标签: google-app-engine

以下是该方案。用户(Web环境)可以使用外语导入文档。当显示文档时,应用程序突出显示用户还不知道的单词。然后,用户可以将这些单词中的一些标记为已知,将其添加到他的字典中。

所以基本上我们有一个表示文档中单词的字符串列表,以及一组表示用户已知单词(他的字典)的字符串。现在,对于List(文档)中的每个String,我们需要找出Set中是否存在该单词。听起来很简单,但是应该如何在数据库中建模呢?

已知单词集必须是持久的,允许用户在每个会话中添加单词。这组已知单词可能会增长到数千个字符串。导入的文档可以有数百个单词。

我看到两种解决方案,它们都不能很好地扩展。我创建了一个Dictionary类,其中包含每个用户的一组已知单词。

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class UserDictionary {
    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    Long id;
    @Persistent String userId;      

    @Persistent Set<String> knownWords;
}
  1. 我可以在数据库中查询导入文档中的每个单词,以检查它是否存在于knownWords Set中。由于文档可能包含数百个单词,因此该解决方案将迫使我数百次查询数据库。

  2. 检索整个UserDictionary类,可能包含数千个单词,并快速检查文档中的每个单词(如果它存在于knownWords Set中)。检查会很快,但是我必须将整个Dictionary保留在用户会话中吃掉服务器内存,并且由于app引擎需要反序列化整个内容,因此检索成本会很高 组。

  3. 我不喜欢以上任何一种......其他任何想法?

1 个答案:

答案 0 :(得分:1)

为什么要在数据库中对此进行建模?相反,将整个文档和整个字典加载到内存中,并在那里执行。