CHAPTER 02

๐Ÿ” Data Discovery & Search

๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰๊ณผ ๋ฐœ๊ฒฌ์˜ ํ•ต์‹ฌ ์›๋ฆฌ

2.1 ๊ฒ€์ƒ‰ ์•„ํ‚คํ…์ฒ˜

ํšจ๊ณผ์ ์ธ ๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. Crawler (ํฌ๋กค๋Ÿฌ): ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  2. Indexer (์ธ๋ฑ์„œ): ์ˆ˜์ง‘๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ƒ‰์ธ
  3. Search Engine (๊ฒ€์ƒ‰ ์—”์ง„): ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
  4. Ranker (์ˆœ์œ„ ๋งค๊น€): ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๊ด€๋ จ๋„์— ๋”ฐ๋ผ ์ •๋ ฌ

Elasticsearch ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ตฌํ˜„

๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€์ ์ธ ๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ๋Š” Elasticsearch๋ฅผ ๊ฒ€์ƒ‰ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Elasticsearch๋Š” ์ „๋ฌธ ๊ฒ€์ƒ‰, ์ž๋™์™„์„ฑ, ํผ์ง€ ๋งค์นญ ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Elasticsearch Index ๋งคํ•‘ ์˜ˆ์‹œ:
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "keyword": { "type": "keyword" },
          "autocomplete": { "type": "text", "analyzer": "autocomplete" }
        }
      },
      "description": { "type": "text" },
      "tags": { "type": "keyword" },
      "platform": { "type": "keyword" },
      "owner": { "type": "keyword" },
      "updated_at": { "type": "date" }
    }
  }
}

2.2 ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ ์œ ํ˜•

1) ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ (Keyword Search)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

2) ํผ์ง€ ๊ฒ€์ƒ‰ (Fuzzy Search)

์˜คํƒ€๊ฐ€ ์žˆ์–ด๋„ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. "custmer" โ†’ "customer"

3) ์™€์ผ๋“œ์นด๋“œ ๊ฒ€์ƒ‰

ํŒจํ„ด ๋งค์นญ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. "customer_*" โ†’ customer_id, customer_email, customer_name

4) ํ•„ํ„ฐ ๊ฒ€์ƒ‰

ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ•„ํ„ฐ ๊ฒ€์ƒ‰ ์˜ˆ์‹œ:
  • ํ”Œ๋žซํผ = PostgreSQL
  • ์†Œ์œ ์ž = data-team@company.com
  • ํƒœ๊ทธ = customer-domain
  • ์—…๋ฐ์ดํŠธ ๋‚ ์งœ > 2025-01-01

2.3 ์ž๋™์™„์„ฑ (Autocomplete)

์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ดํ•‘ํ•˜๋Š” ๋™์•ˆ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™์™„์„ฑ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. Prefix Matching: ์ž…๋ ฅ๋œ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด ์ฐพ๊ธฐ
  2. N-Gram: ๋ฌธ์ž ์กฐํ•ฉ์„ ๋ฏธ๋ฆฌ ์ƒ‰์ธํ•˜์—ฌ ๋ถ€๋ถ„ ์ผ์น˜ ์ง€์›
  3. Completion Suggester: Elasticsearch์˜ ์ „์šฉ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ
๐Ÿ’ก ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค
์ž๋™์™„์„ฑ์€ ๋‹ค์Œ ์ˆœ์„œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
  1. ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ํ…Œ์ด๋ธ”๋ช…
  2. ์ ‘๋‘์‚ฌ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋Ÿผ๋ช…
  3. ํƒœ๊ทธ๋‚˜ ์„ค๋ช…์— ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ•ญ๋ชฉ
  4. ์ตœ๊ทผ ๊ฒ€์ƒ‰ ์ด๋ ฅ

2.4 ๊ด€๋ จ๋„ ์ˆœ์œ„ (Relevance Ranking)

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ๋„ ์ ์ˆ˜๋Š” ๋‹ค์Œ ์š”์†Œ๋“ค์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค:

์š”์†Œ ๊ฐ€์ค‘์น˜ ์„ค๋ช…
ํ…์ŠคํŠธ ์œ ์‚ฌ๋„ 40% TF-IDF, BM25 ์•Œ๊ณ ๋ฆฌ์ฆ˜
์ธ๊ธฐ๋„ 20% ์กฐํšŒ์ˆ˜, ์ฟผ๋ฆฌ ๋นˆ๋„
์‹ ์„ ๋„ 15% ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„
ํ’ˆ์งˆ ์ ์ˆ˜ 15% ๋ฌธ์„œํ™” ์™„์„ฑ๋„
๊ฐœ์ธํ™” 10% ์‚ฌ์šฉ์ž ์ด๋ ฅ, ํŒ€ ์ •๋ณด

BM25 ์•Œ๊ณ ๋ฆฌ์ฆ˜

Elasticsearch์˜ ๊ธฐ๋ณธ ์ˆœ์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ BM25๋Š” ๋‹ค์Œ ๊ณต์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

BM25 ์ ์ˆ˜ ๊ณ„์‚ฐ:
score(D,Q) = ฮฃ IDF(qi) ร— (f(qi,D) ร— (k1 + 1)) / (f(qi,D) + k1 ร— (1 - b + b ร— |D| / avgdl))

์—ฌ๊ธฐ์„œ:
- D: ๋ฌธ์„œ (๋ฐ์ดํ„ฐ์…‹)
- Q: ์ฟผ๋ฆฌ
- f(qi,D): ๋ฌธ์„œ D์—์„œ ํ‚ค์›Œ๋“œ qi์˜ ๋นˆ๋„
- |D|: ๋ฌธ์„œ ๊ธธ์ด
- avgdl: ํ‰๊ท  ๋ฌธ์„œ ๊ธธ์ด
- k1, b: ์กฐ์ • ๋งค๊ฐœ๋ณ€์ˆ˜

2.5 ๊ณ ๊ธ‰ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

1) ํŒจ์‹ฏ ๊ฒ€์ƒ‰ (Faceted Search)

์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์— ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•„ํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ขํ˜€๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์‹ฏ ์˜ˆ์‹œ:
  • Platform: PostgreSQL (234), MySQL (156), BigQuery (89)
  • Type: Table (456), View (123), File (67)
  • Owner: data-team (145), analytics-team (89)
  • Tags: customer (234), pii (156), financial (89)

2) ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ (Semantic Search)

ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ ์˜๋ฏธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. "๊ณ ๊ฐ ์ด๋ฉ”์ผ" ๊ฒ€์ƒ‰ ์‹œ "customer_email", "user_email", "contact_email"์„ ๋ชจ๋‘ ์ฐพ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฌ ML ๊ธฐ๋ฐ˜ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰
BERT, Sentence Transformers ๋“ฑ ์–ธ์–ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ์™€ ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

3) ์ปฌ๋Ÿผ ๋ ˆ๋ฒจ ๊ฒ€์ƒ‰

ํ…Œ์ด๋ธ”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ณ„ ์ปฌ๋Ÿผ ์ˆ˜์ค€์—์„œ๋„ ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. "email ํƒ€์ž…์˜ PII ๋ฐ์ดํ„ฐ"๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.6 ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ธ๋ฑ์‹ฑ ์ตœ์ ํ™”

  1. ์ƒค๋”ฉ: ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์ƒค๋“œ๋กœ ๋ถ„์‚ฐํ•˜์—ฌ ๋ณ‘๋ ฌ ๊ฒ€์ƒ‰
  2. ๋ ˆํ”Œ๋ฆฌ์นด: ์ฝ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€๋ฅผ ์œ„ํ•œ ๋ณต์ œ๋ณธ ์ƒ์„ฑ
  3. ์บ์‹ฑ: ์ž์ฃผ ๊ฒ€์ƒ‰๋˜๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์‹ฑ
  4. ์ฆ๋ถ„ ์ธ๋ฑ์‹ฑ: ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์žฌ์ƒ‰์ธ

์ฟผ๋ฆฌ ์ตœ์ ํ™”

{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "customer" } }
      ],
      "filter": [
        { "term": { "platform": "PostgreSQL" } },
        { "range": { "updated_at": { "gte": "2025-01-01" } } }
      ],
      "should": [
        { "match": { "tags": "high-quality" } }
      ]
    }
  }
}
๐Ÿ’ก ์„ฑ๋Šฅ ํŒ
  • filter ์‚ฌ์šฉ ์‹œ ์ ์ˆ˜ ๊ณ„์‚ฐ์„ ๊ฑด๋„ˆ๋›ฐ์–ด ๋น ๋ฆ„
  • must๋Š” ๊ด€๋ จ๋„ ์ ์ˆ˜์— ์˜ํ–ฅ
  • should๋Š” ์„ ํƒ์  ๋ถ€์ŠคํŒ…

2.7 ๊ฐœ์ธํ™”๋œ ๊ฒ€์ƒ‰

์‚ฌ์šฉ์ž์˜ ์—ญํ• , ํŒ€, ๊ณผ๊ฑฐ ๊ฒ€์ƒ‰ ์ด๋ ฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋งž์ถคํ˜• ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰: "customer" ์ƒ์œ„ ๊ฒฐ๊ณผ
๋งˆ์ผ€ํŒ… ํŒ€ ๊ณ ๊ฐ ์„ธ๊ทธ๋จผํŠธ ๋ฐ์ดํ„ฐ customers.customer_segment
์žฌ๋ฌด ํŒ€ ๊ณ ๊ฐ ๊ฒฐ์ œ ์ •๋ณด customers.payment_method
๋ฐ์ดํ„ฐ ํŒ€ ์ „์ฒด ๊ณ ๊ฐ ํ…Œ์ด๋ธ” customers (์ „์ฒด)

2.8 ์‹ค์ „ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 1: "์ด๋ฉ”์ผ ๊ด€๋ จ PII ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ"
๊ฒ€์ƒ‰: email pii
ํ•„ํ„ฐ:
  - Classification: PII
  - Data Type: VARCHAR
๊ฒฐ๊ณผ:
  1. customers.email
  2. users.email_address
  3. orders.customer_email
์‹œ๋‚˜๋ฆฌ์˜ค 2: "์ตœ๊ทผ 1๊ฐœ์›” ๋‚ด ์—…๋ฐ์ดํŠธ๋œ ๊ณ ํ’ˆ์งˆ ํ…Œ์ด๋ธ”"
๊ฒ€์ƒ‰: *
ํ•„ํ„ฐ:
  - Updated After: 2025-11-26
  - Quality Score: >= 0.9
  - Type: TABLE
์ •๋ ฌ: Quality Score (๋‚ด๋ฆผ์ฐจ์ˆœ)
๊ฒฐ๊ณผ:
  1. customer_analytics (0.98)
  2. order_summary (0.95)
  3. product_catalog (0.92)

2.9 ๋‹ค์Œ ์žฅ ์˜ˆ๊ณ 

๋‹ค์Œ ์žฅ์—์„œ๋Š” Metadata Management๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ง‘, ์ €์žฅ, ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•๊ณผ ์ž๋™ํ™” ์ „๋žต์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.