FTS समर्थन नहीं करता है LIKE
पहले से स्वीकार किए जाते हैं जवाब गलत था। पूर्ण पाठ अनुक्रमणिका के साथ पूर्ण पाठ खोज ऑपरेटर के लिए बिल्कुल भी नहीं हैLIKE
, इसके अपने ऑपरेटर हैं और यह मनमाने तार के लिए काम नहीं करता है। यह शब्दकोशों और उपजी के आधार पर शब्दों पर काम करता है। यह शब्दों के लिए उपसर्ग मिलान का समर्थन करता है , लेकिन ऑपरेटर के साथ नहीं :LIKE
के लिए ट्रिग्राम इंडेक्स LIKE
अतिरिक्त मॉड्यूल स्थापित करें pg_trgm
जो सभी और पैटर्न का समर्थन करने के लिए GIN और GiST ट्रिग्राम इंडेक्स के लिए ऑपरेटर कक्षाएं प्रदान करता है , न केवल बाएं-लंगर वाले लोगों को:LIKE
ILIKE
उदाहरण सूचकांक:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
या:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
उदाहरण क्वेरी:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigrams? छोटे तार के बारे में क्या?
अनुक्रमित मूल्यों में 3 से कम अक्षरों वाले शब्द अभी भी काम करते हैं। नियम पुस्तिका:
प्रत्येक शब्द को दो स्थानों को उपसर्ग माना जाता है और एक स्थान स्ट्रिंग में निहित त्रिकोण के सेट का निर्धारण करते समय प्रत्यय होता है।
और कम से कम 3 अक्षरों के साथ खोज पैटर्न? नियम पुस्तिका:
दोनों LIKE
और नियमित-अभिव्यक्ति खोजों के लिए, ध्यान रखें कि बिना निकालने योग्य ट्रिगर्स वाला एक पैटर्न पूर्ण-सूचकांक स्कैन को पतित कर देगा।
मतलब, वह इंडेक्स / बिटमैप इंडेक्स स्कैन अभी भी काम करता है (तैयार स्टेटमेंट के लिए क्वेरी प्लान नहीं टूटेगा), यह आपको बेहतर प्रदर्शन नहीं देगा। आमतौर पर कोई बड़ा नुकसान नहीं होता है, क्योंकि 1- या 2-अक्षर तार शायद ही चयनात्मक होते हैं (अंतर्निहित टेबल मैचों के कुछ प्रतिशत से अधिक) और सूचकांक समर्थन के साथ प्रदर्शन में सुधार नहीं होगा, क्योंकि एक पूर्ण तालिका स्कैन तेज है।
text_pattern_ops
उपसर्ग मिलान के लिए
केवल बाएं-लंगर वाले पैटर्न (कोई अग्रणी वाइल्डकार्ड) के लिए आपको btree इंडेक्स के लिए उपयुक्त ऑपरेटर वर्ग के साथ इष्टतम मिलता है : text_pattern_ops
या varchar_pattern_ops
। दोनों में निर्मित मानक Postgres की सुविधाएँ, कोई अतिरिक्त मॉड्यूल की आवश्यकता नहीं है। समान प्रदर्शन, लेकिन बहुत छोटे सूचकांक।
उदाहरण सूचकांक:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
उदाहरण क्वेरी:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
या , यदि आपको अपना डेटाबेस loc C ’ लोकेल (प्रभावी रूप से कोई लोकेल) के साथ चलना चाहिए , तो सब कुछ बाइट ऑर्डर के अनुसार क्रमबद्ध हो जाता है और डिफॉल्ट ऑपरेटर क्लास वाला एक सादा btree इंडेक्स काम करता है।
Dba.SE पर इन संबंधित उत्तरों में अधिक विवरण, स्पष्टीकरण, उदाहरण और लिंक: