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

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

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

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

abc/myfolder/abac.txt

xyx/myfolder1/axc.txt

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

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

【问题讨论】:

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

标签: amazon-web-services amazon-s3


【解决方案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 索引中以使其可搜索。

      你按如下方式整合它:

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

      2. 导入模块和您的 API 密钥:

         from mixpeek import Mixpeek, S3
         from config import mixpeek_api_key, aws
        
      3. 实例化 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
         )
        
      4. 上传一个或多个现有的 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")
        
      5. 现在只需使用 Mixpeek 模块进行搜索:

             # mixpeek api direct
             mix = Mixpeek(
                 api_key=mixpeek_api_key
             )
             # search
             result = mix.search(query="Heartgard")
             print(result)
        
      6. 结果可以是:

         [
             {
                 "_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 应用程序并进行搜索。我们这样做了。这将用作分布式搜索

        【讨论】:

          猜你喜欢
          • 2018-06-07
          • 1970-01-01
          • 2015-07-10
          • 2019-08-27
          • 2016-08-25
          • 1970-01-01
          • 2017-06-08
          • 1970-01-01
          • 2011-06-26
          相关资源
          最近更新 更多