๐ฅ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค/Redis
[Redis] ch.19 RediSearch๋ก ๋ฐ์ดํฐ ์ฟผ๋ฆฌํ๊ธฐ
by OR15A
2024. 1. 29.
https://github.com/HongHyeongJu/StudySpace/blob/main/database/Redis/Redis_%ED%95%99%EC%8A%B5%EB%85%B8%ED%8A%B8_06.md
์ ๋ฐ๋ฏธ Redis : ๊ฐ๋ฐ์๋ฅผ ์ํ Redis ์๋ฒฝ ๊ฐ์ด๋
ch.19 - RediSearch๋ก ๋ฐ์ดํฐ ์ฟผ๋ฆฌํ๊ธฐ
๋ชจ๋ ์๊ฐ
- ๋ชจ๋
- Redis์ ๋ก๋ฉํ ๋ณ๋์ ํ๋ก๊ทธ๋จ
- ๋ชจ๋์ ๋ก๋ฉํ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ช
๋ น๋ค์ ์ถ๊ฐํจ
- ์ฝ๊ณ ๊ฐ๋จํ๊ฒ Redis์ ๋ฅ๋ ฅ์ ํฅ์์ํฌ ์ ์์
- ์ด ๊ฐ์์์ ๋ค๋ฃฐ ๋ชจ๋ : RedisJSON, RediSearch ๋ชจ๋
RedisJSON
- Redis ์์์ JSON ์ฝ๊ฒ ์ ์ฅํ๊ณ ๋ค๋ฃฐ ์ ์์
- ์ง์ง JSON ๋ฐ์ดํฐ ์ ์ฅ ๊ฐ๋ฅํจ : ์ค์ฒฉ ๋ฐฐ์ด, ์ค์ฒฉ ๊ฐ์ฒด, ์ํ๋ ๊ฑฐ์ ๋ชจ๋ JSON ๊ตฌ์กฐ๋ฌผ ์ ์ฅ ๊ฐ๋ฅ
RediSearch
- Redis ๋ฐ์ดํฐ ์ ์ฅ์ ์ ์ฒด์ ๊ฑธ์ณ ์๋ฒฝํ ํ
์คํธ ๊ฒ์๊ณผ ๋ค์ํ ํค์ ๋ํ ์ฟผ๋ฆฌ ๋ฐ ํํฐ๋ง ๊ธฐ๋ฅ ์ ๊ณต
- ์๋ง์ ํด์๋ค์ ๋์์ ์ดํด๋ณด๊ณ , ํน์ ํํฐ๋ง ๊ธฐ์ค์ ์ด์ฏํ์ฌ ์์ฃผ ๊ตฌ์ฒด์ ์ธ ํด์๋ฅผ ์ฐพ์ ์ ์์
Redis ์ฝ์ด์ Redis Stack
- REDIS
- Redis ์ฝ์ด
- ์์ฃผ ๊ธฐ๋ณธ์ ์ธ Redis ๋ฒ์
- ์์ฃผ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ํ๋ค๋ง ํฌํจ๋์ด ์์
- Redis Stack
- ๊ธฐ๋ณธ์ ์ธ Redis ์ฌ๋ณธ๊ณผ ํจ๊ป ๊ทธ ์์ ๋ฏธ๋ฆฌ ๋ก๋ฉ๋ ๋ง์ ๋ชจ๋๋ค์ ํจ๊ป ๋ฐ๊ฒ ๋จ
- RediSearch, RedisJSON, ๊ทธ๋ฆฌ๊ณ RedisGraph๋ RedisTimeSeries, RedisBloom ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ชจ๋ ํฌํจ๋จ
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ Redis Stack์ ์ ํธํจ(์ถ๊ฐ์ ์ธ ๋ง์ ์ค์ ์ ํ์ง ์์๋ ์ด ๋ชจ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ด๋ฏธ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ)
ํ๋ก๋์
ํ๊ฒฝ์์ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ
- ์์์ ๊ธ์ ์ ์ผ๋ก ๋งํ Redis Stack์ ๊ฐ์ ์ด๋ฐ์ ์ค์นํ์ง ์์ ์ด์
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ๋ฐฉ์, ํน์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก๋ ํ๋ก๋์
ํ๊ฒฝ์์ Redis๋ฅผ ์คํํ๋ ๋ฐฉ์์ ๋ฐ๋ผ์๋ ๋ชจ๋์ ์ฌ์ฉํ์ง ๋ชปํ ์ ์๊ธฐ ๋๋ฌธ์
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ๋ Redis์ ํ๋ก๋์
์ธ์คํด์ค์ ์ ์ํด์ผํจ -> ๋ฌธ์ ๋ ๊ทธ ์ธ์คํด์ค๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋๋
[1] AWS๋ Google Cloud๊ฐ ์ฐ๋ฆฌ ๋์ ์ Redis์ ์ฌ๋ณธ์ ์คํํ๋๋ก ์์ฒญํ๊ธฐ
- ์ฅ์ : ๊ด๋ฆฌํ Redis์ฌ๋ณธ์ด๋ผ๊ณ ๋ถ๋ฆ, AWS๋ Google Cloud๋ ์ค์ , ๋ณด์ ์
๋ฐ์ดํธ, ์ผ๋ฐ ์
๋ฐ์ดํธ, ๋ฐฑ์
๋ฑ์ Redis ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฑธ ์ฒ๋ฆฌํด์ค
- ๋จ์ : Redis ๋ชจ๋์ ์ฌ์ฉํ ์ ์์
- ๋ง์ผ AWS๋ Google Cloud์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ค๋ฉด ์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ๋ค์ ๋ชจ๋ ์ดํดํ๋ ๊ฒ ์ค์ํจ
- ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฌผ์ ์์กดํด์ผํจ
[2] ์ง์ Redis๋ฅผ ์คํํ๊ธฐ, ์ฆ ์ง์ ๋ฒ์ถ์ผ ๋จธ์ ์ด๋ ์ปจํ
์ด๋๋ฅผ ๋ง๋ค๊ณ Redis๋ฅผ ์คํ
- ์ฅ์ : ๋ชจ๋์ ์ฌ์ฉํ ์ ์์(์์ ๋กญ๊ฒ RedisJSON์ด๋ RediSearch๋ฅผ ๋ก๋ฉ, ์ํ๋ ์ด๋ ๋ชจ๋์ด๋ ์ฌ์ฉํ ์ ์์)
- ๋จ์ : ๋ง์ ์ถ๊ฐ์ ์ธ ์ค์ ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ํด์ผ ํจ. ์ต์ด ์ค์ + ์ด ๋ชจ๋๋ค์ ์ค์นํ๊ณ ๋ณด์ ์
๋ฐ์ดํธ๋ฅผ ํ๊ณ ๋ฐฑ์
๋ฑ๋ ์ฒ๋ฆฌํดํจ.
- ๋ชจ๋ ์ธํ๋ผ๋ฅผ ์ค์ ํ๋ ๋ฐ๋ง ์ถ๊ฐ ๊ฐ๋ฐ ์๊ฐ์ด ๋ง์ด ๋ฆ.
[3] Redis๋ผ๋ ํ์ฌ์ ์์งํด์ ํ์ฌ๊ฐ ์ฐ๋ฆด ๋์ ํด์ Redis๋ฅผ ์คํํ๋๋ก ํ๊ธฐ
- ๊ฐ์ ์ด๋ฐ์ ์ฐ๋ฆฌ๋ redis.com์ผ๋ก ๊ฐ์ ๊ณ์ ์ ๋ฑ๋ก ๋ฐ ๋์๋ณด๋์์ ๋ฌด๋ฃ Redis ์ธ์คํด์ค๋ฅผ ์์ฑํจ
- ๋ฌด๋ฃ Redis ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๊ทธ ์ธ์คํด์ค๋ ์ค์ ๋ก AWS๋ Google Cloud ๋๋ Microsoft Azure์์ ์์ฑ๋์์
- ์ฆ ๊ทธ Redis ์ธ์คํด์ค๋ ์ฌ์ ํ ๊ทธ ํด๋ผ์ฐ๋ ์ ๊ณต์ฌ์์ ์คํ๋๋ ๊ฒ
- ์ด๊ฒ๋ค์ ๊ด๋ฆฌํ ์ธ์คํด์ค (์ฌ์ฉ์๊ฐ ๋ณด์์
๋ฐ์ดํธ๋ ๋ฐฑ์
๋ฑ์ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์)
- ์ ์ผํ ์ฐจ์ด์ : ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๊ด๋ฆฌํจ (AWS๋ Google Cloud๊ฐ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒ ์๋๋ผ)
- ์ฅ์ : ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
- Redis ์ฌ๋ณธ์ ์คํํ๊ธฐ ์ํด redis.com์ ์ด์ฉํ๋ค๋ฉด ์ฌ์ ํ AWS๋ Google Cloud์์ ํธ์คํ
๋๋ฏ๋ก
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ์ธ๋ถ ํด๋ผ์ฐ๋ ์ ๊ณต์ฌ๋ฅผ ์ด์ฉํ ํ์ ์์ด ์ง์ ๊ทธ ํ์ฌ๋ค์ ์ฐ๊ฒฐ๋ ์ ์์
๋ชจ๋
๊ฒ์ ๊ฐ์
- RediSearch
- RediSearch๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ํ ํด์๋ก ๊ตฌ์ฑ๋ ์ปฌ๋ ์
์ ์์๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์
- RediSearch๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ 2๋จ๊ณ
- [1] ์ธ๋ฑ์ค ์์ฑ
- ์ธ๋ฑ์ค๋ ๊ฒ์ํ๋ ค๋ ๋ค์ํ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ง์ํ๋ ์ผ์ข
์ ๋ฐ์ดํฐ ์ ํ
- ๊ฒ์ํ๋ ค๋ ์ด๋ค ๋ ์ฝ๋ ๊ทธ๋ฃน์ ๋ํด ํ ๋ฒ๋ง ์ธ๋ฑ์ฑ์ ํ๋ฉด ๋จ
- ์ธ๋ฑ์ค ๋ง๋ค๊ธฐ
- ์ฒซ ๋ฒ์งธ๋ ์ฐ๋ฆฌ๊ฐ ๊ฒ์ํ ๋ ์ฝ๋๋ฅผ ์ง์
- ์ ๋์ด๋ฅผ ์ ๊ณตํด์ ๊ทธ๊ฒ์ ์ง์ ํ๊ธฐ = ์ด๋ค ๋ฌธ์์ด๋ก ์์๋๋ ๋ชจ๋ ํด์๋ฅผ ๊ฒ์ํ๋ค๋ ์๋ฏธ
- ex) 'items#a1' 'items#b2' : items#๋ผ๋ ํค๋ฅผ ๊ฐ์ง ๋ชจ๋ ํด์๋ฅผ ๊ฒ์ํ ์ ์์
- RediSearch๋ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ๋๋ง๋ค ์ ๋์ด๋ฅผ ์ ๊ณตํด์ ๊ทธ๊ฑธ ์ง์
- RediSearch๋ ๊ทธ ํด์, ์ด๋ฆ, ์์, ๊ฐ๊ฒฉ์ ๊ดํ ์์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ฒ ๋จ
- ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์๋ค๋ฉด -> ์ํ๋ ํ์๋งํผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์
- ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ํน์ ํ ์ด๋ฆ, ์์, ๊ฐ๊ฒฉ ๋ฑ์ ๊ฐ์ง ํญ๋ชฉ์ ๊ฒ์ ๊ฐ๋ฅ
- FT.CREATE
- [2] ์ธ๋ฑ์ค ์ฌ์ฉ
์ธ๋ฑ์ค
์ธ๋ฑ์ค ๋ง๋ค๊ณ ์ฌ์ฉํ๊ธฐ
SEARCH ๋ช
๋ น์ด
- ๋ช
๋ น์ด
FT.SEARCH
๊ด๋ จ ๊ณต์ ๋ฌธ์
- redis.io/commands/ft.search
- ํ์ด์ง๋ฅผ ๋ด๋ฆฌ๋ค ๋ณด๋ฉด Parameters์น์
์ ์ฟผ๋ฆฌ์ ๊ดํ ์น์
์์
- ์ค๋ช
์ Query Syntax๋ฅผ ๊ฒ์ํ๋ฉด ๋ณ๋์ ํ์ด์ง ์ด๋์ด ๊ฐ๋ฅํจ
- https://redis.io/docs/interact/search-and-query/query/
- ์ฟผ๋ฆฌ ์์ฑ ์ ์ด๋ ค์์ด ์์ ๋ ์ด ๋ฌธ์๋ฅผ ์ฐพ์๋ณด๊ธฐ!
- ๊ฒ์์ ์์
@name:(fast car)
, @color:{blue}
, @year:[1955 1980]
- 1955๋ 1980๋
์ ์์ฑ๋ ์๋์ฐจ์ด๋ฉด์ + ์๊น์ด blue์ธ ์๋์ฐจ ์ฐพ๊ธฐ znjfl
- FT.SEARCH idx:cars '@year:[1955 1980] @color:{blue}'
- ์ฟผ๋ฆฌ ์์ฑ์ ์ฃผ์์
- ์ฟผ๋ฆฌ๋ ํญ์ ๋ฐ์ดํ ์์ ์์ฑํด์ผํจ
- ์ค๋ น ๋ฌธ์์ ํน๋ณํ ํ์๋์ด ์์ง ์์๋ ํญ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ ์์ ๋ฃ๊ธฐ
- ๋ฌธ์์ ์์์์๋ ์ฟผ๋ฆฌ์ ๋ฐ์ดํ ํ์๋ฅผ ์๋ตํ ๋ถ๋ถ๋ ์์ด์ ์กฐ์ฌํ๊ธฐ
- ์ฟผ๋ฆฌ ์์ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ์๋ ๋ฐ๊นฅ์ชฝ ๋ฌธ์์ด์ ์ฌ์ฉํ์ง ์์ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๊ธฐ(์ฟผ๋ฆฌ ๋ฐ๊นฅ์ '', ์ฟผ๋ฆฌ ์์ชฝ์ "")
์ซ์ํ ์ฟผ๋ฆฌ
- @year:[1955 1980]
- @year:[(1955 (1980]
- @year:[1955 +inf]
- @year:[-inf 1955 ]
- -@year:[1955 1980]
ํ๊ทธ ์ฟผ๋ฆฌ
- @color:{blue}
- ์์์ด blue์ธ ๋ ์ฝ๋ ์ฐพ๊ธฐ
- @color:{blue}
- ์์์ด blue๊ฐ ์๋ ๋ ์ฝ๋ ์ฐพ๊ธฐ
- @color:{red|blue}
- red๊ฑฐ๋ blue์ธ ๋ชจ๋ ๋ ์ฝ๋
- @color:{light\blue}
- 'light blue'๋ผ๋ ๋ฌธ์์ด์ด ์์ ๋
- ์ฃผ์์
- ๋ถ์ฉ์ด๋ฅผ ํฌํจํ๋ฉด Redis๋ ์๋์ผ๋ก ํํฐ๋งํ์ฌ์ ์ ๊ฑฐํจ
- ex) @cities:{to | a | or} => Redis๋ @cities:{} ๋ก ์ธ์ํจ
- ํ
์คํธ ์ฟผ๋ฆฌ์์๋ ๋ง์ฐฌ๊ฐ์ง์
ํ
์คํธ ์ฟผ๋ฆฌ
- ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นจ
- ํด์ํ๋์ ์๋ ํ
์คํธ ๋ฟ๋ง ์๋๋ผ ์ค์ ์ฟผ๋ฆฌ ํ
์คํธ๋ ์ฝ๊ฐ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋จ
- ๋ชจ๋ ๋ค์ํ ๋ถ์ฉ์ด๋ค์ด ์ญ์ ๋จ ex)a, the
- ์คํ
๋ฐ (stemming)์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฟผ๋ฆฌ์ ์ ์ฉํจ
- ๊ฒ์์ ์ํด ์ด๋ค ์ด์ด๋ฅผ ์ฐ๋ ์ง ์ ๋์ด๋ ์ ๋ฏธ์ด๊ฐ ์์ ์ ์๋ ๋ณต์กํ ๋จ์ด์ ๊ฒฝ์ฐ์๋ ๊ทธ ๋จ์ด์ ๋ ํํ ํํ๋ก ์ถ์ฝ๋จ
- ์ดํด๋ฅผ ๋๋ ๋งํฌ snowballstem.org/demo.html
- ๊ฒ์์ด๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ฒ
- ์ฌ์ฉ์๊ฐ ๋จ์ด ์์ ์ ๋์ด๋ฅผ ์ถ๊ฐํด๋ ๊ทธ ๋จ์ด์ ์ ๋์ด๊ฐ ์๋ ๋ ํํ ๋ฒ์ ์ ๋งค์นญํ๊ฒ ๋ ๊ฒ์
- fast
- @๋ฅผ ์ฐ์ง ์์ผ๋ฉด ํด๋น ๋ฌธ์์ด์ ์ด์ฉํด์ ํ์
์ด TEXT๋ก ํ์๋ ๋ชจ๋ ํ๋์ ๊ฑธ์ณ ๊ฒ์ํจ
- @name:(fast car)
- @name:(fast|car)
- fast OR car (+ fast AND car)
- -@name:(fast)
- fast๋ฅผ ํฌํจํ์ง ์์ ๊ฒ
ํผ์ง ๊ฒ์
- ํผ์ง ๋งค์นญ์๋ ํผ์ผํธ(%) ๊ธฐํธ๋ฅผ ์ฌ์ฉํจ
- ์์ผ๋ ์นด๋๊ฐ ์๋๊ณ , ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฒ๊ณผ ๊ทธ๋ค์ด ์ค์ ๋ก ๊ฒ์ํ๋ ค๋ ๊ฒ ๊ฐ์ด์ ๋ถ์ผ์นํ๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ
- ex) car๋ฅผ ๊ฒ์ํ๋ ค๋ ์ฌ์ฉ์๊ฐ ์ค์๋ก dar๋ผ๊ณ ์
๋ ฅํจ => ๋ฌธ์ 1๊ฐ๊ฐ ๋ถ์ผ์นํจ
- ๋ฌธ์ 1๊ฐ ๋ถ์ผ์น๋ ๊ฒ์
FT.SEARCH idx:cars '@name:(%dar%)'
FT.SEARCH idx:cars '@name:(%gast%)'
- ๋ฌธ์ 2๊ฐ ๋ถ์ผ์น๋ ๊ฒ์
FT.SEARCH idx:cars '@name:(%%dar%%)'
- ์์ชฝ์ ์ต๋ 3๊ฐ๊น์ง % ๊ธฐํธ๋ฅผ ๋ฃ์ ์ ์์
- ์คํ์ ํ๋ ๊ฐ๋ฅผ ๋ฃ์ด๋ ์ค๋งํธํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฒ
์ ๋์ด ๊ฒ์
- ์ ๋์ด ๊ฒ์์ ์ต์ํ ๋ฌธ์๊ฐ 2๊ฐ ์์ด์ผ ํจ
- ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ: f, a, b*
fa*
๋ผ๊ณ ์
๋ ฅํ๋ฉด ์๋์ผ๋ก ์ฟผ๋ฆฌ๊ฐ ํ์ฅ๋์ด fast, far, fact, fawn, fantastic ๋ฑ์ด ํฌํจ๋จ
๊ฒ์์ด ์ ์ฒ๋ฆฌ ๊ธฐ์ค
- ๊ฒ์ ์์
๋จ๊ณ
- [1] ์๋์์ฑ ์ต์
๋ฆฌ์คํธ๋ฅผ ํ์ํ๋ ๋จ๊ณ
- ์ ํ์ฌํญ
- fa๋ผ๊ณ ์
๋ ฅํ๋ฉด far, fast ๋ฑ์ ์๋์์ฑ์ ํ์
- [2] ์ฌ์ฉ์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ ์ถํ๋ ๋จ๊ณ
- ์ฌ์ฉ์๊ฐ fast ๋ผ๊ณ ์
๋ ฅํ๋ฉด ํผ์ง๊ฒ์ ์ฌ์ฉ
- ์ฌ์ฉ์์ ์คํ ์ฒ๋ฆฌ ex)
fast fasty fast car
- ๊ฒ์๋ก์ง์ ๋ง๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ๋ผ ์ต์ ์ด ๋ค๋ฅด๋ค (159๊ฐ. 04:00 ๋ค์ ํ์ธ)