您如何全文搜索 Amazon S3 存储桶?

Posted

技术标签:

【中文标题】您如何全文搜索 Amazon S3 存储桶?【英文标题】:How do you full text search an Amazon S3 bucket? 【发布时间】:2015-04-17 22:12:55 【问题描述】:

我在 S3 上有一个存储桶,其中有大量文本文件。

我想在文本文件中搜索一些文本。它仅包含原始数据。 每个文本文件都有不同的名称。

例如,我有一个存储桶名称:

abc/myfolder/abac.txt

xyx/myfolder1/axc.txt

&我想在上述文本文件中搜索“我是人类”之类的文字。

如何做到这一点?有没有可能?

【问题讨论】:

您必须一一请求所有文件;毕竟它不是一个关系数据库。 如果我有 10 个缺少文件。那么我的搜索会很慢吗? 是的,搜索一百万个文件需要一些时间;最好重新考虑您的选择。 AWS提供的云搜索Api呢? 【参考方案1】:

执行此操作的唯一方法是通过CloudSearch,它可以使用 S3 作为源。它使用快速检索来构建索引。这应该很好用,但要彻底检查定价模型,以确保这对您来说不会太贵。

正如 Jack 所说,另一种方法是 - 您需要将文件从 S3 传输到 EC2 并在那里构建搜索应用程序。

【讨论】:

【参考方案2】:

由于october 1st, 2015 Amazon 提供了另一种使用 Elastic Search 的搜索服务,与云搜索大致相同,您可以使用 stream data from Amazon S3 buckets。

它将与 lambda 函数一起使用,以确保发送到 S3 存储桶的任何新数据都会触发对此 Lambda 的事件通知并更新 ES 索引。

amazon doc 中的所有步骤都非常详细,带有 Java 和 javascript 示例。

概括地说,设置将数据流式传输到 Amazon ES 需要以下步骤:

创建 Amazon S3 存储桶和 Amazon ES 域 创建 Lambda 部署包。 配置 Lambda 函数。 授予将数据流式传输到 Amazon ES 的授权。

【讨论】:

【参考方案3】:

虽然不是 AWS 原生服务,但有 Mixpeek,它在您的 S3 文件上运行 Tika、Tesseract 和 ImageAI 等文本提取,然后将它们放入 Lucene 索引中以使其可搜索。

你按如下方式整合它:

    下载模块:https://github.com/mixpeek/mixpeek-python

    导入模块和您的 API 密钥:

     from mixpeek import Mixpeek, S3
     from config import mixpeek_api_key, aws
    

    实例化 S3 类(使用 boto3 和请求):

     s3 = S3(
         aws_access_key_id=aws['aws_access_key_id'],
         aws_secret_access_key=aws['aws_secret_access_key'],
         region_name='us-east-2',
         mixpeek_api_key=mixpeek_api_key
     )
    

    上传一个或多个现有的 S3 文件:

         # upload all S3 files in bucket "demo"            
         s3.upload_all(bucket_name="demo")
    
         # upload one single file called "prescription.pdf" in bucket "demo"
         s3.upload_one(s3_file_name="prescription.pdf", bucket_name="demo")
    

    现在只需使用 Mixpeek 模块进行搜索:

         # mixpeek api direct
         mix = Mixpeek(
             api_key=mixpeek_api_key
         )
         # search
         result = mix.search(query="Heartgard")
         print(result)
    

    结果可以是:

     [
         
             "_id": "REDACTED",
             "api_key": "REDACTED",
             "highlights": [
                 
                     "path": "document_str",
                     "score": 0.8759502172470093,
                     "texts": [
                         
                             "type": "text",
                             "value": "Vetco Prescription\nVetcoClinics.com\n\nCustomer:\n\nAddress: Canine\n\nPhone: Australian Shepherd\n\nDate of Service: 2 Years 8 Months\n\nPrescription\nExpiration Date:\n\nWeight: 41.75\n\nSex: Female\n\n℞  "
                         ,
                         
                             "type": "hit",
                             "value": "Heartgard"
                         ,
                         
                             "type": "text",
                             "value": " Plus Green 26-50 lbs (Ivermectin 135 mcg/Pyrantel 114 mg)\n\nInstructions: Give one chewable tablet by mouth once monthly for protection against heartworms, and the treatment and\ncontrol of roundworms, and hookworms. "
                         
                     ]
                 
             ],
             "metadata": 
                 "date_inserted": "2021-10-07 03:19:23.632000",
                 "filename": "prescription.pdf"
             ,
             "score": 0.13313256204128265
         
     ] 
    

然后你解析结果

【讨论】:

【参考方案4】:

您可以使用Filestash(免责声明:我是作者),安装您自己的实例并连接到您的 S3 存储桶。如果你有大量数据,最终给它一点时间来索引整个事情,你应该很好

【讨论】:

Filestash 是否也搜索 .gz 文件?【参考方案5】:

如果您有 EMR,则创建一个 spark 应用程序并进行搜索。我们这样做了。这将用作分布式搜索

【讨论】:

以上是关于您如何全文搜索 Amazon S3 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何授予 Amazon SES 写入您的 Amazon S3 存储桶的权限

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

如何在不下载文件的情况下搜索amazon S3存储桶中的文件内容

Amazon S3 boto:如何重命名存储桶中的文件?

删除 Amazon S3 存储桶? [关闭]

如何为 Amazon S3 存储桶配置 SSL