यदि आप SearchRank
को छोड़ देते हैं और केवल क्वेरी का उपयोग करके फ़िल्टर करें यह GIN अनुक्रमणिका का उपयोग करेगा और बहुत तेज़ प्रदर्शन करेगा:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
आप .explain()
जोड़ सकते हैं।
क्वेरी पर एक नज़र डालने के लिए और यह देखने के लिए कि क्या अनुक्रमणिका का उपयोग किया गया है:
print(entries.explain(analyze=True))
आपको बिटमैप हीप स्कैन का उपयोग करके क्वेरी देखनी चाहिए और निष्पादन समय बहुत तेज़ होना चाहिए।
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
जब आप टिप्पणी करते हैं जैसे आप ऊपर हैं, तो आप प्रत्येक . पर टिप्पणी कर रहे हैं Article
ऑब्जेक्ट - इसलिए पोस्टग्रेज़ एक सेक स्कैन (या समानांतर सेक स्कैन) करने का निर्णय लेता है जो यह तय करता है कि यह अधिक कुशल है। अधिक जानकारी यहां
जोड़ने का प्रयास करें .explain(verbose=True)
या .explain(analyze=True)
तुलना करने के लिए अपनी प्रारंभिक SearchRank विधि से।
query = SearchQuery(termo,config='portuguese')
search_rank = SearchRank(F('search_vector'), query)
entries = Article.objects.annotate(rank=search_rank).filter(search_vector=query).order_by('-rank')
print(entries.explain(analyze=True))
मैं स्वयं इस मुद्दे का सामना कर रहा हूं, जिसमें 990k प्रविष्टियों वाली एक तालिका है जिसमें ~ 10 सेकंड लगते हैं। यदि आप किसी अन्य फ़ील्ड का उपयोग करके एनोटेशन से पहले क्वेरी को फ़िल्टर कर सकते हैं - यह क्वेरी प्लानर को इंडेक्स का उपयोग करने की ओर वापस धकेल देगा।
इस उत्तर से