본문 바로가기

카테고리 없음

OpenSearch ingest attachment plugin test result

1. ingest-attachment plugin 설치

ref. https://opensearch.org/docs/latest/install-and-configure/additional-plugins/ingest-attachment-plugin/

$ docker exec -it opensearch-node /bin/bash
$ ./bin/opensearch-plugin install ingest-attachment
$ exit
$ docker-compose restart

 

2. index 생성

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "description": { "type": "text" },
      "category": { "type": "keyword" },
      "creator": { "type": "keyword" },
      "created_at": { "type": "date" },
      "attachment1": { "type": "binary" },
      "attachment2": { "type": "binary" }
    }
  }
}

 

3. ingest pipeline 설정

PUT _ingest/pipeline/attachment_pipeline
{
  "description": "Extract attachment contents",
  "processors": [
    {
      "attachment": {
        "field": "attachment1",
        "target_field": "attachment1_content"
      }
    },
    {
      "attachment": {
        "field": "attachment2",
        "target_field": "attachment2_content"
      }
    }
  ]
}
  • Attachment processor는 파일의 내용을 추출하여 'text' 타입의 'attachment1_content.content' 필드에 저장
  • 'text' 타입 필드는 기본적으로 표준 분석기(standard analyzer)를 사용하여 토큰화됨

 

4. document 인덱싱

POST /my_index/_doc?pipeline=attachment_pipeline
{
  "title": "제목",
  "description": "설명",
  "category": "구분",
  "creator": "작성자",
  "created_at": "작성일자",
  "attachment1": "Base64 인코딩된 첨부 파일 1 내용",
  "attachment2": "Base64 인코딩된 첨부 파일 2 내용"
}

e.g.

POST /my_index/_doc?pipeline=attachment_pipeline
{
  "title": "hwp 파일과 txt 파일",
  "description": "네트워크관리사 2급 필기 요약 hwp 파일, 보고서를 효율적으로 줄이는 방법 txt 파일을 첨부하였습니다.",
  "category": "samples",
  "creator": "John Doe",
  "created_at": "2024-11-10T13:00:00",
  "attachment1": "0M8R4KGxGuEAAAAAAAAAA....",
  "attachment2": "...."
}

 

 

5. 첨부 파일 내용 검색

GET /my_index/_search
{
  "query": {
    "multi_match": {
      "query": "검색할 키워드",
      "fields": ["attachment1_content.content", "attachment2_content.content"]
    }
  }
}

 

 

테스트 결과

  • pdf, xlsx, docs: SUCCESS
    • 이미지 등 제외하고 텍스트는 디코딩되어 검색 결과에 정상적으로 나타남

  • jpg, hwp: FAIL
    • jpg 파일 내 텍스트가 없어 디코딩된 것이 없어 검색 결과에 나타나지 않음
      • jpg -> "attachment1_content": {"content_type": "image/jpeg", "content_length": 0}
    • hwp 파일은 텍스트가 있어도 디코딩된 것이 없어 검색 결과에 나타나지 않음
      • hwp -> "attachment1_content": {"content_type": "application/x-hwp-v5", "content_length": 0}

  • pptx, mp4: FAIL
    • 복사하고 붙여넣는 과정에서 브라우저 응답 없음
    • 인덱싱 과정에서 용량 초과
      • Payload content length greater than maximum allowed: 1048576

  • 1MB를 초과하는 base64 encoded data를 인덱싱하면 에러 발생
    • 일반적으로 base64 인코딩은 원본 데이터 크기의 약 33-37% 정도의 오버헤드가 발생
    • base64 인코딩 시 원본 크기의 4/3배가 되므로 768 KB까지 원본 파일 첨부 가능
      • 한글(1글자당 2-3바이트)로 약 314,572 글자, A4 용지(한 장에 약 1,500-2,000자)로 약 180 페이지
      • 영어(1글자당 1바이트)로 786,432 글자이며, A4 용지(한 장에 약 1,500-2,000자)로 약 449 페이지
    • 참고
      • default request body size limit은 100 MB이고 그 중 attachment 필드마다 1MB 할당 가능한 상황
      • 일반적으로 5-15MB 크기의 벌크 요청이 성능상 이점

 

결론

  • 초록을 1MB 이내로 정리하여 첨부 파일 대신 추가해야 한다.