ಹುಡುಕು ಸೇವಾ ವಾಸ್ತುಶಿಲ್ಪ: ವಾಲ್ಕಿಯೊಂದಿಗೆ ಸ್ಟ್ಯಾಂಡ್‌ಅಲೋನ್ ಫ್ಲಾಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್

ಈ ಲೇಖನವು ನಮ್ಮ ಹುಡುಕು ಸೇವೆಯು ಪ್ರತ್ಯೇಕ ಸರ್ವರ್ನಲ್ಲಿ ಸ್ಟ್ಯಾಂಡ್‌ಌಲೋನ್ ಫ್ಲಾಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ, ಹೆಚ್ಚಿನ-ಕಾರ್ಯಕ್ಷಮತೆಯ ವೆಕ್ಟರ್ ಹುಡುಕಾಟ, ಕ್ಯಾಶಿಂಗ್ ಮತ್ತು ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆಗಾಗಿ ವಾಲ್ಕಿ (ರೆಡಿಸ್ ಫೋರ್ಕ್) ಅನ್ನು ಬಳಸುತ್ತದೆ.

ಸಮಸ್ಯೆ: ಹುಡುಕಾಟ ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಸ್ಕೇಲಬಿಲಿಟಿ

ಹುಡುಕಾಟ ಕಾರ್ಯಾಚರಣೆಗಳು ಗಣನೀಯವಾಗಿ ದುಬಾರಿಯಾಗಿವೆ:

  • ಫಿಲ್ಟರ್ ಹೊರತೆಗೆಯುವಿಕೆ: ಪ್ರತಿ ಪ್ರಶ್ನೆಯ ವಿರುದ್ಧ 2,500+ ಪದಗುಚ್ಛಗಳನ್ನು ಹೊಂದಿಸುವುದು

  • ಸಂಬಂಧಿತ ಹುಡುಕಾಟಗಳು: 65K ಪ್ರಶ್ನೆಗಳಾದ್ಯಂತ ಹೋಲಿಕೆಯನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡುವುದು

  • ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ: 65K ಪ್ರಶ್ನೆಗಳ ಮೇಲೆ ಪೂರ್ವಪ್ರತ್ಯಯ ಹೊಂದಾಣಿಕೆ

  • ಉತ್ಪನ್ನ ಫಿಲ್ಟರಿಂಗ್: 5K+ ಉತ್ಪನ್ನಗಳನ್ನು ಅನೇಕ ಮಾನದಂಡಗಳಿಂದ ಫಿಲ್ಟರ್ ಮಾಡುವುದು

ಈ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್ನಲ್ಲಿ ಚಲಾಯಿಸುವುದರಿಂದ:

  • ನಿಧಾನ ಪುಟ ಲೋಡ್‌ಗಳು: ಹುಡುಕಾಟವು ಇತರ ವಿನಂತಿಗಳನ್ನು ತಡೆಯುತ್ತದೆ

  • ಮೆಮೊರಿ ಒತ್ತಡ: ಎಂಬೆಡಿಂಗ್‌ಗಳು ಬೃಹತ್ ಮೆಮೊರಿ ಗಾತ್ರಕ್ಕೆ ಕಾರಣವಾಗುತ್ತವೆ

  • CPU ಸ್ಪರ್ಧೆ: ಹೋಲಿಕೆ ಲೆಕ್ಕಾಚಾರವು CPU-ಗಾತ್ರದ್ದಾಗಿದೆ

  • ಸ್ಕೇಲಿಂಗ್ ಕಷ್ಟ: ಹುಡುಕಾಟವನ್ನು ಸ್ವತಂತ್ರವಾಗಿ ಸ್ಕೇಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ

ನಮಗೆ ಸ್ವತಂತ್ರವಾಗಿ ಸ್ಕೇಲ್ ಮಾಡಬಹುದಾದ ಒಂದು ಪ್ರತ್ಯೇಕ ಹುಡುಕು ಸೇವೆಯ ಅಗತ್ಯವಿದೆ.

ಪರಿಹಾರ: ಸ್ಟ್ಯಾಂಡ್‌ಅಲೋನ್ ಹುಡುಕು ಸೇವೆ

ನಾವು ಪ್ರತ್ಯೇಕ ಸರ್ವರ್ನಲ್ಲಿ ಪ್ರತ್ಯೇಕ ಫ್ಲಾಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಚಲಾಯಿಸುತ್ತೇವೆ:

ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್
    ↓ HTTP API ಕಾಲ್‌ಗಳು
ಹುಡುಕು ಸೇವೆ
    ↓ ವಾಲ್ಕಿ ಪ್ರಶ್ನೆಗಳು
ವಾಲ್ಕಿ ಸರ್ವರ್

ಈ ವಾಸ್ತುಶಿಲ್ಪವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ:

  • ಸ್ವತಂತ್ರ ಸ್ಕೇಲಿಂಗ್: ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್ ಅನ್ನು ಪರಿಣಾಮಗೊಳಿಸದೆ ಹುಡುಕು ಸೇವೆಯನ್ನು ಸ್ಕೇಲ್ ಮಾಡುವುದು

  • ಸಂಪನ್ಮೂಲ ಪ್ರತ್ಯೇಕತೆ: ಹುಡುಕಾಟ ಕಾರ್ಯಾಚರಣೆಗಳು ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್ ಅನ್ನು ಪರಿಣಾಮಗೊಳಿಸುವುದಿಲ್ಲ

  • ಕ್ಯಾಶಿಂಗ್: ವಾಲ್ಕಿಯು ಪುನರಾವರ್ತಿತ ಪ್ರಶ್ನೆಗಳಿಗೆ ಫಲಿತಾಂಶಗಳನ್ನು ಕ್ಯಾಶ್ ಮಾಡುತ್ತದೆ

  • ಹೆಚ್ಚಿನ ಲಭ್ಯತೆ: ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್ ಅನ್ನು ಪರಿಣಾಮಗೊಳಿಸದೆ ಹುಡುಕು ಸೇವೆಯನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬಹುದು

ಹುಡುಕು ಸೇವಾ ಘಟಕಗಳು

1. ಫಿಲ್ಟರ್ ಹೊರತೆಗೆಯುವಿಕೆ API

  • ಎಂಡ್‌ಪಾಯಿಂಟ್: /api/extract_filters

  • ಉದ್ದೇಶ: ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಶ್ನೆಗಳಿಂದ ರಚನಾತ್ಮಕ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಹೊರತೆಗೆಯುವುದು

  • ಉದಾಹರಣೆ:

GET /api/extract_filters?q=mini+pc+16gb+ram

ಪ್ರತಿಕ್ರಿಯೆ:
{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

ಅನುಷ್ಠಾನ:

ಕ್ಯಾಶಿಂಗ್: ವಾಲ್ಕಿಯಲ್ಲಿ ಪದಗುಚ್ಛ ಮ್ಯಾಪಿಂಗ್‌ಗಳನ್ನು ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ (30-ದಿನದ TTL)

2. ಸಂಬಂಧಿತ ಹುಡುಕಾಟಗಳ API

  • ಎಂಡ್‌ಪಾಯಿಂಟ್: /api/related

  • ಉದ್ದೇಶ: ವೆಕ್ಟರ್ ಹುಡುಕಾಟವನ್ನು ಬಳಸಿಕೊಂಡು ಅರ್ಥದಲ್ಲಿ ಹೋಲುವ ಪ್ರಶ್ನೆಗಳನ್ನು ಕಂಡುಹಿಡಿಯುವುದು

  • ಉದಾಹರಣೆ:

POST /api/related
{
  "query": "mini pc",
  "limit": 10
}

ಪ್ರತಿಕ್ರಿಯೆ:
{
  "related": [
    {"query": "small computer", "similarity": 0.92},
    {"query": "compact desktop", "similarity": 0.89},
    {"query": "mini pc 8gb", "similarity": 0.87}
  ]
}

ಅನುಷ್ಠಾನ:

  • all-mpnet-base-v2 ಬಳಸಿ ಪ್ರಶ್ನೆಯನ್ನು ಎಂಬೆಡ್ ಮಾಡಿ

  • ಹತ್ತಿರದ ನೆರೆಹೊರೆಯವರಿಗಾಗಿ ವಾಲ್ಕಿ ರೆಡಿಸರ್ಚ್ ಅನ್ನು ಪ್ರಶ್ನಿಸಿ

  • ಹೋಲಿಕೆಯಿಂದ ವಿಂಗಡಿಸಲಾದ ಉನ್ನತ N ಫಲಿತಾಂಶಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿ

ಕ್ಯಾಶಿಂಗ್: ಫಲಿತಾಂಶಗಳನ್ನು ವಾಲ್ಕಿಯಲ್ಲಿ ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ (7-ದಿನದ TTL)

3. ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ API

  • ಎಂಡ್‌ಪಾಯಿಂಟ್: /api/autocomplete

  • ಉದ್ದೇಶ: ಬಳಕೆದಾರರು ಟೈಪ್ ಮಾಡುವಾಗ ಪ್ರಶ್ನೆಗಳನ್ನು ಸೂಚಿಸುವುದು

  • ಉದಾಹರಣೆ:

GET /api/autocomplete?q=mini+p&limit=5

ಪ್ರತಿಕ್ರಿಯೆ:
{
  "suggestions": [
    "mini pc",
    "mini pc 16gb",
    "mini pc 8gb ram",
    "mini pc fanless",
    "mini pc windows 11"
  ]
}

ಅನುಷ್ಠಾನ:

  • ಪೂರ್ವಪ್ರತ್ಯಯ ಹೊಂದಾಣಿಕೆಯೊಂದಿಗೆ ವಾಲ್ಕಿ ರೆಡಿಸರ್ಚ್ ಅನ್ನು ಪ್ರಶ್ನಿಸಿ

  • ಜನಪ್ರಿಯತೆಯಿಂದ ಶ್ರೇಯಾಂಕ ನೀಡಿ (ಇಂಪ್ರೆಶನ್ + ಕ್ಲಿಕ್ ಸ್ಕೋರ್)

  • ಉನ್ನತ N ಸಲಹೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿ

ಕ್ಯಾಶಿಂಗ್: ವಾಲ್ಕಿಯಲ್ಲಿ ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ ಸೂಚಿಯನ್ನು ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ (ದೈನಂದಿನವಾಗಿ ನವೀಕರಿಸಲಾಗುತ್ತದೆ)

4. ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳ API

  • ಎಂಡ್‌ಪಾಯಿಂಟ್: /api/popular

  • ಉದ್ದೇಶ: ಹೆಚ್ಚು ಜನಪ್ರಿಯವಾದ ಪ್ರಶ್ನೆಗಳನ್ನು ಪಡೆಯುವುದು

  • ಉದಾಹರಣೆ:

GET /api/popular?limit=10

ಪ್ರತಿಕ್ರಿಯೆ:
{
  "queries": [
    "mini pc",
    "thin client",
    "industrial pc",
    "all in one pc"
  ]
}

ಅನುಷ್ಠಾನ:

  • ವಾಲ್ಕಿಯಿಂದ ಅಥವಾ JSON ನಿಂದ ಪ್ರಶ್ನೆಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ

  • ಟ್ರಾಫಿಕ್ ಸ್ಕೋರ್ (ಇಂಪ್ರೆಶನ್‌ಗಳು + ಕ್ಲಿಕ್‌ಗಳು) ಮೂಲಕ ವಿಂಗಡಿಸಿ

  • ಉನ್ನತ N ಪ್ರಶ್ನೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿ

ಕ್ಯಾಶಿಂಗ್: ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳನ್ನು ವಾಲ್ಕಿಯಲ್ಲಿ ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ (30-ದಿನದ TTL)

ವಾಲ್ಕಿ ಏಕೀಕರಣ

ವಾಲ್ಕಿ ಒಂದು ರೆಡಿಸ್ ಫೋರ್ಕ್ ಆಗಿದ್ದು ಅದು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ:

  • ವೆಕ್ಟರ್ ಹುಡುಕಾಟ: ಹೋಲಿಕೆ ಹುಡುಕಾಟಕ್ಕಾಗಿ ರೆಡಿಸರ್ಚ್ ಮಾಡ್ಯೂಲ್

  • ಕ್ಯಾಶಿಂಗ್: ವೇಗವಾದ ಇನ್-ಮೆಮೊರಿ ಕೀ-ವ್ಯಾಲ್ಯೂ ಸ್ಟೋರ್

  • ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ: ವಿಂಗಡಿಸಿದ ಸೆಟ್‌ಗಳೊಂದಿಗೆ ಪೂರ್ವಪ್ರತ್ಯಯ ಹೊಂದಾಣಿಕೆ

  • ಸ್ಥಿರತೆ: ಸ್ಥಿರತೆಗಾಗಿ AOF (ಅಪೆಂಡ್-ಒನ್ಲಿ ಫೈಲ್)

ರೆಡಿಸರ್ಚ್ನೊಂದಿಗೆ ವೆಕ್ಟರ್ ಹುಡುಕಾಟ

ನಾವು ವೆಕ್ಟರ್ ಹೋಲಿಕೆ ಹುಡುಕಾಟಕ್ಕಾಗಿ ವಾಲ್ಕಿಯ ರೆಡಿಸರ್ಚ್ ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ:

ಸೂಚ್ಯಂಕ ಸೃಷ್ಟಿ:

client.ft("queries_idx").create_index([
    VectorField("embedding", "FLAT", {
        "TYPE": "FLOAT32",
        "DIM": 768,
        "DISTANCE_METRIC": "COSINE"
    }),
    TextField("query"),
    NumericField("score")
])

ವೆಕ್ಟರ್ ಹುಡುಕಾಟ:

query_embedding = model.encode(query)
results = client.ft("queries_idx").search(
    Query("*=>[KNN 10 @embedding $vec AS score]")
    .sort_by("score")
    .return_fields("query", "score")
    .dialect(2),
    query_params={"vec": query_embedding.tobytes()}
)

ಇದು ಕೊಸೈನ್ ಹೋಲಿಕೆಯಿಂದ 10 ಹತ್ತಿರದ ನೆರೆಹೊರೆಯವರನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.

ಕ್ಯಾಶಿಂಗ್ ತಂತ್ರ

ನಾವು ವಾಲ್ಕಿಯಲ್ಲಿ ಬಹು ದತ್ತಾಂಶ ಪ್ರಕಾರಗಳನ್ನು ಕ್ಯಾಶ್ ಮಾಡುತ್ತೇವೆ:

ಪದಗುಚ್ಛ ಮ್ಯಾಪಿಂಗ್‌ಗಳು (30-ದಿನದ TTL):

client.setex(
    "seo:phrase_mappings",
    30 * 24 * 3600,
    json.dumps(phrase_mappings)
)

ಸಂಬಂಧಿತ ಹುಡುಕಾಟಗಳು (7-ದಿನದ TTL):

cache_key = f"related:{query_hash}"
client.setex(cache_key, 7 * 24 * 3600, json.dumps(results))

ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳು (30-ದಿನದ TTL):

client.setex(
    "seo:popular_queries",
    30 * 24 * 3600,
    json.dumps(popular_queries)
)

ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ ಸೂಚಿ (ದೈನಂದಿನವಾಗಿ ನವೀಕರಿಸಲಾಗುತ್ತದೆ):

for query, score in queries:
    client.zadd("autocomplete:mini", {query: score})

ವಿಂಗಡಿಸಿದ ಸೆಟ್‌ಗಳೊಂದಿಗೆ ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ

ನಾವು ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆಗಾಗಿ ವಾಲ್ಕಿ ವಿಂಗಡಿಸಿದ ಸೆಟ್‌ಗಳನ್ನು ಬಳಸುತ್ತೇವೆ:

ಸೂಚ್ಯಂಕ ರಚನೆ:

autocomplete:m     → ["mini pc": 5000, "mini computer": 3000]
autocomplete:mi    → ["mini pc": 5000, "mini computer": 3000]
autocomplete:min   → ["mini pc": 5000, "mini computer": 3000]
autocomplete:mini  → ["mini pc": 5000, "mini computer": 3000]

ಪೂರ್ವಪ್ರತ್ಯಯ ಹುಡುಕಾಟ:

prefix = "mini"
results = client.zrevrange(f"autocomplete:{prefix}", 0, 9, withscores=True)

ಇದು "mini" ನೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗುವ, ಸ್ಕೋರ್ ಮೂಲಕ ವಿಂಗಡಿಸಲಾದ ಉನ್ನತ 10 ಪ್ರಶ್ನೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.

API ಸಂವಹನ

ಮುಖ್ಯ ವೆಬ್ ಸರ್ವರ್ HTTP ಮೂಲಕ ಹುಡುಕು ಸೇವೆಯನ್ನು ಕರೆಯುತ್ತದೆ:

ಫಿಲ್ಟರ್ ಹೊರತೆಗೆಯುವಿಕೆ

```python from app.shared.filter_service import extract_filters_from_query

filters = extract_filters_from_query("mini pc 16gb ram")

ಆಂತರಿಕವಾಗಿ ಕರೆಯುತ್ತದೆ: GET SEARCH_SERVICE_URL/api/extract