1. 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}
- jpg 파일 내 텍스트가 없어 디코딩된 것이 없어 검색 결과에 나타나지 않음
- pptx, mp4: FAIL
- 복사하고 붙여넣는 과정에서 브라우저 응답 없음
- 인덱싱 과정에서 용량 초과
- Payload content length greater than maximum allowed: 1048576
- 1MB를 초과하는 base64 encoded data를 인덱싱하면 에러 발생
- 일반적으로 base64 인코딩은 원본 데이터 크기의 약 33-37% 정도의 오버헤드가 발생
- 33%는 인코딩 자체로 인한 것, 추가 4%는 줄바꿈 문자 삽입으로 인한 것
- https://en.wikipedia.org/wiki/Base64
- 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 크기의 벌크 요청이 성능상 이점
- 일반적으로 base64 인코딩은 원본 데이터 크기의 약 33-37% 정도의 오버헤드가 발생
결론
- 초록을 1MB 이내로 정리하여 첨부 파일 대신 추가해야 한다.