【问题标题】:Integrating Lucene Index and Amazon AWS集成 Lucene Index 和 Amazon AWS
【发布时间】:2016-12-13 12:16:03
【问题描述】:

我有一个现有的 lucene 索引文件索引和用于执行搜索功能的 java 代码。

我想做的是在服务器上执行相同的操作,这样应用程序的用户可以简单地传递一个查询,该查询将被 java 程序作为输入参数,并针对现有索引运行它以返回文档它发生在哪里。

所有的实现都在我的本地电脑上测试过了,但我需要做的是在安卓应用中实现它。

到目前为止,我已经阅读并得出结论,将代码移植到 AWS lambda 中并使用 S3 存储文件并从 lambda 调用 s3 对象。

这是正确的方法吗?任何指向这种方法或替代建议的资源也值得赞赏。

提前致谢。

【问题讨论】:

  • 您是否考虑过使用 Elasticsearch (github.com/elastic/elasticsearch)?它是一个建立在 Lucene 之上的搜索引擎,提供了许多很棒的功能,其中之一是一个 REST API,您可以使用它来查询您的索引。

标签: java amazon-web-services amazon-s3 lucene aws-lambda


【解决方案1】:

对于小于 512MB 的 Lucene 索引,您可以尝试使用 lucene-s3directory

正如 Mark 所说,在 AWS Lambda 上,/tmp 的大小限制为 512MB。我认为拥有一个完全无服务器的搜索服务是非常可取的,但在这个限制消失之前,我们一直坚持使用 EC2 进行生产部署。在 EC2 上运行 Lucene 后,将索引存储在 S3 上就变得毫无意义,因为您可以访问 EBS 或临时存储。

如果您想尝试S3Directory,请按以下方式开始:

S3Directory dir = new S3Directory("my-lucene-index");
dir.create();
// use it in your code in place of FSDirectory, for example
dir.close();
dir.delete();

【讨论】:

    【解决方案2】:

    由于您已经在 S3 中拥有索引文件,因此您可以将 Lucene 索引阅读器指向 S3 上的某个位置。

    String index = "/<BUCKET_NAME>/<INDEX_LOCATION>/";
    String endpoint = "s3://s3.amazonaws.com/";
    Path path = new com.upplication.s3fs.S3FileSystemProvider().newFileSystem(URI.create(endpoint), env).getPath(index);
    IndexReader reader = DirectoryReader.open(FSDirectory.open(path))
    

    您可以在 env 中传递客户端凭据,也可以将角色分配给您的 Lambda 函数。

    参考: https://github.com/prathameshjagtap/aws-lambda-s3-index-search/blob/master/lucene-s3-searcher/src/com/printlele/SearchFiles.java

    【讨论】:

      【解决方案3】:

      每次您的 Android 应用程序向 AWS Lambda 发送请求(我假设是通过 AWS API Gateway)时,Lambda 函数都必须将整个索引文件从 S3 下载到 Lambda /tmp 目录(其中 Lambda 有一个512MB limit)然后对该索引文件执行搜索。这似乎效率极低,并且根据您的索引文件的大​​小,它可能会执行得非常糟糕,甚至可能不适合您在 Lambda 上的可用空间。

      我建议查看AWS Elasticsearch Service。这是一个基于 Lucene 的完全托管的搜索引擎服务,您应该能够直接从您的 Android 应用程序中查询。

      【讨论】:

      • 有没有办法在初始化期间将索引下载到/tmp目录一次,然后从/tmp中存在的索引执行所有操作。我的索引文件小于 512 MB,因此限制不会出现任何问题。索引文件不会更新,因此大小将始终保持在限制范围内。
      • @rivendellking 这将取决于您的 Lambda 容器是否被重用。您获得了多少搜索流量?每分钟至少 2 或 3 次搜索?
      • 该应用程序尚未发布,但它是一个小规模项目,所以我不希望有太多流量。我使用elasticsearch面临的问题是我编写的代码使用Executors来传递相同的以多种不同的组合进行查询。使用弹性搜索,我必须为每个查询传递 3-4 个请求并在客户端聚合响应。这即使可能会证明非常麻烦,因为它会涉及丢弃 Java 代码和将逻辑调整到弹性搜索系统中。理想情况下,我喜欢将 pc 工作流(现有索引上的 java)传输到服务器。
      • 鉴于您的流量,我怀疑您是否会看到任何容器重用。如果您需要坚持使用已经编写的代码,为什么不在 EC2 实例上运行它?
      • 在 EC2 实例上,您将有一个 EBS 卷安装到您的文件系统所在的实例上。您可以将索引保存到其中,并拍摄 EBS 快照以进行备份。您还可以定期复制到 S3 以进行备份。鉴于您说您将获得的流量有限,我认为 t2.micro 实例可能会很好。我通过阅读官方文档和尝试不同的服务来了解 AWS,并通过参加 acloud.guru 课程来填补我的知识空白。
      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多