[AWS] Cloudsearch
cloudsearch๋ elasticsearch์ ๋น์ทํ ๊ฒ์์์ง ์๋น์ค๋ค. ๋ฐ์ดํฐ๋ฅผ ๋๋ ค๋ฃ์ผ๋ฉด ์ธ๋ฑ์ฑ์ ๊ธฐ๋ฅ์ฐจ๊ฒ ํด์ค์ ๊ฒ์์ ์ํ ๋ณต์กํ ์กฐ๊ฑด์ ์ฟผ๋ฆฌ๋ฅผ ์๋๊ฒ์ ์ต์ ํ๋์ด์๋ค.
solr ๊ธฐ์ ๊ธฐ๋ฐ์ด๋ผ๊ณ ํ๋ค.
์ ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ์์ฒด๋ elasticsearch์ ์ ์ฌํ๋ค. elasticsearch๋ฅผ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด ์ฐ๋๊ฒ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ง์ ์์ ๊ฒ์ด๋ค.
๋น์ฉ
https://aws.amazon.com/ko/cloudsearch/pricing/
์จ๋๋งจ๋๋ ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค ์ธ์คํด์ค๋ฅผ ํ๋ก๋น์ ๋ฉํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๊ทธ๋์ ๋น์ฉ์ ๋๋ถ๋ถ์ ์ธ์คํด์ค ๋น์ฉ์ผ๋ก ๋๊ฐ๋ค.
๋ค๋ฅธ ๋ฆฌ์ ๋ค์ ์ฌ์ด์ฆ๊ฐ ๋ ๋ค์ํ๊ฒ ์ง์์ด ๋๋๋ฐ, ์๋ค์ํผ ์์ธ์ธ ๊ธฐ์ ์ง์ ์์ค์ด ๋ง์ด ๋ธ๋ ค์ 3๊ฐ๋ฐ์ ์๋ค..
์์ธ ๊ธฐ์ค์ผ๋ก ํ๋ฉด ์ต์ ์ฌ์ด์ฆ์ ํ๋ฌ 20๋ง์ ์ ๋ ๋๋ค.
๋๋ฉ์ธ ๋ง๋ค๊ธฐ
Cloudsearch๋ elasticsearch์์ ๋งํ๋ "์ธ๋ฑ์ค" ๋จ์๋ฅผ "๋๋ฉ์ธ"์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋๋ฉ์ธ์ ๋ง๋๋ ๊ฒ๋ถํฐ๊ฐ ์์์ด๋ค.

๋๋ฉ์ธ ์ด๋ฆ๊ณผ ์ธ์คํด์ค ํฌ๊ธฐ, ๋ ํ๋ฆฌ์นด ์๋ฅผ ์ ํด์ค๋ค.
๋น์ฉํ์๋ small์ด ์๋๊ฑฐ๊ฐ์๋ฐ ์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ง๋ค๋๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ๋ฆฌ์นด ์ซ์๋ ๊ทธ๋ฅ ํ
์คํธ์ฉ์ด๋ผ 1๊ฐ๋ก ํ์ง๋ง, ํ๋ก๋์
๋ ๋ฒจ์์๋ ๋ ๋๋ ค์ผ ํ ๊ฒ์ด๋ค.
์ธ๋ฑ์ค๋ ์ ํ ๊ตฌ์ฑ์ผ๋ก ํ๊ณ
์ธ๋ฑ์ค๋ฅผ ํ๋ํ๋ ์ ์ํด์ค๋ค.

์ฌ๊ธฐ์์ ์ ์ํ๋ ํ๋๋ค์ด ์ธ๋ฑ์ฑ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋์ผ ๋์ค์ ๊บผ๋ด์ฌ๋ ์กฐ๊ฑด์ด๋ ์ ๋ ฌ์ ๊ดด์ํ๊ฒ ๊ฑธ์ด๋ ๊ธฐ๋ฅ์ฐฌ ์ฑ๋ฅ์ผ๋ก ๊ฐ์ ธ์ฌ ์๊ฐ ์๋ค.
์ด๊ฑด ๋์ค์๋ ์ผ๋ง๋ ์ง ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ถ์ด๋ค. ๋ฌํํ๊ฒ ์ ์ํด๋ ๋๋ค.
์ ์ฑ
์ ํจ์คํ๊ณ
๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.

ํ๋ก๋น์ ๋์๋ ์๊ฐ์ด ์ ๋ฒ ๊ฑธ๋ฆฐ๋ค.
๋ฐ์ดํฐ ๋ฐ์ด๋ฃ๊ธฐ
cloudsearch๋ ์ธ๋ฑ์ค(๋๋ฉ์ธ)์ ๋ค์ด์๋ ๊ฐ๋ณ์ ๋ฐ์ดํฐ ํ๋ค์ document๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๊ฑด elasticsearch์ ๊ฐ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๊ฑด s3๋ dynamoDB๋ฅผ ํตํด์๋ ํ ์ ์์ง๋ง, aws sdk์ API๋ฅผ ์ฌ์ฉํด์๋ ํ ์ ์๋ค.
๋๋ Lambda๋ฅผ ํ๋ ๋ง๋ค๊ณ Cloudsearch ๊ถํ์ ๋ถ์ฌํด์ ๋ฐ์ด๋ฃ์ด๋ดค๋ค.
๋๊ฐ ์ด๋ฐ์์ด๋ฉด ๋๋ค.

const aws = require('aws-sdk');
const cloudsearch = new aws.CloudSearchDomain({
apiVersion: '2013-01-01',
endpoint: 'doc-test-search-wjjmz5lgcxvgmgnugupjatl7ie.ap-northeast-2.cloudsearch.amazonaws.com',
});
exports.handler = async (event) => {
await cloudsearch.uploadDocuments({
contentType: 'application/json',
documents: JSON.stringify([
{
type: "add",
id: "1",
fields: {
name: '๊ตฌ์ฐ ๊ฐ๋๊ฑด',
description: '๊ตฌ์ฐ์ ์์คํธ๋ํ ๋งค๋ ฅ์ด ๋๋ณด์ด๋ ๋ช
ํ ๊ฐ๋๊ฑด์
๋๋ค.',
price: 5000,
category_list: [1, 2],
}
},
{
type: "add",
id: "2",
fields:
{
name: '๊ตฌ์ฐ ํธ๋๋ฐฑ',
description: '๊ตฌ์ฐ์ ์์คํธ๋ํ ๋งค๋ ฅ์ด ๋๋ณด์ด๋ ๋ช
ํ ํธ๋๋ฐฑ์
๋๋ค.',
price: 6000,
category_list: [1, 5],
},
},
{
type: "add",
id: "3",
fields:
{
name: '์ค๋ฌ ํธ๋๋ฐฑ',
description: '์ค๋ฌ์ ์๋ ๊ฐ์คํ ๋งค๋ ฅ์ด ๋๋ณด์ด๋ ๋ช
ํ ํธ๋๋ฐฑ์
๋๋ค. ๊ตฌ์ฐ๋ณด๋ค ๋ซ์ฃ ',
price: 1500,
category_list: [2],
},
},
{
type: "add",
id: "4",
fields:
{
name: '๋ฉ์ข
ํค์ธ ๋ค ๋ฅํ์ด',
description: '์ ๊ฐ ์๊ฐํ๊ธฐ์ ์ต๊ณ ์ ์ธ์ด๋ Rust์
๋๋ค.',
price: 88000,
category_list: [3],
}
}
])
}).promise();
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
type์๋ add ์๋๋ฉด delete๊ฐ ๋ค์ด๊ฐ ์ ์๋ค. add๋ upsert ์์
์ ์ํํ๋ค.
id๋ ๊ฐ๊ฐ์ document๋ฅผ ๊ตฌ๋ณํ๋ ๊ณ ์ ๊ฐ์ด๋ผ ๊ผญ ๋ฃ์ด์ผ ํ๊ณ , ๋๋จธ์ง fields์ ์๋ ๊ฐ๋ค์ ๋ด๊ฐ ์ ์ํ ์ธ๋ฑ์ค ํ๋ ๊ฐ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํด์ ๋๋ฆฌ๋ฉด
๋ค์ด๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด์ ์ฟผ๋ฆฌ๋ฅผ ์ด์ ๋ฃ์ด๋ ๊ฐ๋ค์ ๊ธ์ด์ฌ ์๊ฐ ์๋ ๊ฒ์ด๋ค.
์ฟผ๋ฆฌ ์ด๋ณด๊ธฐ
AWS ์ฝ์์์ ๊ฝค๋ ๊ฐํธํ ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ ๊ธฐ ๋ค์ด๊ฐ์
"์ฟผ๋ฆฌ"์ ๊ฒ์์ด๋ฅผ ๋ฃ๊ณ ์น๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ฐ ํ๋์ ๊ฐ์ค์น๋ ์ด๊ฒ์ ๊ฒ์ ๊ณ ๋ คํด์ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ๋ฝ์์ค ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ elasticsearch์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์(score)์ ๊ธฐ๋ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
๊ฐ์ค์น ๋ถ์ฌ
'์ด๋ฆ'๊ณผ '์
๋ช
' ํ๋๊ฐ ๋ชจ๋ ์๋ค๋ฉด, ์ผ๋ฐ์ ์ผ๋ก๋ ์ค๋ช
๋ณด๋ค๋ ์ด๋ฆ์ ๋ํ ๊ฒ์ ์ค์๋๊ฐ ๋ ๋์ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ฒ์์์์ ์ฐ์ ์์๋ฅผ ์ ์์ ๋ถ์ฌํ๋ ค๋ฉด, ๊ฐ์ค์น๋ฅผ ๋ช
์ํด์ค์ผ ํ๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ '์ด๋ฆ'์ด '์ค๋ช '๋ณด๋ค 10๋ฐฐ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋๋ก ํ๋ค.

์ ์ํญ์ด ๋ ๋ฒ์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
API๋ก ๊ฒ์ํด๋ณด๊ธฐ
์ด๋ฒ์๋ aws-sdk๋ฅผ ์จ์ ์ฝ๋๋ก ํ๋ฒ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๊ฒ ๋ค.
์ฌ์ฉ๋ฒ์ด ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
search ํจ์๋ฅผ ์ฐ๊ณ , ์ฟผ๋ฆฌ์ ๊ฒ์์ด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.

๊ทธ๋ผ ์ด๋ฐ ํํ๋ก ์ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค.
์ ์์ ๋ณ๊ฐ๋ก ์ฌ์ ์กฐ๊ฑด์ ๊ฑฐ๋ ํํฐ๋ง๋ ๊ฐ๋ฅํ๋ค.
filterQuery๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ category_list์ 1์ด ์๋ ๊ฒ๋ง ํํฐ๋งํ๋ ์ฟผ๋ฆฌ๋ค.


์ด์ธ์ ๋ ์ฌํ๋ ๊ธฐ๋ฅ์ด๋ ๋ฌธ๋ฒ์ด ํ์ํ๋ค๋ฉด ์๋ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ฉด ์ข๊ฒ ๋ค.
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudSearchDomain.html#search-property
์ฐธ์กฐ
https://www.cbtnuggets.com/blog/certifications/cloud/aws-cloud-search-vs-elasticsearch-which-to-use