Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

प्रत्येक समूह के शीर्ष 5 पुन:खोज कुल रिटर्न

पहला:

  • उन सुविधाओं को अक्षम करना सुनिश्चित करें जिनका आप उपयोग नहीं करेंगे (NOOFFSETS , NOHL ,NOFREQS , STOPWORDS 0 )
  • SORTABLE का उपयोग करें आपके NUMERIC . के लिए score

यहाँ वह स्कीमा है जिसका मैं परीक्षण करता था:

FT.CREATE product_tags NOOFFSETS NOHL NOFREQS STOPWORDS 0
    SCHEMA product_name TEXT tags TAG score NUMERIC SORTABLE

आप FT.AGGREGATE के बारे में सोचना चाहते हैं एक पाइपलाइन के रूप में।

पहला कदम उत्पादों को @score द्वारा क्रमबद्ध करना होगा, ताकि बाद में, पाइपलाइन में नीचे, जब हम REDUCE TOLIST 1 @product_name , सूची क्रमबद्ध रूप से सामने आती है:

SORTBY 2 @score DESC

मुझे लगता है कि आप पहले से ही LOAD कर रहे हैं /APPLY टैग से निपटने के लिए, TAG . के रूप में फ़ील्ड को अन्यथा पूर्ण अल्पविराम से अलग किए गए स्ट्रिंग टैग-सूची, प्रति उत्पाद द्वारा समूहीकृत किया जाएगा। टैग फ़ील्ड समस्या पर GROUPBY को अनुमति दें देखें। तो हमारा अगला कदम पाइपलाइन में है:

LOAD 1 @tags 
APPLY split(@tags) as TAG 

फिर हम @TAG के आधार पर समूह बनाते हैं, और दो कटौतियों को लागू करते हैं। हमारे उत्पादों की सूची क्रमबद्ध हो जाएगी।

GROUPBY 1 @TAG
    REDUCE SUM 1 @score AS total_score
    REDUCE TOLIST 1 @product_name AS products

अंत में, हम @total_score . द्वारा क्रमबद्ध करते हैं :

SORTBY 2 @total_score DESC

यहाँ कमांड का अंतिम दृश्य है:

FT.AGGREGATE product_tags *
    SORTBY 2 @score DESC 
    LOAD 1 @tags 
    APPLY split(@tags) as TAG
    GROUPBY 1 @TAG
        REDUCE SUM 1 @score AS total_score 
        REDUCE TOLIST 1 @product_name AS products
    SORTBY 2 @total_score DESC

परिणाम को स्पष्ट करने के लिए आदेशों की पूरी सूची यहां दी गई है। मैंने productXX . का उपयोग किया है स्कोर के साथ XX उत्पादों की छँटाई को दृष्टिगत रूप से आसानी से सत्यापित करने के लिए।

> FT.CREATE product_tags NOOFFSETS NOHL NOFREQS STOPWORDS 0 SCHEMA product_name TEXT tags TAG score NUMERIC SORTABLE
OK
> FT.ADD product_tags pt:product10 1 FIELDS product_name product10 tags tag2,tag3,tag4 score 10
OK
> FT.ADD product_tags pt:product1 1 FIELDS product_name product1  tags tag1,tag2,tag3 score 1
OK
> FT.ADD product_tags pt:product100 1 FIELDS product_name product100 tags tag2,tag3 score 100
OK
> FT.ADD product_tags pt:product5 1 FIELDS product_name product5 tags tag1,tag4 score 5
OK
> FT.SEARCH product_tags *
1) (integer) 4
2) "pt:product5"
3) 1) "product_name"
   2) "product5"
   3) "tags"
   4) "tag1,tag4"
   5) "score"
   6) "5"
4) "pt:product100"
5) 1) "product_name"
   2) "product100"
   3) "tags"
   4) "tag2,tag3"
   5) "score"
   6) "100"
6) "pt:product1"
7) 1) "product_name"
   2) "product1"
   3) "tags"
   4) "tag1,tag2,tag3"
   5) "score"
   6) "1"
8) "pt:product10"
9) 1) "product_name"
   2) "product10"
   3) "tags"
   4) "tag2,tag3,tag4"
   5) "score"
   6) "10"
> FT.AGGREGATE product_tags * SORTBY 2 @score DESC LOAD 1 @tags APPLY split(@tags) as TAG GROUPBY 1 @TAG REDUCE SUM 1 @score AS total_score REDUCE TOLIST 1 @product_name AS products SORTBY 2 @total_score DESC
1) (integer) 4
2) 1) "TAG"
   2) "tag2"
   3) "total_score"
   4) "111"
   5) "products"
   6) 1) "product100"
      2) "product10"
      3) "product1"
3) 1) "TAG"
   2) "tag3"
   3) "total_score"
   4) "111"
   5) "products"
   6) 1) "product100"
      2) "product10"
      3) "product1"
4) 1) "TAG"
   2) "tag4"
   3) "total_score"
   4) "15"
   5) "products"
   6) 1) "product10"
      2) "product5"
5) 1) "TAG"
   2) "tag1"
   3) "total_score"
   4) "6"
   5) "products"
   6) 1) "product5"
      2) "product1"

आपको उत्पादों की पूरी सूची मिल रही है, न कि केवल शीर्ष 5। जटिलता के लिहाज से इससे कोई फर्क नहीं पड़ता, हमने कीमत चुकाई। प्रभाव बफरिंग, नेटवर्क पेलोड और आपके क्लाइंट में है।

आप लुआ स्क्रिप्ट का उपयोग करके शीर्ष 5 तक सीमित कर सकते हैं:

eval "local arr = redis.call('FT.AGGREGATE', KEYS[1], '*', 'SORTBY', '2', '@score', 'DESC', 'LOAD', '1', '@tags', 'APPLY', 'split(@tags)', 'as', 'TAG', 'GROUPBY', '1', '@TAG', 'REDUCE', 'SUM', '1', '@score', 'AS', 'total_score', 'REDUCE', 'TOLIST', '1', '@product_name', 'AS', 'products', 'SORTBY', '2', '@total_score', 'DESC') \n for i=2,(arr[1]+1) do \n arr[i][6] = {unpack(arr[i][6], 1, ARGV[1])} \n end \n return arr" 1 product_tags 5

यहाँ ऊपर लुआ लिपि का एक अनुकूल दृश्य है:

local arr = redis.call('FT.AGGREGATE', KEYS[1], ..., 'DESC')
for i=2,(arr[1]+1) do 
    arr[i][6] = {unpack(arr[i][6], 1, ARGV[1])}
end
return arr

हम एक कुंजी (सूचकांक) और एक तर्क (शीर्ष उत्पादों की सीमा, आपके मामले में 5) पास कर रहे हैं:1 product_tags 3

इसके साथ, हमने प्रभाव को केवल बफरिंग, सहेजे गए नेटवर्क पेलोड और आपके क्लाइंट पर लोड तक सीमित कर दिया।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Django, Redis:कनेक्शन-कोड कहां रखें

  2. मैं रेडिस-सर्वर को कैसे रोक सकता हूं?

  3. पायरो का उपयोग करके पांडस डेटाफ्रेम को रेडिस में कैसे सेट/प्राप्त करें?

  4. साइडकीक पर रेडिस 6 के लिए टीएलएस कैसे सक्षम करें?

  5. जावास्क्रिप्ट में रेडिस में सभी कुंजी और मान कैसे प्राप्त करें?