2009-10-08 18 views
15

मैं स्टैक ओवरव्लो से सैंपल डेटा के रूप में सितंबर डेटा डंप का उपयोग करके 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 द्वारा प्रदान की गई सुविधाओं के बारे में जानने की कोशिश कर रहा हूं।

उत्तर

5

CREATE INDEX PostText_GIST ON Posts USING GIST(PostText varchar_pattern_ops); 

जो उपसर्ग प्रश्नों के लिए उपयुक्त अनुक्रमणिका बनाता है की कोशिश करो। Operator Classes and Operator Families पर PostgreSQL दस्तावेज़ देखें। @@ ऑपरेटर शब्द वैक्टरों पर केवल समझदार है; जीआईएसटी इंडेक्स (varchar_pattern_ops के साथ) LIKE के साथ उत्कृष्ट परिणाम देगा।

+0

धन्यवाद, मैं मैं आपके सुझाव का प्रयास करने जा रहा हूं ... –

+1

उस सूचकांक को उत्पन्न करने में काफी समय लगेगा। :) –

+5

यह संभवतः काम नहीं कर सकता क्योंकि 'varchar_pattern_ops' प्रकार' varchar' के लिए है, और 'पोस्टटेक्स्ट' प्रकार' tsvector' है, और इसे केवल 'btree' और' हैश 'इंडेक्स के लिए परिभाषित किया गया है, न कि' gist' के लिए। –

6

यदि आप रुचि रखते हैं तो दस्तावेज़ों में जीआईएसटी और जीआईएन इंडेक्स के बीच प्रदर्शन अंतर का एक अच्छा अवलोकन है: GiST and GIN Index Types

2

Btw: अगर यह अभी तक अपने संतोषजनक जवाब मिल गया नहीं किया है, हिस्सा है जहां तुमने किया था

SELECT * FROM Posts WHERE PostText @@ 'postgresql';

किया जाना चाहिए था आपके उत्तर के लिए

SELECT * FROM Posts WHERE PostText @@ to_tsquery('postgresql');

+0

टिप के लिए धन्यवाद, अगली बार जब मैं PostgreSQL का परीक्षण करता हूं तो मैं इसे आज़माउंगा। मैं कुछ वर्षों के लिए विशेष रूप से MySQL का उपयोग कर रहा हूं। –

संबंधित मुद्दे