[Elasticsearch] ๊ธฐ๋ณธ ์ฟผ๋ฆฌ
์๋ผ์คํฑ์์น๋ฅผ ๋ญ๋๋ฌธ์ ์ฐ๋? ๊ฒ์ํ๋ ค๊ณ ์ฐ์ง.
์๋ผ์คํฑ์์น๋ ์ฟผ๋ฆฌ API๋ฅผ ํตํด ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ๋ค์ ๋น ๋ฅด๊ฒ ์ฝ์ด์ฌ ์ ์๋ค.
์กฐ๊ฑด์ด๋ ์ ๋ ฌ๋ ์์ ๋กญ๊ฒ ๊ฑธ ์ ์๊ณ , ์ด๋ป๊ฒ ์ง๋ ์ฌ๋งํ๋ฉด ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ค.
์ด ํฌ์คํธ์์๋ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋จ์ ๋ช๊ฐ์ง๋ฅผ ๋จผ์ ์๊ฐํ๋๋ก ํ๊ฒ ๋ค.
์ข๋ ๋ณต์กํ๊ฒ ์กฐํฉํ ์๋ ์๊ณ ์ด๋ฐ์ ๋ฐ ์ปค์คํ
๋ ๋ง์ง๋ง, ์ผ๋จ ๊ธฐ๋ณธ๋ถํฐ.
https://www.elastic.co/guide/en/elasticsearch/reference/current/term-level-queries.html
์ฟผ๋ฆฌ๋ "GET /์ธ๋ฑ์ค๋ช /_search"๋ "POST /์ธ๋ฑ์ค๋ช /_search"์ ํํ๋ก ํธ์ถํ ์ ์๋ค.
Restful API๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ์์ด์ง๋ง ๊ฐ๋จํ๊ฒ ํ ์คํธ๋ฅผ ํ ๋๋ ํค๋ฐ๋์ Dev Tool์ด ํธ๋ฆฌํ๊ณ ๊ด์ฐฎ๋ค.
ํญ ๋งจ ์๋์ ์๋ค.
์ ์ฒด ์กฐํ ์ฟผ๋ฆฌ: match_all
๊ทธ๋ฅ ์ ๋ถ๋ค ์ฝ์ด์ค๊ณ ์ถ๋ค๋ฉด ๊ทธ๋ฅ ์ด๋ ๊ฒ ์๋ฉด ๋๋ค.
๋ฑ ์ด๊ฒ๋ง์ ์ํ ๊ธฐ๋ฅ์ด๋ค.
POST products2/_search
{
"query": {
"match_all": {}
}
}
๊ธฐ๋ณธ์ ์ผ๋ก query ํ๋ผ๋ฏธํฐ๋ก ์กฐ๊ฑด์ ์ ๋ฌํ๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ์ ๋ฟ๋ ค์ค ๊ฒ์ด๋ค.

๋จ์ ์ผ์น ์ฟผ๋ฆฌ: term, terms
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
term์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๋จ์ํ ์กฐ๊ฑด์ ์ค ํ๋๋ค.
๋ฑ ์กฐ๊ฑด์ 1:1๋ก ์ผ์นํ๋ ๊ฐ๋ง์ ๊ฐ์ ธ์จ๋ค.
๊ฐ๋ น ๋ค์๊ณผ ๊ฐ์ด ์ด๋ค๋ฉด
shop_id๊ฐ 1์ธ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๊ฐ๋ฅผ ์ง์ ํ๋ ค๋ฉด term ๋์ terms๋ฅผ ์จ์ ๋ฐฐ์ด๋ก ๊ฐ์ ์ฃผ๋ฉด ๋๋ค.

๋ค๋ง, ์ด๊ฑด ๊ทธ๋ฅ ์ ๋ฐ ๋จ์ ์๋ณ๊ฐ๋ง์ ๋งค์นญ์ํค๊ธฐ ์ํ๊ฑฐ์ง, ํ
์คํธ๊ฒ์์ฉ์ ์๋๋ค.
ํ
์คํธ์ ๋์ด์ฐ๊ธฐ๊ฐ ํฌํจ๋๊ธฐ๋ผ๋ ํ๋ฉด, ๊ธฐ๋ํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ๊ธฐ ์์ํ๋ค.
๋ถ๋ช
ํ '์์ํ ์ดํธ'๊ฐ ์์์๋ ์ฐพ์ง ๋ชปํ๋ ๊ฒ์ ์ ์ ์๋ค.
๋จ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก๋ ๊ฐ์ ธ์ค๊ธด ํ๋ค.

ํ ์คํธ ๊ฒ์ ์ฟผ๋ฆฌ: match
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html
match๋ ํ ์คํธ๊ฒ์์ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ค.
์. ์ ๊ณผ ๋ค๋ฅด๊ฒ ์ด์ "์์ํ ์ดํธ"๋ก ๊ฒ์์ ํด๋ ๊ฒ์์ด ์ ๋๋ค.
ํ์ง๋ง ์์ ์ผ์นํ์ง ์๋ "๊ณต์ฐ๋น ์ดํธ"๋ ๊ฒ์์ด ๋๋ค!
์ด๊ฑด match๊ฐ ๊ทธ๋ฅ ์กฐ๊ฑด๊ฐ์ ๊ทธ๋๋ก ๋ณด๋ด๋๊ฒ ์๋๋ผ, ๋ด๋ถ์ ์ผ๋ก analyze ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ด๋ค.
analyzer์๋ ์ฌ๋ฌ๊ฐ์ง ๋ ์ด์ด๊ฐ ์ถ๊ฐ๋ ์ ์๊ณ , ๊ทธ๊ฑด ๋ ์ฐจํ ์์ธํ ๋ค๋ฃฐ ์์ ์ด์ง๋ง, ์ผ๋จ ์ง๊ธ์์๋ ๋ฌธ์์ด์ '๊ณต๋ฐฑ'์ ๊ธฐ์ค์ผ๋ก ์๋ผ์ ๊ทธ ๊ฐ๊ฐ์ ๋จ์ด๋ค์ ๊ฒ์์ ์ฌ์ฉํ๋ค๋ ๊ฒ๋ง ์์๋์.
๊ทธ๋์ '์์ํ ์ดํธ'๋ฅผ '์์ํ'๊ณผ '์ดํธ'๋ก ๋ถ๋ฆฌํด์ ๊ฒ์์ ์ฌ์ฉํ ๊ฒ์ด๊ณ , '๊ณต์ฐ๋น ์ดํธ'์ '์ดํธ'์ ์กฐ๊ฑด์ด ์ผ์นํด์ ๊ฒ์์ ๋ ธ์ถ๋๊ฒ ๋ ๊ฒ์ด๋ค.
ํ ์คํธ ๊ฒ์ ์ฟผ๋ฆฌ2: match_phrase
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html
์ด๊ฑด ์ข๋ ์ ํ๋ ๋์ ํ ์คํธ ๊ฒ์์ ์ํ ๊ธฐ๋ฅ์ด๋ค.
๊ทธ๋ฅ ์ผํธ๋ฅผ ์ณ๋ ์ดํธ๊ฐ ํฌํจ๋ ๋ ์๋ค์ด ์ ๋ถ ๋์ค๋ ๊ฒ์ด๋

๋์ด์ฐ๊ธฐ๊ฐ ํฌํจ๋ ํ ์คํธ๊ฐ ์ ๋์ค๋ ๊ฑด match์ ๊ฐ๋ค.

ํ์ง๋ง match๊ฐ ๋ง ๋จ์ด์ ์์๋ฅผ ๋ค์์ด๋ ์์์ ๋ณ๊ฐ๋ก ๋ค ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๋ณ๊ฐ๋ก

match_phrase๋ ๊ฐ์ ธ์ค์ง ์๋๋ค.
์ด๊ฑด ์๊ฒฉํ ์๋ฏธ์์์ ๋ฌธ์์ด ํฌํจ๋ง์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์คํธ ๋ณตํฉ๊ฒ์ ์ฟผ๋ฆฌ: multi_match
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
์ด๊ฑด match๋ ๊ฑฐ์ ๋๊ฐ๊ธด ํ๋ฐ, ํ๋์ ๊ฐ์ผ๋ก ์ฌ๋ฌ ํ๋์ ๋์์ ์กฐ๊ฑด์ ์ ์ ์๋ค๋๊ฒ ํธ๋ฆฌํ ์ ์ด๋ค.
fields๊ฐ ์กฐ๊ฑด์ผ๋ก ์ผ์ ํ๋ ๋ชฉ๋ก์ด๊ณ , query๊ฐ ๊ฒ์ํ ๊ฐ์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด
'์์ํ'๊ณผ '์ธํ
๋ฆฌ์ด'๊ฐ ๋ถ๋ฆฌ๋ผ์ ๊ฐ๊ฐ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ฌ๋๊ณ , product_name์ด๋ category_names ์ค ํ๋๋ง ์ผ์น๋ผ๋ ๊ฒ์๊ฒฐ๊ณผ์ ํฌํจ์ด ๋๋ค.
ํ ์คํธ ๊ฒ์ ์ฟผ๋ฆฌ3: query_string
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
์ด๊ฑด ์ข๋ ์๊ฒฉํ ํํ๋ก ์ฌ๋ฌ ๊ฒ์์ด ์กฐ๊ฑด์ ๊ฑธ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก match์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ง

๊ฒ์ ํ ์คํธ ๋ด์ OR์ด๋ AND ๋ฑ์ ํค์๋๋ฅผ ์ฝ์ ํ ์ ์๋ค๋ ๊ฒ์ด ๋ค๋ฅด๋ค.

OR๋ AND ๋ฑ์ ๊ตฌ๋ถ์๋ก ๋ถ๋ฆฌ๋ ํ
์คํธ๋ค์ ๋ณ๋๋ก ๋ถ์๊ณผ์ ์ ๊ฑฐ์ณ์ ์ ๋ฌ๋๋ค.
ํ ์คํธ ์ ๋์ฌ ๊ฒ์ ์ฟผ๋ฆฌ: prefix
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html
์ด๊ฑด ํน์ ๋ฌธ์์ด๋ก ์์ํ๋ ๊ฒ์ ์กฐ๊ฑด์ผ๋ก ๋ถ์ฌํด์ฃผ๋ ์ฟผ๋ฆฌ๋ค.
๊ฒ์์์ ์๋์์ฑ๊ฐ์๊ฑธ ๊ตฌํํ๊ธฐ ๊ด์ฐฎ๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด "์์ํ"์ ์ ๋ฌํ๋ค๋ฉด
"์์ํ"์ผ๋ก ์์ํ๋ "์์ํ ์ดํธ"๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํ ์คํธ ์์ผ๋์นด๋ ์ฟผ๋ฆฌ: wildcard
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
์ด๊ฑด match ๊ฒ์๊ธฐ๋ฅ์ ์์ผ๋์นด๋ ๊ธฐ๋ฅ์ด ํ์ฅ๋ ๊ฒ์ ์ฟผ๋ฆฌ๋ค.
๋ค๋ฅธ๊ฑด ๊ฑฐ์ ๊ฐ์ง๋ง, ๋จ์ผ ์์ผ๋์นด๋ ?์ ๋ณต์ ์์ผ๋์นด๋ *๋ฅผ ํน์ํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋๊ฒ ๋ค๋ฅด๋ค.
๊ทธ๋์ ๋ง์ฝ "์?ํ"์ผ๋ก ๊ฒ์์ ์๋ํ๋ค๋ฉด
๊ฐ์ด๋ฐ ๋ซ๋ฆฐ ํ๊ธ์๊ฐ "์"์ผ๋ก "์์ํ"์ด ์กฐ๊ฑด์ ๊ฑธ๋ ค์ "์์ํ ์ผํธ"๊ฐ ๊ฒ์๋๊ฒ ๋๋ค.
๋ณต์ ์์ผ๋์นด๋ *๋ฅผ ์ฌ์ฉํ๋ฉด "์์ํ"๊ณผ "์๋์ปฌํ"์ด ๋๋ค ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.

์ ์ฐํ ๊ฒ์๊ธฐ๋ฅ์ด ํ์ํ๋ค๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ๋ค.
๋ฒ์ ๊ฒ์ ์ฟผ๋ฆฌ: range
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
range๋ ๋ง ๊ทธ๋๋ก ๋ ์ง๋ ์๊ฐ๊ฐ์ ๋ํ ํน์ ๋ฒ์๋ฅผ ์กฐ๊ฑด์ผ๋ก ์ฃผ๋ ๊ฒ์ด๋ค.
gte(<=), lte(>=), gt(<), lt(>)๋ก ๋ฒ์๊ฐ์ ์ง์ ๋ง ํด์ฃผ๋ฉด ๋๋ค.
๋ค์์ product๊ฐ 2 ์ด์ 3 ์ดํ์ธ ๊ฒ๋ง ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ๋ค.

ํ์ธ ์ฟผ๋ฆฌ: exists
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html
์ด๊ฑด ํน์ ํ๋๊ฐ ์กด์ฌํ๋์ง๋ฅผ ์กฐ๊ฑด์ผ๋ก ๊ฑธ๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๋๋จํ๊ฑด ์๋๊ณ , null์ด๋ ๋น ๋ฐฐ์ด๋ง ์๋๋ฉด ์กด์ฌํ๋ ๊ฑธ๋ก ์น๋ค.

๋ถ์ ์กฐ๊ฑด์ ๊ฑธ๋ฉด ์กด์ฌํ์ง ์๋ ๊ฒ๋ง ๊ฐ์ ธ์ฌ ์๋ ์๋ค.
bool์ด๋ must_not์ ๋ณตํฉ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ์์์ธ๋ฐ, ์ ๊ฑด ๋์ค์ ์ค๋ช
ํ๊ฒ ๋ค.
๋์ถฉ ๊ธฐ๋ณธ์ ์ด๊ฒ๋ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค.
๋๋จธ์ง๋ ์ฒ์ฒํ ์ดํด๋ณด์.
์ฐธ์กฐ
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
https://findstar.pe.kr/2018/01/19/understanding-query-on-elasticsearch/