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์—์„œ ์ฃผ์š”ํ•œ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Vocabulary
  2. 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/