Imagine you're the best backend code architect and developer, who specialises in building scalable web applications using AWS Amplify. I currently have the following tables in my AWS Amplify database

type Seller
 @model
 @auth(
 rules: [
 {allow: public, provider: iam},
 {allow: owner, operations: [read, update]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 deliveryPincodes: [String!]
 products: [Product] @manyToMany(relationName: "SellerProducts")
}

type Product
 @model
 @auth(
 rules: [
 { allow: private, provider: iam },
 { allow: public, operations: [read], provider: iam },
 { allow: owner },
 { allow: groups, groups: ["Seller"], operations: [read]},
 { allow: groups, groups: ["Admin"] }
 ]
 )
{
 id: ID!
 slug: String! @index(
 name: "bySlugAndCreatedAt",
 queryField: "productsBySlugAndCreatedAt",
 sortKeyFields: ["createdAt"]
 )
 productCategoryProductsId: String! @index(name: "productsByCategory", queryField: "productsByCategory", sortKeyFields: ["createdAt"])
 category: ProductCategory @belongsTo
 sellers: [Seller] @manyToMany(relationName: "SellerProducts")
 details: [ProductDetail] @hasMany(indexName: "byProduct", fields: ["id"])
}

type ProductCategory
 @model
 @auth(
 rules: [
 {allow: private, provider: iam},
 {allow: public, operations: [read], provider: iam},
 {allow: groups, groups: ["Seller"], operations: [read]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 name: String!
 products: [Product] @hasMany
}

type ProductDetail
 @model
 @auth(
 rules: [
 {allow: private, provider: iam},
 {allow: public, operations: [read], provider: iam},
 {allow: owner},
 {allow: groups, groups: ["Seller"], operations: [read]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 productID: ID! @index(name: "byProduct", queryField: "productDetailsByProductId")
 product: Product @belongsTo(fields: ["productID"])
 fieldID: ID!
 fieldName: String!
 fieldStringValue: String
 fieldBooleanValue: Boolean
 fieldNumberValue: Float
}

The product detail represents attributes of a product. For example the details for a product that represents iPhone could look like 

{ id: "1", productID: "iphone-14pm", fieldID: "title", fieldName: "Title", "fieldStringValue": "iPhone 14 Pro Max" }
{ id: "2", productID: "iphone-14pm", fieldID: "unlocked", fieldName: "Is Unlocked?", "fieldBooleanValue": true }
{ id: "3", productID: "iphone-14pm", fieldID: "storage", fieldName: "Storage (GB)", "fieldNumberValue": 256 }
{ id: "4", productID: "iphone-14pm", fieldID: "title", fieldName: "Description", "fieldStringValue": "iPhone 14 Pro and 14 Pro Max. With Dynamic Island. Emergency SOS via satellite. Crash Detection. An innovative 48MP camera. And A16 Bionic." }

I am trying to implement a search API using Elastic Search. Here are my usecases
1. As a user I should be able to search for all the products given a search query and a user's pincode.
2. If the search query appears for products across multiple categories, I should be able to drill-down my search by category
3. Additionally, I should have some aggregate information using which I can give user contextual filter options. For example: if I am searching for mobile phones, I should see filters to filter by Operating system, storage etc (these will be represented by ProductDetail)

I'd like to use DynamoDB streams to add/update/delete to ElasticSearch. Help me architect my document structure and implement my solution.
매거진에서 최고의 백엔드 코드 아키텍트이자 개발자로, AWS Amplify를 사용하여 확장 가능한 웹 애플리케이션을 구축하는 것을 전문으로 합니다. 현재 제 AWS Amplify 데이터베이스에는 다음과 같은 테이블이 있습니다.

유형 판매자
 모델
 인증(
 규칙 [
 {허용: 공개, 공급자: IAM},
 {허용: 소유자, 작업: [읽기, 업데이트]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 배달 핀코드: [문자열!]
 products: [제품] @manyToMany(relationName: "SellerProducts")
}

제품 유형
 모델
 인증(
 rules: [
 { 허용: 비공개, 공급자: 아이암 },
 { 허용: 공개, 운영: [읽기], 공급자: iam },
 { 허용: 소유자 },
 { 허용: 그룹, 그룹: ["판매자"], operations: [읽기]},
 { 허용: 그룹, 그룹: ["관리자"] }
 ]
 )
{
 id: ID!
 슬러그: 문자열! @index(
 이름: "bySlugAndCreatedAt",
 쿼리 필드: "productsBySlugAndCreatedAt",
 sortKeyFields: ["createdAt"]
 )
 제품 카테고리 제품 ID: String! 인덱스(이름: "productsByCategory", queryField: "productsByCategory", sortKeyFields: ["createdAt"])
 카테고리: 제품 카테고리 @belongsTo
 판매자: [판매자] @manyToMany(관계명: "판매자프로덕트")
 세부 정보: [ProductDetail] @hasMany(indexName: "byProduct", fields: ["id"])
}

제품 카테고리 유형
 모델
 @auth(
 rules: [
 {허용: 비공개, 공급자: IAM},
 {allow: public, operations: [읽기], 공급자: iam},
 {allow: groups, groups: ["Seller"], operations: [읽기]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 name: 문자열!
 제품: [제품] @hasMany
}

유형 ProductDetail
 모델
 인증(
 규칙: [
 {허용: 비공개, 공급자: IAM},
 {allow: public, operations: [읽기], 공급자: iam},
 {허용: 소유자},
 {allow: groups, groups: ["Seller"], operations: [읽기]},
 {allow: groups, groups: ["Admin"]}
 ]
 )
{
 id: ID!
 productID: ID! @index(name: "byProduct", queryField: "productDetailsByProductId")
 product: 제품 @belongsTo(fields: ["productID"])
 fieldID: ID!
 fieldName: 문자열!
 fieldStringValue: 문자열
 fieldBooleanValue: 부울
 fieldNumberValue: Float
}

제품 세부 정보는 제품의 속성을 나타냅니다. 예를 들어 iPhone을 나타내는 제품의 세부 정보는 다음과 같습니다. 

{ id: "1", productID: "iphone-14pm", fieldID: "title", fieldName: "제목", "필드 문자열 값": "아이폰 14 프로 맥스" }
{ id: "2", productID: "iphone-14pm", fieldID: "unlocked", fieldName: "잠금 해제되어 있습니까?", "fieldBooleanValue": true }
{ id: "3", productID: "iphone-14pm", fieldID: "storage", fieldName: "저장용량(GB)", "fieldNumberValue": 256 }
{ id: "4", productID: "iphone-14pm", fieldID: "title", fieldName: "설명", "필드 문자열 값": "아이폰 14 프로 및 14 프로 맥스. 다이나믹 아일랜드와 함께. 위성을 통한 긴급 SOS. 충돌 감지. 혁신적인 48MP 카메라. 그리고 A16 바이오닉." }

Elastic Search를 사용하여 검색 API를 구현하려고 합니다. 제 사용 사례는 다음과 같습니다.
1. 사용자로서 검색 쿼리와 사용자의 핀코드가 주어지면 모든 제품을 검색할 수 있어야 합니다.
2. 검색 쿼리가 여러 카테고리의 제품에 대해 표시되는 경우, 카테고리별로 검색을 드릴다운할 수 있어야 합니다.
3. 또한 사용자에게 상황에 맞는 필터 옵션을 제공할 수 있는 집계 정보도 있어야 합니다. 예를 들어 휴대폰을 검색하는 경우 운영 체제, 스토리지 등을 기준으로 필터링할 수 있는 필터가 표시되어야 합니다(이러한 필터는 ProductDetail로 표시됨).

DynamoDB 스트림을 사용하여 ElasticSearch에 추가/업데이트/삭제하고 싶습니다. 문서 구조를 설계하고 솔루션을 구현하는 데 도움을 주세요.