ਖੋਜ ਸੇਵਾ ਆਰਕੀਟੈਕਚਰ: ਵਲਕੀ ਨਾਲ ਸਟੈਂਡਅਲੋਨ ਫਲਾਸਕ ਐਪਲੀਕੇਸ਼ਨ
ਇਹ ਲੇਖ ਦੱਸਦਾ ਹੈ ਕਿ ਕਿਵੇਂ ਸਾਡੀ ਖੋਜ ਸੇਵਾ ਇੱਕ ਵੱਖਰੇ ਸਰਵਰ 'ਤੇ ਇੱਕ ਸਟੈਂਡਅਲੋਨ ਫਲਾਸਕ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਰੂਪ ਵਿੱਚ ਚਲਦੀ ਹੈ, ਜੋ ਉੱਚ-ਕਾਰਗੁਜ਼ਾਰੀ ਵੈਕਟਰ ਖੋਜ, ਕੈਸ਼ਿੰਗ, ਅਤੇ ਆਟੋਕੰਪਲੀਟ ਲਈ ਵਲਕੀ (ਰੈਡਿਸ ਫੋਰਕ) ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ।
ਸਮੱਸਿਆ: ਖੋਜ ਕਾਰਗੁਜ਼ਾਰੀ ਅਤੇ ਸਕੇਲਬਿਲਟੀ
ਖੋਜ ਕਾਰਵਾਈਆਂ ਕੰਪਿਊਟੇਸ਼ਨਲ ਤੌਰ 'ਤੇ ਮਹਿੰਗੀਆਂ ਹਨ:
-
ਫਿਲਟਰ ਨਿਕਾਸ: ਹਰੇਕ ਕੁਐਰੀ ਦੇ ਵਿਰੁੱਧ 2,500+ ਵਾਕਾਂਸ਼ਾਂ ਨਾਲ ਮੈਚ ਕਰੋ
-
ਸਬੰਧਤ ਖੋਜਾਂ: 65K ਕੁਐਰੀਆਂ ਵਿੱਚ ਸਮਰੂਪਤਾ ਦੀ ਗਣਨਾ ਕਰੋ
-
ਆਟੋਕੰਪਲੀਟ: 65K ਕੁਐਰੀਆਂ 'ਤੇ ਪ੍ਰੀਫਿਕਸ ਮੈਚਿੰਗ
-
ਉਤਪਾਦ ਫਿਲਟਰਿੰਗ: ਕਈ ਮਾਪਦੰਡਾਂ ਦੁਆਰਾ 5K+ ਉਤਪਾਦਾਂ ਨੂੰ ਫਿਲਟਰ ਕਰੋ
ਮੁੱਖ ਵੈੱਬ ਸਰਵਰ 'ਤੇ ਇਹਨਾਂ ਕਾਰਵਾਈਆਂ ਨੂੰ ਚਲਾਉਣਾ ਕਾਰਨ ਬਣਦਾ ਹੈ:
-
ਧੀਮੇ ਪੰਨਾ ਲੋਡ: ਖੋਜ ਹੋਰ ਬੇਨਤੀਆਂ ਨੂੰ ਬਲਾਕ ਕਰਦੀ ਹੈ
-
ਮੈਮੋਰੀ ਦਬਾਅ: ਐਮਬੈਡਿੰਗਜ਼ ਮੈਮੋਰੀ ਫੁੱਟਪ੍ਰਿੰਟ ਦਾ ਇੱਕ ਵਿਸ਼ਾਲ ਹਿੱਸਾ ਹਨ
-
ਸੀਪੀਯੂ ਟੱਕਰ: ਸਮਰੂਪਤਾ ਗਣਨਾ ਸੀਪੀਯੂ-ਗਹਿਰੀ ਹੈ
-
ਸਕੇਲਿੰਗ ਮੁਸ਼ਕਲ: ਖੋਜ ਨੂੰ ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਸਕੇਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ
ਸਾਨੂੰ ਇੱਕ ਸਮਰਪਿਤ ਖੋਜ ਸੇਵਾ ਦੀ ਲੋੜ ਹੈ ਜੋ ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਸਕੇਲ ਕਰ ਸਕੇ।
ਹੱਲ: ਸਟੈਂਡਅਲੋਨ ਖੋਜ ਸੇਵਾ
ਅਸੀਂ ਇੱਕ ਸਮਰਪਿਤ ਸਰਵਰ 'ਤੇ ਇੱਕ ਵੱਖਰੀ ਫਲਾਸਕ ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਉਂਦੇ ਹਾਂ:
ਮੁੱਖ ਵੈੱਬ ਸਰਵਰ
↓ 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" ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀਆਂ ਟ