Inverted Index
Inverted Index๋ DB Index์ ํน์ํ๋ ํํ ์ค ํ๋๋ค.
์ ํต์ ์ธ ์ธ๋ฑ์ค
๋ณดํต ์ธ๋ฑ์ค๋ผ๊ณ ํ๋ฉด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB)์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
RDB๋ค์ B-Tree ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ์ธ๋ฑ์ค ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์, ๊ทธ๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ณ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด๊ฑด ๋จ์ ์ผ์น ๊ฒ์์ด๋ ์ซ์ ๋ฒ์ ๊ฒ์(Between) ๋ฑ์๋ ๋์์ง ์์ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
B-Tree๋ผ์ ์ ๋ ฌ์ ๊ฐ์ ํ๊ณ ์กฐํํ๋ ๊ฒ์ ์ ์ต์ ํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ค์ NoSQL์ LSM Tree ๊ธฐ๋ฐ ์์คํ ๋ค๋ ๋ด๋ถ ์๋ฃ๊ตฌ์กฐ๋ง ๋ค๋ฅด๋ค ๋ฟ์ด์ง, ์ด๋ฐ ๋ฐฉํฅ์ฑ์์๋ RDB์ B-Tree์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๋ฌธ์ : ํ ์คํธ ๊ฒ์
์ผ๋ฐ DB๋ค์ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ๋ค์, ์ธ์ ๋ ํ ์คํธ๋ค.
๋จ์ ํฌํจ ์ฌ๋ถ์ ๋ฌธ์ ๊ฒ์๋ง์ ๊ตฌํํ๋๋ผ๋ LIKE '%ํ
์คํธ%'์ ๊ฐ์ด ์ฌ์ฉ์ ํ๊ฒ ๋๋๋ฐ, ์ด๊ฑด ์ผ๋ฐ์ ์ธ ์ธ๋ฑ์ค ๊ตฌ์กฐ์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฐ์ง ๋ชปํ๋ค.
Postgres์ ํํด์๋ GIN ๊ฐ์ ํน์ํ๋ ์ธ๋ฑ์ค๋ฅผ ์ธ ์๋ ์๋๋ฐ, ์ด๊ฑด ํ๊ณ๋ ์๊ณ ์ข ์์ธ์ ์ด๋ ์ ์ธํ๋ค.
๊ทผ๋ฐ ๋จ์ ํฌํจ ๊ฒ์์ ๋ํด์๋ LIKE๋ก ์ฒ๋ฆฌํ ์๋ ์๊ฒ ์ง๋ง, ์ดํ๋ ๋จ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ์์ ๋ง๋ค๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๋ค. "๊ตฌ์ฐ ๋ถ์ ๊ฐ๋ฐฉ"์ด๋ ๋ฐ์ดํฐ๋ฅผ "๊ตฌ์ฐ ๊ฐ๋ฐฉ"์ผ๋ก๋ ๊ฒ์ํ๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊ฒ ๊ฐ์๊ฐ?
์ด๋ฌ๋ฉด ๋จธ๋ฆฌ๊ฐ ์ํ์ง๊ธฐ ์์ํ๋ ๊ฒ์ด๋ค.
Inverted Index?
Inverted Index๋ ์ด๋ฌํ ๋ณต์กํ ํ ์คํธ ๊ฒ์์ ์ํด ๊ณ ์๋ ๋งค์ปค๋์ฆ์ด๋ผ ํ ์ ์๋ค.
์ด์
์ฉ์ด๊ฐ ์ญ ์ธ๋ฑ์ค(Inverted Index)๋ผ๊ณ ํด์ ๊ธฐ์กด ์ธ๋ฑ์ค๋ฅผ ๋ค์ง์๊ฑฐ๋ผ๊ณ ์ฐฉ๊ฐํ๋ ์ฌ๋๋ค์ด ๋ง์๋ฐ, ์ด๊ฑด ์ธ๋ฑ์ค๋ฅผ ๋ค์ง์๊ฒ ์๋๋ผ ๊ทธ๋ฅ ์ค๊ฐ ๊ณผ์ ์ ํ๋ ์ถ๊ฐํ ๊ฒ์ผ ๋ฟ์ด๋ค.
Inverted Index์ ๋ด๋ถ ์์คํ
์ ์ ๋ณด๋ฉด, ํ
์คํธ๋ฅผ Tokenizingํด์ ๋จ์ด์ง์ ๋ง๋๋ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์๊ณ , ๊ทธ ๋จ์ด์ง์ ์ต์ข
๋ฐ์ดํฐ(Document)์ ๋งคํํ๋ ๋๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์๋ค. ์ด๋ฏธ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค(forward index)๊ฐ ์์ผ๋ฏ๋ก ๋๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์์ด ์๋ ๋ค์ ์๋ค๊ณ inverted index๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ผ ๋ฟ์ด๋ค.
๋ณธ์ง์ ์ผ๋ก ๊ฐ์ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ค.
์ฉ๋ก
์๋ฌด๋๋ ๋ํ์ ์ธ ์ฉ๋ก๋ ๊ฒ์์์ง์ฉ DB์ธ Elasticsearch์ผ ๊ฒ์ด๋ค. ๊ทธ ์ธ์๋ Elasticsearch์ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ฒ์ ์ธ meilisearch, ์ํ์ง Apache Solr ๋ฑ์ด ์๋ค.
๋ถ์์ฉ DB์ธ clickhouse๋ Inverted Index ๊ธฐ๋ฐ์ ํ ์คํธ ๊ฒ์์ ์ง์ํ๋ฉฐ, CockroachDB/PostgreSQL๋ ํ๊ณ๋ ๋ง์ง๋ง GIN ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฏธ๋๋ฉํ ํํ์ inverted index๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Inverted Index์ ๊ตฌ์กฐ
์ด๋ฌํ ํ ์คํธ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋์ด์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ ๊ธฐ์ text๋ผ๋ ํ๋๋ฅผ inverted index ๊ฒ์ ๋์์ผ๋ก ์ก์์ผ ํ๋ค๋ฉด, ํด์ผํ ๊ฒ๋ค์ด ๋ง๋ค.
๋ค์์ ๊ทธ ๊ตฌ์กฐ์ ๊ณผ์ ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช ์ด๋ค.
1. ์ดํ ๋ถ์
์ฐ์ ์ดํ ๋จ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค. ์ด ๋จ๊ณ๋ฅผ ๋ณดํต tokenizing์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ณดํต์ ๊ณต๋ฐฑ ๊ฐ์ ํ์ดํธ์คํ์ด์ค ๊ธฐ๋ฐ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ๋ ํ๊ณ , ์ดํ๋ถ์๊ธฐ๋ฅผ ํตํด์ ๋จ์ด ์ฌ์ ์ด๋ ์กฐ์ฌ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ๋ ํ๋ค. Elasticsearch๊ฐ ๋ฃจ์ฌ๊ณผ tokenizer๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๋๊ฒ ์ด๋ฐ ๊ฒ๋ค์ด๋ค.
์๋ฌดํผ ์ผ๋ฐ์ ์ผ๋ก "๊ตฌ์ฐ ๋นจ๊ฐ์ ๊ฐ๋ฐฉ"์ "๊ตฌ์ฐ", "๋นจ๊ฐ์", "๊ฐ๋ฐฉ" 3๊ฐ์ ๋จ์ด๋ก ๋ถ๋ฆฌํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋จ์ด๋ค์ ๊ฒ์์ ์ํด inverted index์ ์ ์ฅํ๋ค.
2. inverted index ๊ตฌ์ฑ
Inverted Index์์ ์ฃผ์ํ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Vocabulary
- Occurences
๊ตฌ์ฐ, ๋นจ๊ฐ์, ๊ฐ๋ฐฉ, ๋
ธ๋์, ... ๊ฐ์ ๋จ์ด์ง์ Vocabulary๋ผ๊ณ ํ๋ฉด, Occurences๋ ๊ทธ ๋จ์ด๋ค์ด ์ค์ ๋ก ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ID ๋ฐฐ์ด์ด๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋๋ค.
"๊ตฌ์ฐ"๋ผ๋ ๋จ์ด๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ๋ชฉ๋ก์ด๋, "๋นจ๊ฐ์"์ด ํฌํจ๋ ๋ฐ์ดํฐ ๋ชฉ๋ก์ ์ ์ธ๋ฑ์ค๋ฅผ ํตํด์ ์ฐธ์กฐํ ์ ์๋ ๊ฒ์ด๋ค.
3. ๊ฒ์ ๊ณผ์
๊ทธ๋ฌ๋ฉด ์ ์ํ์์ "๊ตฌ์ฐ ๊ฐ๋ฐฉ"์ ๊ฒ์ํ๋ ค ํ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฌ๊ฐ๊น?
๋จ์ด์ง์ ๋ง๋ค๋๋ง ๋จ์ด๋ฅผ ๋ถ๋ฆฌํ๋๊ฒ ์๋๋ผ, ๊ฒ์์ ํ ๋๋ ๋จ์ด๋ฅผ ๋ถ๋ฆฌํ๋ค.
์ฐ์ Tokenzing์ ๊ฑฐ์ณ์ "๊ตฌ์ฐ"์ "๊ฐ๋ฐฉ" ๋ ๋ถ๋ถ์ผ๋ก ๋จ์ด๋ฅผ ๋๋๊ณ
๋จ์ด ๊ธฐ๋ฐ์ผ๋ก Inverted Index๋ฅผ ์ฐธ์กฐํ๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๋์คํฌ์ ์ ์ฅ๋ Document๊น์ง ๊ฐ์ง ์๊ณ ๋, ๋จ์ด๊ฐ ํฌํจ๋๋ ๋น๋์๋ฅผ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ ์ ์๋ค.
๊ตฌ์ฐ๊ฐ ํฌํจ๋๋๊ฑด 1,2๋ฒ
๊ฐ๋ฐฉ์ด ํฌํจ๋๋๊ฑด 1๋ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก id=1๋ฒ์ด ์ ์ 2์ ์ผ๋ก ๊ฐ์ฅ ๋๊ณ , id=2๋ฒ์ด ์ ์ 1์ ์ผ๋ก ๊ทธ ๋ค์์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด 2๊ฐ์ง๊ฐ ๊ฒ์ ๋์์ผ๋ก ์กํ๋ ๊ฒ์ด๋ค.
๋๋จธ์ง๋ ์ด ๊ณผ์ ์ ๋ณํ์ผ ๋ฟ์ด๋ค.
์ฌ์ค ์๋ฆฌ๋ฅผ ์๋ค๋ฉด ์ผ๋ฐ์ ์ธ DB์์ ์ง์ ๊ตฌํ์ ํ๋ ๊ฒ๋ ๊ทธ๋ ๊ฒ ์ด๋ ค์ด ๊ฒ์ ์๋๋ค.
์ดํ๋ถ์์ด๋ ๋์์ด๋ ๊ทธ๋ฐ๊ฒ ๋ค์ด๊ฐ๊ธฐ ์์ํ๋ฉด ๋๋ ์๊ณ , ๊ทธ๋ฅ ์๋๊ฑฐ ์ฐ๋๊ฒ ํธํ๋๊น ์ฐ๋ ๊ฒ์ผ ๋ฟ์ด๋ค.
์ฐธ์กฐ
https://en.wikipedia.org/wiki/Inverted_index
https://stackoverflow.com/questions/7727686/whats-the-difference-between-an-inverted-index-and-a-plain-old-index
https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data
https://www.cockroachlabs.com/blog/inverted-indexes/