2009-02-03 14 views
11

में उपयोग किए जाने वाले खोज शब्द को उपयोगकर्ता द्वारा दर्ज की गई खोज क्वेरी को कनवर्ट करना, उपयोगकर्ता द्वारा दर्ज खोज शब्दों को परिवर्तित करने का सबसे अच्छा तरीका क्या है, जो कि पूर्ण-पाठ खोज के लिए एक खंड में उपयोग किया जा सकता है एक टेबल से पूछताछ और प्रासंगिक परिणाम वापस पाने के लिए?SQL सर्वर पूर्ण-पाठ खोज

SELECT * FROM MyTable WHERE (CONTAINS(*, '"e-mail"')) AND (CONTAINS(*, '"attachment"')) AND (NOT CONTAINS(*, '"word document"')) AND (NOT CONTAINS(*, '"e-learning"')) 

मैं पल, जो क्वेरी टोकन में उपयोगकर्ताओं द्वारा दर्ज पार्स करता है पर एक query parser class उपयोग कर रहा हूँ:

+"e-mail" +attachment -"word document" -"e-learning" 

की तरह कुछ में अनुवाद चाहिए: उदाहरण के लिए, निम्न क्वेरी उपयोगकर्ता द्वारा दर्ज नियमित अभिव्यक्ति का उपयोग करके, और तब टोकन से जहां खंड बनाते हैं।

हालांकि, यह देखते हुए कि यह पूर्ण-पाठ खोज का उपयोग करके कई प्रणालियों द्वारा संभवतः एक आम आवश्यकता है, मैं इस बात से उत्सुक हूं कि अन्य डेवलपर्स ने इस समस्या से कैसे संपर्क किया है, और क्या चीजों को करने का बेहतर तरीका है।

उत्तर

5

यह वही नहीं हो सकता है जो आप खोज रहे हैं लेकिन यह आपको कुछ और विचारों की पेशकश कर सकता है।

http://www.sqlservercentral.com/articles/Full-Text+Search+(2008)/64248/

+0

मैंने कोशिश की है और यह वास्तव में महान नहीं है। –

+2

एनबी: अनुच्छेद को ईमेल न्यूज़लेटर में पंजीकरण और सदस्यता की आवश्यकता होती है (इसलिए यदि आप ऐसी चीज के साथ रख सकते हैं तो कोई समस्या नहीं है) –

+0

यह अच्छी तरह से काम करता है। आप इसे नीचे कार्यान्वित करने के तरीके को देख सकते हैं। – franzo

0

मुझे एहसास है कि यह आपके मूल प्रश्न से एक साइड-स्टेप का थोड़ा सा है, लेकिन क्या आपने एसक्यूएल फुलटेक्स्ट इंडेक्स से दूर जाने और Lucene/Solr जैसे कुछ का उपयोग करने पर विचार किया है?

+0

हाँ, मैं किसी बिंदु पर लुसीन में जाना चाहता हूं, हालांकि मैंने इसे अतीत में छुआ है और हालांकि मूल बातें स्थापित करना अपेक्षाकृत सरल है, जो मुझे अब भी वही काम करने के लिए मिल रहा है थोड़ा और काम है, इसलिए मैंने इसे पकड़ लिया है। – Mun

0

यह करने के लिए सबसे आसान तरीका है (, मुझे पता है यहां सुरक्षा के मुद्दों को सम्मिलित) गतिशील एसक्यूएल का उपयोग करें और सही रूप से फ़ॉर्मेट स्ट्रिंग में वाक्यांश को तोड़ने के लिए है।

आप एक तालिका चर में वाक्यांश को तोड़ने के लिए एक फ़ंक्शन का उपयोग कर सकते हैं जिसका उपयोग आप नई स्ट्रिंग बनाने के लिए कर सकते हैं।

0

गोल्डपार्सर और कैलिथा का एक संयोजन आपको यहां हल करना चाहिए।

यह आलेख: http://www.15seconds.com/issue/070719.htm में एक googleToSql क्लास भी है, जो आपके लिए कुछ अनुवाद करता है।

7

कैसे नेट/सी #/इकाई की रूपरेखा का उपयोग कर स्वीकार जवाब लागू करने के लिए ...

  1. nuget का उपयोग कर विडंबना को स्थापित करें। इस तरह http://irony.codeplex.com/SourceControl/latest#Irony.Samples/FullTextSearchQueryConverter/SearchGrammar.cs

  2. लिखें कोड एक सवाल के उपयोगकर्ता के प्रवेश किया स्ट्रिंग परिवर्तित करने के लिए:

  3. से नमूना वर्ग जोड़ें।

    var grammar = new Irony.Samples.FullTextSearch.SearchGrammar(); 
    var parser = new Irony.Parsing.Parser(grammar); 
    var parseTree = parser.Parse(userEnteredSearchString); 
    string query = Irony.Samples.FullTextSearch.SearchGrammar.ConvertQuery(parseTree.Root); 
    
  4. शायद इस तरह एक संग्रहीत प्रक्रिया लिखें:

    create procedure [dbo].[SearchLivingFish] 
    
    @Query nvarchar(2000) 
    
    as 
    
    select * 
    from Fish 
    inner join containstable(Fish, *, @Query, 100) as ft 
    on ft.[Key] = FishId 
    where IsLiving = 1 
    order by rank desc 
    
  5. जिज्ञासा चलाएँ।

    var fishes = db.SearchLivingFish(query); 
    
1

इसके अलावा आप ऊपर @ franzo के जवाब देने के लिए शायद यह भी एसक्यूएल में डिफ़ॉल्ट रोक शब्द व्यवहार बदलना चाहते हैं। अन्यथा एकल अंक संख्या (या अन्य स्टॉप शब्द) वाले प्रश्नों से कोई परिणाम नहीं आएगा।

या तो अक्षम रोकने वाले शब्द, अपने खुद के रोक शब्द सूची और/या शोर शब्द सेट बनाने के रूप में SQL 2008: Turn off Stop Words for Full Text Search Query

में विस्तार से बताया (English) एसक्यूएल रोकने वाले शब्द की प्रणाली सूची देखने के लिए तब्दील किया जा करने के लिए, चलाएँ:

select * from sys.fulltext_system_stopwords where language_id = 1033