मैं स्टैक ओवरव्लो से सैंपल डेटा के रूप में सितंबर डेटा डंप का उपयोग करके PostgreSQL टेक्स्ट-सर्च फीचर्स का परीक्षण कर रहा हूं। :-)पोस्टग्रेएसक्यूएल टेक्स्ट-सर्च जीआईएसटी इंडेक्स जीआईएन इंडेक्स की तुलना में इतनी धीमी क्यों है?
LIKE
विधेय का उपयोग कर या POSIX रेगुलर अभिव्यक्ति 12 लाख पंक्तियों खोज करने के लिए मिलान के अनुभवहीन दृष्टिकोण के बारे में 90-105 सेकंड (मेरी मैकबुक पर) लेता है एक पूर्ण तालिका स्कैन किसी कीवर्ड की खोज करते हैं।
ALTER TABLE Posts ADD COLUMN PostText TSVECTOR;
UPDATE Posts SET PostText = to_tsvector(body);
CREATE INDEX PostText_GIN ON Posts USING GIN(PostText);
(मैं:
SELECT * FROM Posts WHERE to_tsvector(body) @@ to_tsquery('postgresql');
एक जिन सूचकांक बनाने के बारे में 40 मिनट लेता है:
SELECT * FROM Posts WHERE body LIKE '%postgresql%';
SELECT * FROM Posts WHERE body ~ 'postgresql';
एक unindexed, तदर्थ पाठ खोज प्रश्न के बारे में 8 मिनट लेता है मुझे एहसास है कि मैं इसे अभिव्यक्ति सूचकांक के रूप में परिभाषित करके एक चरण में भी कर सकता हूं।)
बाद में, एक प्रश्न एक जिन सूचकांक द्वारा सहायता प्रदान की एक बहुत तेजी से चलाता है - इस बारे में 40 मिलीसेकंड लेता है:
SELECT * FROM Posts WHERE PostText @@ 'postgresql';
हालांकि, जब मैं एक सार सूचकांक बनाएं, परिणाम काफी अलग हैं। यह कम से कम 2 मिनट लेता सूचकांक बनाने के लिए:
CREATE INDEX PostText_GIN ON Posts USING GIST(PostText);
बाद में, @@
पाठ खोज ऑपरेटर का उपयोग कर एक प्रश्न 90-100 सेकंड लेता है। तो जीआईएसटी इंडेक्स 8 मिनट से 1.5 मिनट तक एक अनइंडेड टीएस क्वेरी में सुधार करता है। लेकिन LIKE
के साथ एक पूर्ण टेबल-स्कैन करने में कोई सुधार नहीं है। यह वेब प्रोग्रामिंग वातावरण में बेकार है।
क्या मुझे जीआईएसटी इंडेक्स का उपयोग करने के लिए कुछ महत्वपूर्ण याद आ रही है? क्या इंडेक्स को स्मृति या कुछ में पूर्व-कैश किया जाना चाहिए? मैं मैकपॉर्ट्स से एक सादे PostgreSQL स्थापना का उपयोग कर रहा हूं, बिना ट्यूनिंग के।
जीआईएसटी इंडेक्स का उपयोग करने के लिए अनुशंसित तरीका क्या है? या क्या पोस्टग्रेएसक्यूएल छोड़ने वाले सभी लोग जीएसटी इंडेक्स छोड़ते हैं और केवल जीआईएन इंडेक्स का उपयोग करते हैं?
पीएस: मुझे स्फिंक्स सर्च और लुसेन जैसे विकल्पों के बारे में पता है। मैं सिर्फ PostgreSQL द्वारा प्रदान की गई सुविधाओं के बारे में जानने की कोशिश कर रहा हूं।
धन्यवाद, मैं मैं आपके सुझाव का प्रयास करने जा रहा हूं ... –
उस सूचकांक को उत्पन्न करने में काफी समय लगेगा। :) –
यह संभवतः काम नहीं कर सकता क्योंकि 'varchar_pattern_ops' प्रकार' varchar' के लिए है, और 'पोस्टटेक्स्ट' प्रकार' tsvector' है, और इसे केवल 'btree' और' हैश 'इंडेक्स के लिए परिभाषित किया गया है, न कि' gist' के लिए। –