ਖੋਜ ਸੇਵਾ ਆਰਕੀਟੈਕਚਰ: ਵਲਕੀ ਨਾਲ ਸਟੈਂਡਅਲੋਨ ਫਲਾਸਕ ਐਪਲੀਕੇਸ਼ਨ

ਇਹ ਲੇਖ ਦੱਸਦਾ ਹੈ ਕਿ ਕਿਵੇਂ ਸਾਡੀ ਖੋਜ ਸੇਵਾ ਇੱਕ ਵੱਖਰੇ ਸਰਵਰ 'ਤੇ ਇੱਕ ਸਟੈਂਡਅਲੋਨ ਫਲਾਸਕ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਰੂਪ ਵਿੱਚ ਚਲਦੀ ਹੈ, ਜੋ ਉੱਚ-ਕਾਰਗੁਜ਼ਾਰੀ ਵੈਕਟਰ ਖੋਜ, ਕੈਸ਼ਿੰਗ, ਅਤੇ ਆਟੋਕੰਪਲੀਟ ਲਈ ਵਲਕੀ (ਰੈਡਿਸ ਫੋਰਕ) ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ।

ਸਮੱਸਿਆ: ਖੋਜ ਕਾਰਗੁਜ਼ਾਰੀ ਅਤੇ ਸਕੇਲਬਿਲਟੀ

ਖੋਜ ਕਾਰਵਾਈਆਂ ਕੰਪਿਊਟੇਸ਼ਨਲ ਤੌਰ 'ਤੇ ਮਹਿੰਗੀਆਂ ਹਨ:

  • ਫਿਲਟਰ ਨਿਕਾਸ: ਹਰੇਕ ਕੁਐਰੀ ਦੇ ਵਿਰੁੱਧ 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"
}

ਲਾਗੂ ਕਰਨਾ:

ਕੈਸ਼ਿੰਗ: ਵਾਕਾਂਸ਼ ਮੈਪਿੰਗਜ਼ ਵਲਕੀ ਵਿੱਚ ਕੈਸ਼ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ (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" ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀਆਂ ਟ