集成 Lucene Index 和 Amazon AWS
Integrating Lucene Index and Amazon AWS
我有一个现有的 lucene 索引文件索引和 java 代码来对其执行搜索功能。
我想做的是在服务器上执行相同的操作,这样应用程序的用户就可以简单地传递一个查询,该查询将被 java 程序和 运行 它针对 return 出现它的文档的现有索引。
所有实施都已在我的本地电脑上进行了测试,但我需要做的是在 Android 应用程序中实施它。
到目前为止,我已经阅读并得出结论,在 AWS lambda 中移植代码并使用 S3 存储文件并从 lambda 调用 s3 对象。
这是正确的方法吗?任何指向此方法或替代建议的资源也将受到赞赏。
提前致谢。
每次您的 Android 应用程序向 AWS Lambda 发送请求(我假设是通过 AWS API 网关)时,Lambda 函数必须将整个索引文件从 S3 下载到 Lambda /tmp目录(其中 Lambda 有一个 512MB limit),然后对该索引文件执行搜索。这看起来效率极低,并且根据索引文件的大小,它可能会执行得非常糟糕,甚至可能不适合您在 Lambda 上可用的 space。
我建议查看 AWS Elasticsearch Service。这是一个完全托管的搜索引擎服务,基于 Lucene,您应该能够直接从您的 Android 应用程序进行查询。
由于您在 S3 中已有索引文件,因此您可以将 Lucene 索引 reader 指向 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 函数。
对于小于 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();
我有一个现有的 lucene 索引文件索引和 java 代码来对其执行搜索功能。
我想做的是在服务器上执行相同的操作,这样应用程序的用户就可以简单地传递一个查询,该查询将被 java 程序和 运行 它针对 return 出现它的文档的现有索引。
所有实施都已在我的本地电脑上进行了测试,但我需要做的是在 Android 应用程序中实施它。
到目前为止,我已经阅读并得出结论,在 AWS lambda 中移植代码并使用 S3 存储文件并从 lambda 调用 s3 对象。
这是正确的方法吗?任何指向此方法或替代建议的资源也将受到赞赏。
提前致谢。
每次您的 Android 应用程序向 AWS Lambda 发送请求(我假设是通过 AWS API 网关)时,Lambda 函数必须将整个索引文件从 S3 下载到 Lambda /tmp目录(其中 Lambda 有一个 512MB limit),然后对该索引文件执行搜索。这看起来效率极低,并且根据索引文件的大小,它可能会执行得非常糟糕,甚至可能不适合您在 Lambda 上可用的 space。
我建议查看 AWS Elasticsearch Service。这是一个完全托管的搜索引擎服务,基于 Lucene,您应该能够直接从您的 Android 应用程序进行查询。
由于您在 S3 中已有索引文件,因此您可以将 Lucene 索引 reader 指向 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 函数。
对于小于 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();