我有一个现有的lucene索引文件索引和用于执行搜索功能的java代码。
我想要做的是在服务器上执行相同的操作,以便应用程序的用户可以简单地传递一个查询,该查询将被java程序作为输入参数,并针对现有索引运行它以返回文档它发生的地方。
所有的实现都已在我的本地电脑上测试过,但我需要做的是在Android应用中实现它。
到目前为止,我已阅读并总结了在AWS lambda中移植代码并使用S3存储文件并从lambda调用s3对象。
这是正确的方法吗?任何指向这种方法或其他建议的资源也会受到赞赏。
提前致谢。
答案 0 :(得分:3)
每当您的Android应用向AWS Lambda发送请求时(我假设通过AWS API网关),Lambda函数必须将整个索引文件从S3下载到Lambda / tmp目录(其中Lambda具有{{3} })然后对该索引文件执行搜索。这似乎非常低效,并且取决于索引文件的大小,它可能执行得非常糟糕,甚至可能不适合Lambda上可用的空间。
我建议调查512MB limit。这是一个完全托管的搜索引擎服务,基于Lucene,您应该可以直接从Android应用程序进行查询。
答案 1 :(得分:0)
由于您已在S3中拥有索引文件,因此可以指示您的Lucene Index阅读器指向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函数。
答案 2 :(得分:0)
对于小于512MB的Lucene索引,您可以尝试使用lucene-s3directory。
就像Mark所说的那样,在/tmp
上,AWS Lambda上的内存限制为512MB。我认为拥有完全无服务器的搜索服务是非常可取的,但是在此限制消失之前,我们一直将EC2用于生产部署。一旦在EC2上运行Lucene,一旦可以访问EBS或临时存储,就将索引存储在S3上变得毫无意义。
如果您想尝试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();