સર્ચ સર્વિસ આર્કિટેક્ચર: વલ્કી સાથે સ્ટેન્ડઅલોન ફ્લાસ્ક એપ્લિકેશન
આ લેખ સમજાવે છે કે કેવી રીતે અમારી સર્ચ સર્વિસ એક અલગ સર્વર પર વલ્કી (રેડિસ ફોર્ક) સાથે હાઇ-પર્ફોર્મન્સ વેક્ટર સર્ચ, કેશિંગ અને ઓટોકમ્પ્લીટ માટે સ્ટેન્ડઅલોન ફ્લાસ્ક એપ્લિકેશન તરીકે ચાલે છે.
સમસ્યા: સર્ચ પર્ફોર્મન્સ અને સ્કેલેબિલિટી
સર્ચ ઓપરેશન્સ કોમ્પ્યુટેશનલી ખર્ચાળ છે:
-
ફિલ્ટર એક્સ્ટ્રેક્શન: દરેક ક્વેરી સામે 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 દ્વારા સર્ચ સર્વિસને કોલ કરે છે:
ફિલ્ટર એક્સ્ટ્રેક્શન
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