[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