【问题标题】:Full text search on Google App Engine (Java)Google App Engine (Java) 上的全文搜索
【发布时间】:2011-05-23 19:46:15
【问题描述】:

关于这个主题有几个话题,但我认为我的用例有些不同。

我想做什么:

  • 我的 GAE/J 应用程序的全文搜索组件
  • 索引大小小:25-50MB左右
  • 我不需要实时更新索引,定期重新索引就可以了
  • 这用于自动完成等,因此需要非常快(我的印象是在 Datastore 中实现倒排索引会带来相当大的延迟)

到目前为止我的策略(只是计划,还没有尝试实施任何东西):

  • 将 Lucene 与 RAMDirectory 结合使用
  • 定期 cron 作业创建索引,将其序列化到数据存储区,存储更新 ID(或时间戳)
  • 搜索 servlet 在启动时加载索引并创建 RAMDirectory
  • 对于每个请求,servlet 都会检查当前的更新 id 并根据需要重新加载索引

我主要不清楚的是如何在实例之间同步内存中的数据——这会起作用吗,还是我遗漏了什么?

另外,在我开始出现内存使用问题之前,我可以将它推多远?我在 GAE 的 RAM 配额上找不到任何内容。 (这个索引很小,但我能想到更多我想补充的东西)

当然,还有关于更好方法的想法吗?

【问题讨论】:

  • GAE 实例之间的内存是分开的,因此它们之间不会共享直接的 RAM 目录。您必须在启动时为每个实例初始化它。考虑到新的备用服务器和预热请求,这可能还不错。
  • 嗯,是的,这就是我上面概述的一部分......

标签: java google-app-engine lucene full-text-search


【解决方案1】:

如果您对定期重建没问题,并且您的索引很小,那么您当前的方法听起来基本没问题。但是,与其在线构建索引并将其序列化到数据存储区,为什么不离线构建它并使用应用程序上传呢?然后,您可以直接从磁盘存储中对其进行实例化,并推送更新,您可以部署应用的新版本。

【讨论】:

  • 我将大约每小时更新一次,因此将索引与应用程序捆绑在一起似乎不是一个好方法。
【解决方案2】:

最近GAE增加了“文本搜索”服务。看看GAE Java Text Search

【讨论】:

  • 知道如何在 GAE/J FTS API 中处理结果的分页吗?我不断收到空游标。谢谢。
【解决方案3】:

对于自动完成,也许您可​​以将每个前缀的前 N ​​个匹配项(基本上是您放在下拉菜单中的内容)存储在内存缓存中?内存缓存实体可以由数据存储中的实体支持,并在需要时重新加载。

【讨论】:

    【解决方案4】:

    嗯,从 GAE 1.5.0 开始,看起来常驻后端可用于创建搜索服务。

    当然,这些没有免费配额。

    【讨论】:

      【解决方案5】:

      App Engine 现在包含一个全文搜索 API(实验性):https://developers.google.com/appengine/docs/java/search/

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2010-12-02
        • 2010-11-20
        • 2011-10-20
        相关资源
        最近更新 更多