2

我正在创建一个使用某些 AWS 服务(用于培训目的)的项目。

现在大家都知道 AWS 有很多不同的服务,它需要一些关于如何使用它们以及可以将它们用于什么的知识。这就是为什么我在这里发布问题:

我的想法

我想创建一个应用程序,用户可以在其中上传他们的 PDF/图像,然后对其进行处理AWS Textract,然后能够以智能的方式搜索他们的文档

现在这里的诀窍是:

  • 所有文档的结构都不同
  • 应用程序的每个用户都有自己的文档(应该是私有的)

因此,在阅读了很多文档后,我想出了使用AWS TextractAWS CloudSearch

在此处输入图像描述

客户将他们的文件上传到我的服务。然后保存和处理该文档,AWS Textract并将输出存储在数据库中。

搜索

在此处输入图像描述

现在,这是我怀疑的地方。我希望用户能够搜索他的私人文档。我一直在研究,cloudsearch但是当文档如此不同和独特时,我不能 100% 确定它的功能。

所以我想我的问题是搜索这些独特文档的最佳方法是什么?

4

1 回答 1

3

在我什至可以尝试回答您的问题之前,有一些事情需要注意:

所以我想我的问题是搜索这些独特文档的最佳方法是什么?

首先,Textract 提供以下格式的 JSON 输出:

"BlockType": "LINE",
      "Confidence": 99.71240997314453,
      "Text": "Previous Employer: None",
      "Geometry": {…}

这意味着 CloudSearch 将看到的字段是“文本”,它不会将“以前的雇主”视为字段,而只是文本字符串的一部分。(我会回到这个)。

您还应该注意,与任何其他 OCR 一样,Textract 并不完美,因此您应该预料到一定数量的错误,例如,上面的文本字段可能被解读为

"Text": "Previous Employee: None"

它也有可能以您意想不到的方式拆分或连接事物。因此,您最终可能会得到两个单独的 LINE 块,分别是“Previous Employer:”和“None”。

在隐私方面,单个 CloudSearch 域没有 person As 数据或 person Bs 数据的概念。只有数据。

您可以在 Lambda 或 API Gateway 中执行某些操作,这些操作可能会限制某些字段的查询或结果,但这不会隐藏人员 B 的数据。另外,因为我们使用的是 Textract,所以所有内容都将在该字段下“文本”无论如何。

您唯一的选择是为每个用户设置一个单独的 CloudSearch 域。只要您有 100 个或更少的客户并且您没有其他 CloudSearch 域用于其他事情,这是一个真正的可能性,因为 AWS 将每个账户的域数量限制为 100。有关更多信息,请参阅了解 Amazon CloudSearch 限制

虽然我们讨论的是 CloudSearch 限制,但每个文档只能有 200 个字段。即使是一个小文档也可以生成一个包含 200 多个字段的 Textract JSON 响应。由于“几何”下的所有字段,单个 LINE 块有 18 个字段。因此,您可能需要遍历 Textract 生成的任何数据,以在将其上传到 CloudSearch 之前删除对您没有任何用处的字段。

所以要实际搜索。您实际上只有一个字段可供搜索,即“文本”。这意味着您将无法索引任何上传的文档,这将影响查询响应时间。

您可以执行以下类型的请求:

  1. 按字段搜索(匹配):

    q=Previous Employer: None&q.options={fields: ['Text']}

  2. 按字段搜索(包含):

    (phrase field=Text 'Previous Employer')

  3. 按自由文本(单词)搜索:

    q=Employer

  4. 按自由文本(短语)搜索:

    q="Previous Employer"

  5. 马虎搜索(单词之间的距离):

    q="Previous None"~2

这里有更多文本搜索的示例,但我要说明的是,您将只能进行文本搜索。

但同样来自 Textract 的数据结构是一个问题,因为所有这些查询都会返回相同的内容:

"BlockType": "LINE",
      "Confidence": 99.71240997314453,
      "Text": "Previous Employer: None",
      "Geometry": {…}

它不会返回文档中的下一行,因为它具有相同的字段名称,并且在技术上将是一个单独的文档。

如果您获取 Textract 结果并创建一个全新的文档,则可以解决很多问题(您需要考虑如何准确管理此工作流程)。

潜在的文件格式:

{
  "id":   "somethingUnique",
  "fields": {
    "title": "FileName",
    "user": ["UserId"],
    "wholeText": "Giant concatenated string of all text from Textract"
    "page1": ["jsonString1","jsonstring2","etc"],
    "page2": ["jsonString1","jsonstring2","etc"],
    "originalDocImage": [bytes]
  }
}

其中每个 json 字符串是来自 Textract 结果的单个块(或只是文本和几何)。

这样,您可以通过 userId 限制搜索,返回用户整个文档并使用几何数据突出显示它。

它还允许对用户进行索引,并允许他们按他们上传的文件的名称进行搜索(可能是另一个索引)。

有一点痛苦,因为使用可能不相邻的多个单词进行搜索,仍然需要您找到所有文本的巨大字符串,并且您需要遍历 jsonStrings 以获取要执行的几何数据突出显示。

这为 CloudSearch 之外的搜索留下了很多处理,并且所有搜索都必须由 API Gateway/Lambda 之类的东西代理,以确保人们无法对不属于他们自己的数据进行搜索。

于 2019-11-19T17:54:28.977 回答