ಹುಡುಕು ಸೇವಾ ವಾಸ್ತುಶಿಲ್ಪ: ವಾಲ್ಕಿಯೊಂದಿಗೆ ಸ್ಟ್ಯಾಂಡ್ಅಲೋನ್ ಫ್ಲಾಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್
ಈ ಲೇಖನವು ನಮ್ಮ ಹುಡುಕು ಸೇವೆಯು ಪ್ರತ್ಯೇಕ ಸರ್ವರ್ನಲ್ಲಿ ಸ್ಟ್ಯಾಂಡ್ಌಲೋನ್ ಫ್ಲಾಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ, ಹೆಚ್ಚಿನ-ಕಾರ್ಯಕ್ಷಮತೆಯ ವೆಕ್ಟರ್ ಹುಡುಕಾಟ, ಕ್ಯಾಶಿಂಗ್ ಮತ್ತು ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆಗಾಗಿ ವಾಲ್ಕಿ (ರೆಡಿಸ್ ಫೋರ್ಕ್) ಅನ್ನು ಬಳಸುತ್ತದೆ.
ಸಮಸ್ಯೆ: ಹುಡುಕಾಟ ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಸ್ಕೇಲಬಿಲಿಟಿ
ಹುಡುಕಾಟ ಕಾರ್ಯಾಚರಣೆಗಳು ಗಣನೀಯವಾಗಿ ದುಬಾರಿಯಾಗಿವೆ:
-
ಫಿಲ್ಟರ್ ಹೊರತೆಗೆಯುವಿಕೆ: ಪ್ರತಿ ಪ್ರಶ್ನೆಯ ವಿರುದ್ಧ 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"
}
ಅನುಷ್ಠಾನ:
-
ಪದಗುಚ್ಛ-ನಿಂದ-ಫಿಲ್ಟರ್ ಮ್ಯಾಪಿಂಗ್ಗಳನ್ನು ವಾಲ್ಕಿಯಿಂದ ಅಥವಾ JSON ನಿಂದ ಲೋಡ್ ಮಾಡಿ
-
ವರ್ಡ್ ಬೌಂಡರಿ ರೆಜೆಕ್ಸ್ ಬಳಸಿ ಪದಗುಚ್ಛಗಳನ್ನು ಹೊಂದಿಸಿ
-
ರಚನಾತ್ಮಕ ಫಿಲ್ಟರ್ಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿ
ಕ್ಯಾಶಿಂಗ್: ವಾಲ್ಕಿಯಲ್ಲಿ ಪದಗುಚ್ಛ ಮ್ಯಾಪಿಂಗ್ಗಳನ್ನು ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ (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")