आप pg_trgm
. द्वारा प्रदान किए गए ऑपरेटर वर्ग का उपयोग नहीं कर रहे हैं मापांक। मैं इस तरह एक इंडेक्स बनाउंगा:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
मूल रूप से, मेरे पास यहां एक जीआईएन इंडेक्स था, लेकिन बाद में मुझे पता चला कि एक जीआईएसटी शायद इस तरह की क्वेरी के लिए बेहतर अनुकूल है क्योंकि यह समानता के आधार पर मूल्यों को वापस कर सकता है। अधिक विवरण:
- Postgresql:दो स्तंभों के बीच मिलान पैटर्न
- PostgreSQL के साथ समान स्ट्रिंग्स को शीघ्रता से ढूँढना
इसका उपयोग करने में सक्षम होने के लिए आपकी क्वेरी को इंडेक्स एक्सप्रेशन से मेल खाना चाहिए।
SELECT label
FROM the_table
WHERE lower(unaccent_text(label)) % 'fil'
ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
हालांकि, % ऑपरेटर के अनुसार "फिलबर्ट" और "फाइल पाउडर" वास्तव में "फिल" के समान नहीं हैं। मुझे संदेह है कि आप वास्तव में क्या चाहते हैं:
SELECT label FROM the_table WHERE lower(unaccent_text(label)) ~~ '%fil%' ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
यह खोज स्ट्रिंग वाले सभी स्ट्रिंग्स को ढूंढेगा, और %
. के अनुसार सर्वोत्तम मिलानों को सॉर्ट करेगा पहले ऑपरेटर।
और रसदार हिस्सा:पोस्टग्रेएसक्यूएल 9.1 . के बाद से अभिव्यक्ति GIN या GiST अनुक्रमणिका का उपयोग कर सकती है ! मैं मैनुअल को pg_trgm moule पर उद्धृत करता हूं:
<ब्लॉकक्वॉट>PostgreSQL 9.1 से शुरू होकर, ये अनुक्रमणिका प्रकार LIKE और ILIKE के लिए अनुक्रमणिका खोज का भी समर्थन करते हैं, उदाहरण के लिए
यदि आप वास्तव में %
. का उपयोग करना चाहते थे ऑपरेटर:
क्या आपने सीमा कम करने . की कोशिश की है समानता ऑपरेटर के लिए %
set_limit()
. के साथ :
SELECT set_limit(0.1);
या उससे भी कम? डिफ़ॉल्ट 0.3 है। बस यह देखने के लिए कि क्या यह वह सीमा है जो अतिरिक्त मिलानों को फ़िल्टर करती है।