[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/