我正在创建一个使用某些AWS服务的项目(出于培训目的)。
现在大家都知道,AWS有很多不同的服务,它需要一些有关如何使用它们以及可以使用它们的知识。这就是为什么我在这里发布问题:
我的想法
我想创建一个应用程序,用户可以在其中上传他们的PDF /图像,然后用AWS Textract
处理它们,然后能够以一种聪明的方式搜索其文件。
现在的诀窍是:
因此,在阅读了许多文档之后,这里就是我使用AWS Textract
和AWS CloudSearch
提出的解决方案
客户将其文档上传到我的服务。然后,该文档将由AWS Textract
保存和处理,并将输出存储在数据库中。
搜索
现在,这是我不确定的地方。我希望用户能够搜索他的私人文档。我一直在研究cloudsearch
,但是当文档如此不同和独特时,我不是100%肯定它的功能。
所以我想我的问题是搜索这些唯一文档的最佳方法是什么?
答案 0 :(得分:2)
在我什至尝试回答您的问题之前,需要注意一些事项:
所以我想我的问题是搜索这些独特内容的最佳方法是什么 文件?
首先,Textract以以下格式提供JSON输出:
"BlockType": "LINE",
"Confidence": 99.71240997314453,
"Text": "Previous Employer: None",
"Geometry": {…}
这意味着CloudSearch看到的字段是“文本”,而没有看到“以前的雇主”作为字段,而只是文本字符串的一部分。 (我会回到这里)。
您还应注意,与其他OCR一样,Textract也不是完美的,因此您应该预料到一定数量的错误,例如上面的文本字段可能读为
"Text": "Previous Employee: None"
它也可能以您意想不到的方式拆分或连接事物。因此,您可能最终得到两个单独的LINE块,分别是“ Previous Employer:”和“ None”。
关于隐私,单个CloudSearch域没有人员身份数据或人员Bs数据的概念。只有数据。
您可以在Lambda或API网关中执行某些操作,这些操作可能会限制某些字段的查询或结果,但不会将人员隐藏为人员B的数据。此外,由于我们使用的是Textract,因此所有操作都会在仍然是“文本”字段。
您唯一的选择是为每个用户拥有一个单独的CloudSearch域。只要您拥有100个或更少的客户,并且您没有其他CloudSearch Domains来做其他事情,这是真正的可能性,因为AWS将每个帐户的Domains数量限制为100。有关更多信息,请参阅Understanding Amazon CloudSearch Limits。< / p>
尽管我们处于CloudSearch限制的主题,但是每个文档只能有200个字段。即使是很小的文档,也可能导致Textract JSON响应包含200多个字段。由于“几何”下的所有字段,单个LINE块具有18个字段。因此,您可能需要遍历Textract生成的任何数据,以将对您无用的字段删除,然后再将其上传到CloudSearch。
所以要进行实际搜索。您实际上只有一个要搜索的字段,即“文本”。这意味着您将无法索引任何上传的文档,这将影响查询响应时间。
您可以执行以下类型的请求:
按字段搜索(匹配):
q=Previous Employer: None&q.options={fields: ['Text']}
按字段搜索(包含):
(phrase field=Text 'Previous Employer')
通过自由文本(单词)搜索:
q=Employer
按自由文本搜索(短语):
q="Previous Employer"
草率搜索(单词之间的距离):
q="Previous None"~2
还有更多的文本搜索示例here,但我想说明的是,您将只能进行文本搜索。
但是同样,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结果(或仅仅是Text和Geometry)的单个块。
这样,您可以按userId限制搜索,返回用户整个文档并使用Geometry数据突出显示。
它还允许在User上建立索引,并允许他们按上传文件的名称(可以是另一个索引)进行搜索。
有点痛苦,因为使用多个可能不相邻的单词进行搜索,仍然需要您找到包含所有文本的巨大字符串,并且您需要遍历jsonStrings以获得Geometry数据进行突出显示。
这为CloudSearch之外的搜索留下了很多处理过程,所有搜索都必须由诸如API Gateway / Lambda之类的代理来代理,以确保人们无法对非自己的数据进行搜索。