સર્ચ સર્વિસ આર્કિટેક્ચર: વલ્કી સાથે સ્ટેન્ડઅલોન ફ્લાસ્ક એપ્લિકેશન

આ લેખ સમજાવે છે કે કેવી રીતે અમારી સર્ચ સર્વિસ એક અલગ સર્વર પર વલ્કી (રેડિસ ફોર્ક) સાથે હાઇ-પર્ફોર્મન્સ વેક્ટર સર્ચ, કેશિંગ અને ઓટોકમ્પ્લીટ માટે સ્ટેન્ડઅલોન ફ્લાસ્ક એપ્લિકેશન તરીકે ચાલે છે.

સમસ્યા: સર્ચ પર્ફોર્મન્સ અને સ્કેલેબિલિટી

સર્ચ ઓપરેશન્સ કોમ્પ્યુટેશનલી ખર્ચાળ છે:

  • ફિલ્ટર એક્સ્ટ્રેક્શન: દરેક ક્વેરી સામે 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 દ્વારા સર્ચ સર્વિસને કોલ કરે છે:

ફિલ્ટર એક્સ્ટ્રેક્શન

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_filters?q=...

સંબંધિત શોધ

```python import requests

response = requests.post( "SEARCH_S