2012-05-16 6 views
7

के साथ Google की तरह सुझाव देता है कि मैं google suggestions जैसे टेक्स्ट खोज करना चाहता हूं।पोस्टग्रेस्क्ल ट्रिग्राम और पूर्ण टेक्स्ट खोज

मैं जादुई Postgis की वजह से PostgreSQL का उपयोग कर रहा हूं।

मैं FTS का उपयोग करने पर सोच रहा था, लेकिन मैंने देखा कि यह partial words खोज नहीं कर सकता है, तो मैं this question पाया, और देखा कि trigrams काम करता है।

मुख्य समस्या यह है कि मैं जिस खोज इंजन पर काम कर रहा हूं वह स्पैनिश भाषा के लिए है। एफटीएस ने स्टेमिंग और dictionaries (समानार्थी, गलत वर्तनी), यूटीएफ और इसी तरह के साथ बहुत अच्छा काम किया। ट्राइग्राम ने आंशिक शब्दों के लिए बहुत अच्छा काम किया, लेकिन वे केवल एएससीआईआई के लिए काम करते हैं, और (जाहिर है) वे शब्दकोश जैसी चीजों का उपयोग नहीं करते हैं।

मैं सोच रहा था कि क्या कोई तरीका है जिसमें दोनों से सबसे अच्छी चीजों का उपयोग किया जा सकता है।

क्या यह संभव है कि पूर्ण पाठ खोज और ट्रिग्राम पीजीएसक्यूएल में मिलकर काम करें?

उत्तर

3

आप पोस्टग्रेज़ में ऐसा कर सकते हैं, और लुसीन की आवश्यकता नहीं है।

आप नीचे दिए गए tsquery या tsvector में वाक्यांशों को उद्धृत कर सकते हैं। आप एक tsquery अवधि के बाद एक :* जोड़ने एक उपसर्ग खोज करने के लिए कर सकते हैं:

select 
'''new york city'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york times'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york'''::tsvector  @@ '''new yo'':*'::tsquery, --true 
'''new'''::tsvector    @@ '''new yo'':*'::tsquery, --false 
'new'::tsvector     @@ '''new yo'':*'::tsquery, --false 
'new york'::tsvector   @@ '''new yo'':*'::tsquery --false 

मुख्य समस्या यह है कि to_tsvector() और [plain]to_tsquery() आपके उद्धरण पट्टी जाएगा। आप अपने खुद के संस्करण लिख सकते हैं जो ऐसा नहीं करते हैं (यह मुश्किल नहीं है), या उनके बाद एन-ग्राम बनाने के लिए कुछ पोस्ट-प्रोसेसिंग करें।

ऊपर दिए गए अतिरिक्त एकल उद्धरण केवल बच निकले हैं। select $$ i heart 'new york city' $$::tsvector; बराबर है।

+0

वाह! क्या आप कृपया इस ट्रिपल कोट के बारे में दस्तावेज़ीकरण का संदर्भ जोड़ सकते हैं? – jperelli

+1

ट्रिपल कोट वास्तव में सामान्य एसक्यूएल है, मैं बस एक दूसरे के साथ एक उद्धरण से बच रहा हूँ। दस्तावेज़ यहां इसका उल्लेख करते हैं: http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

मैं Lucene पर एक नज़र रखने की अनुशंसा करता हूं। इसे जावा में आसानी से एकीकृत किया जा सकता है, आसानी से .NET में या PHP में एसओएलआर और वेब सेवाओं का उपयोग कर।

इसमें मुफ्त टेक्स्ट खोजों, बॉक्स के बाहर शब्द रैंकिंग, विभिन्न Analysers (स्पैनिश एक के लिए लिंक) का उपयोग करके विभिन्न भाषाओं के लिए समर्थन की बहुत अच्छी क्षमता है।

अंतिम लेकिन कम से कम नहीं, यह भी बहुत तेज़ है (बड़ी मात्रा के लिए, डीबी में 4 जीबी इंडेक्स ~ 5 000 000 पंक्तियां कहें, यह पोस्टग्रेज़ डेटाबेस से बहुत तेज है)।

+3

मैं लोचदार खोज का उपयोग कर एक समान समाधान के साथ जाऊंगा, लेकिन मैं स्वीकार नहीं कर सकता, क्योंकि यह प्रश्न का उत्तर नहीं देता है (अगर कोई यहां उत्तर की तलाश में आता है)। धन्यवाद! – jperelli

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

  • कोई संबंधित समस्या नहीं^_^