2011-12-10 6 views
6

क्या MySQL में पूरी तालिका स्कैन किए बिना उपरोक्त करने के लिए कोई अंतर्निहित कार्यक्षमता है?mysql: पोस्टफिक्स-खोज के लिए कुशल तरीका (जैसे '% text' उर्फ। Prefix वाइल्डकार्ड)?

केवल मुझे मिला समाधान केवल कॉलम का एक प्रतिबिंबित संस्करण संग्रहीत करना है जिसे मैं तुलना करना चाहता हूं और like 'txet%' करता हूं।

मुझे पोस्टफिक्स-सर्च के आसपास होने का कोई तरीका नहीं दिखता है। यह एक जर्मन शब्दकोश के लिए है। कई शब्दों में उपसर्ग के साथ एक संस्करण है, उदा। उपयोगकर्ता "Gericht" (Engl। curt) की खोज करता है, लेकिन यह जानना भी मूल्यवान है कि "Amtsgericht" (Engl। जिला कर्ट) शब्द है। दुर्भाग्य से अक्सर जर्मन भाषा में शब्द के दो हिस्सों को अलग करने की कोई जगह नहीं है। लगभग 15% प्रश्न वास्तव में उपसर्ग-खोज का उपयोग करते हैं।

+0

'mysql स्फिंक्स engine' पर या' अपाचे solr' पर एक नजर है – cristian

+0

स्फिंक्स के संकेत के लिए धन्यवाद! यह कुछ अन्य चुनौतियों का सामना कर सकता है जो मुझे सामना कर रहा है उदा। उत्पन्न। इस पोस्ट की समस्या के लिए मैं अन्य उत्तरों द्वारा पुष्टि के रूप में उल्टा कॉलम दृष्टिकोण का उपयोग करूंगा। यह सबसे तेज़ समाधान होगा, और कम से कम निर्भरता वाला एक होगा। – user1091141

उत्तर

7

रिवर्स क्षेत्र के ऊपर एक सूचकांक समाधान हो जाएगा, कुछ लगता है जैसे:

create index idx_reverse on table (reverse(field)); 
select * from table where reverse(field) like 'txet%'; 

लेकिन MySQL भाव से अधिक, केवल स्तंभों पर सूचकांक alow नहीं है:

:

इस MySQL create index syntax है

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name 
    [index_type] 
    ON tbl_name (index_col_name,...) 
    [index_option] ... 

यह postgres create index syntax है:

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ] 
    ({ column | (expression) } [ opclass ] [, ...]) 
    ... 

के चारों ओर एक काम अनुक्रमित दूसरे क्षेत्र (क्षेत्र -> dleif) बना हो सकता है और एक mysql trigger उलट क्षेत्र रखने के लिए:

alter table my_table add column dleif ...; 
create index idx_reverse on my_table (dleif); 
Create Trigger `reverse_field` Before Update on `my_table` for each row BEGIN 
    set new.dleif = reverse(new.field); 
END; 
select * from table where dleif like reverse('%text'); 
1

MySQL किसी इंडेक्स का उपयोग नहीं करेगा जब आपका मान वाइल्डकार्ड वर्ण से शुरू होता है।

रिवर्स ऑर्डर में दूसरा कॉलम संग्रहीत करना एक रक्षात्मक दृष्टिकोण है। हालांकि, यह एक प्रत्यय पर असफल हो जाएगा।

यदि आप मिश्रित शब्दों को जानते हैं, तो आप "मूल्यवान जानना" मैचों की पूर्व-गणना कर सकते हैं और उन्हें किसी अन्य तालिका में स्टोर कर सकते हैं। मुझे लगता है कि जर्मन शब्दकोश के लिए अच्छी तरह से काम करने की संभावना नहीं है, लेकिन आपको कुछ ऐसा पता हो सकता है जो मैं नहीं करता हूं।

+0

मिश्रित शब्दों के साथ विचार के लिए धन्यवाद। मुझे लगता है कि यह इंफिक्स खोज (जैसे '% text%') के लिए उपयोगी होगा। लेकिन चूंकि मैं या तो उपसर्ग या पोस्टफिक्स कर रहा हूं लेकिन इन्फिक्स नहीं करता, इसलिए उल्टा स्तंभ दृष्टिकोण मैं करता हूं। इसके अलावा, हालांकि मैं जर्मन मूल निवासी हूं, इसके लिए पहले व्याकरण पर कुछ शोध की आवश्यकता होगी और मुझे संदेह है कि जर्मन भाषा में परिसर बनाने की संभावनाएं अनंत हैं और इस प्रकार बड़ी मात्रा में डेटा की आवश्यकता होगी। – user1091141

+0

मैं जर्मनी में रहता था। मेरी धारणा यह है कि आप किसी भी 'एन' जर्मन शब्दों से वैध यौगिक शब्द बना सकते हैं। और 'एन' पर कोई ऊपरी सीमा नहीं है। –

+0

हां यह सच है। एक क्लासिक उदाहरण: डोनाउडैम्पसेचिफफहर्ट्सजेल्सचाफ्ट। इसमें पांच संज्ञाएं डोनौ, डैम्पफ, शिफ, फ़हर्ट, और गेसेलस्काफ्ट शामिल हैं ... :) – user1091141

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