我有许多文件上传到Amazon S3,需要根据其内容中字符串的出现情况进行搜索。我尝试了从S3存储桶下载文件并将输入流转换为字符串,然后在内容中搜索该单词的方法,但是如果有五到六个以上的文件,执行上述过程需要很长时间。请问是否有其他方法可以实现此目的?谢谢!
不行!
如果您无法从对象元数据(如文件名)推断匹配项的位置,则只能手动下载和搜索。如果您有闲置带宽,建议同时下载几个文件以加快速度。
不能!
我认为可以提高性能的方法是将文件在本地缓存,这样就不必一遍又一遍地下载文件。
你可以使用 Last-Modified
头来检查本地文件是否已更改,然后再次下载它。
user_name,age
jsrocks,13
node4life,22
esfuture,29
...
SELECT user_name FROM S3Object WHERE cast(age as int) > 20
const S3 = require('aws-sdk/clients/s3');
const client = new S3({
region: 'us-west-2'
});
const params = {
Bucket: 'my-bucket,
Key: 'target-file.csv',
ExpressionType: 'SQL,
Expression: 'SELECT user_name FROM S3Object WHERE cast(age as int) > 20',
InputSerialization: {
CSV: {
FileHeaderInfo: 'USE',
RecordDelimiter: '\n',
FieldDelimiter: ','
}
},
OutputSerialization: {
CSV: {}
}
};
我不熟悉 Amazon S3,但处理搜索远程文件的一般方法是使用indexing,索引本身存储在远程服务器上。这样,每次搜索都会使用索引来推断相对较小的潜在匹配文件数量,只有这些文件会被直接扫描以验证它们是否确实符合条件或不符条件。根据您的搜索条件和模式的复杂性,甚至可能可以完全避免直接扫描文件。
话虽如此,我不知道 Amazon S3 是否有可供使用的索引引擎,也不知道是否有补充库可以帮助你完成这项工作,但这个概念足够简单,你应该能够在不费太多力气的情况下自己实现它。
编辑:
通常,每个文件中存在的标记是被索引的。例如,如果您想搜索"foo bar",索引将告诉您哪些文件包含"foo",哪些文件包含"bar"。这些结果的交集将是同时包含"foo"和"bar"的文件。您将需要直接扫描这些文件以选择那些(如果有)其中"foo"和"bar"按正确顺序紧挨在一起的文件。
无论如何,下载到客户端的数据量都比下载和扫描所有内容要少得多,尽管这也取决于您的文件结构和搜索模式的样子。