SQL सर्वर में काम करने के लिए आप अग्रणी वाइल्डकार्ड पूर्ण-पाठ खोज कैसे प्राप्त करते हैं?

Note: I am using SQL's Full-text search capabilities, CONTAINS clauses and all - the * is the wildcard in full-text, % is for LIKE clauses only.

मैंने अब कई जगहों पर पढ़ा है कि "अग्रणी वाइल्डकार्ड" खोज (उदाहरण के लिए "स्टैक ओवरफ्लो" से मेल खाने के लिए "* ओवरफ्लो" का उपयोग करना) एमएस एसक्यूएल में समर्थित नहीं है। मैं एक CLR फ़ंक्शन का उपयोग करने पर विचार कर रहा हूं रेगेक्स मिलान जोड़ने के लिए , लेकिन मैं यह देखने के लिए उत्सुक हूं कि लोगों के पास अन्य समाधान क्या हो सकते हैं।

More Info: You can add the asterisk only at the end of the word or phrase. - along with my empirical experience: When matching "myvalue", "my*" works, but "(asterisk)value" returns no match, when doing a query as simple as:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

इस प्रकार, एक कामकाज की मेरी ज़रूरत है। मैं केवल एक वास्तविक खोज पृष्ठ पर अपनी साइट में खोज का उपयोग कर रहा हूं - इसलिए इसे मूल रूप से उसी तरह काम करने की ज़रूरत है जो Google काम करता है (जो छः पटकथा प्रकार के उपयोगकर्ता पर आंखों में)। लगभग जटिल नहीं है, लेकिन इस तरह का मैच वास्तव में असफल नहीं होना चाहिए।

0
जोड़ा संपादित
विचारों: 2

12 उत्तर

अग्रणी वाइल्डकार्ड के साथ समस्या: उन्हें अनुक्रमित नहीं किया जा सकता है, इसलिए आप एक पूर्ण टेबल स्कैन कर रहे हैं।

0
जोड़ा

'%' वर्ण का उपयोग करके मैंने निम्नलिखित कुछ का उपयोग करके हमारे डेटाबेस की खोज की है:

SELECT name FROM TblNames WHERE name LIKE '%overflow'

इस फ़ॉर्म या क्वेरी का प्रयोग कई बार धीमा हो सकता है लेकिन हम इसे कभी-कभी मैन्युअल खोज के लिए उपयोग करते हैं।

0
जोड़ा

ध्यान में रखना एक बात यह है कि अन्य वाइल्डकार्ड उपयोगों की तुलना में अग्रणी वाइल्डकार्ड प्रश्न महत्वपूर्ण प्रदर्शन प्रीमियम पर आते हैं।

0
जोड़ा

% अक्षरों की संख्या से मेल खाता है     _ एक एकल चरित्र से मेल खाता है

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

0
जोड़ा

ऑनलाइन SQL सर्वर पुस्तकें से:

पूर्ण-पाठ क्वेरी लिखने के लिए   माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005, आपको चाहिए   जानें कि कंटेनर का उपयोग कैसे करें और   FREETEXT ट्रांजैक्ट-एसक्यूएल भविष्यवाणी करता है, और   CONTAINSTABLE और FREETEXTTABLE   rowset- मूल्यवान कार्यों।

इसका मतलब है कि% और _ के साथ ऊपर लिखे गए सभी प्रश्न पूर्ण पाठ प्रश्न मान्य नहीं हैं।

CONTAINSTABLE फ़ंक्शन को कॉल करते समय एक क्वेरी कैसा दिखता है इसका नमूना यहां दिया गया है।

चयन करें, * तालिका नाम से,   सम्मिलित (तालिका नाम, *, '   "* वाइल्डकार्ड" ') खोजेबल कहां है     [कुंजी] = TableName.pk आदेश द्वारा     searchTable.RANK DESC

CONTAINSTABLE फ़ंक्शन को यह जानने के लिए कि मैं वाइल्डकार्ड खोज का उपयोग कर रहा हूं, मुझे इसे डबल कोट्स में लपेटना है। मैं शुरुआत या समाप्ति पर वाइल्डकार्ड चरित्र * का उपयोग कर सकता हूं। जब आप CONTAINSTABLE फ़ंक्शन के लिए खोज स्ट्रिंग बना रहे हैं तो आप कई अन्य चीजें कर सकते हैं। आप किसी अन्य शब्द के पास एक शब्द खोज सकते हैं, इन्फ्लेक्शनल शब्दों (ड्राइव = ड्राइव, ड्राइव, ड्राइविंग, और संचालित) की खोज कर सकते हैं, और दूसरे शब्द के समानार्थी शब्द की खोज कर सकते हैं (धातु में एल्यूमीनियम और स्टील जैसे समानार्थी हो सकते हैं)।

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

[अद्यतन करें]

मैं देखता हूं कि आपने अपना प्रश्न अपडेट कर लिया है और पता है कि आपको किसी एक फ़ंक्शन का उपयोग करने की आवश्यकता है।

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

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[अपडेट # 2]

डेव वार्ड - कार्यों में से एक के साथ एक वाइल्डकार्ड का उपयोग करना एक बड़ा perf हिट नहीं होना चाहिए। अगर मैंने केवल "*" के साथ एक खोज स्ट्रिंग बनाई है, तो यह मेरे परीक्षण मामले में, सभी पंक्तियों को वापस नहीं करेगा, यह 0 रिकॉर्ड लौटा दिया।

0
जोड़ा
@Jagd - तब एक बेहतर जवाब प्रदान करें।
जोड़ा लेखक Greg Hurlman, स्रोत
जब मैंने इस सवाल से पूछा, यह इस बात पर आधारित था कि कैसे SQL 2005 ने पूर्ण पाठ अनुक्रमणिका के साथ निपटाया, यही कारण है कि मैंने 2005 पुस्तकें ऑनलाइन संदर्भित की।
जोड़ा लेखक Otto, स्रोत
निश्चित नहीं है कि इसे उत्तर के रूप में क्यों चिह्नित किया गया है, क्योंकि यह पूरी तरह सटीक नहीं है। अग्रणी वाइल्डकार्ड पूर्ण-पाठ खोज पर काम नहीं करता है। इसे SQL सर्वर 2008 में एक पूर्ण-पाठ अनुक्रमणिका पर कंटेनस्टेबल फ़ंक्शन का उपयोग करके सत्यापित किया गया है। समझने के लिए माइकल स्टम का उत्तर / पोस्ट देखें क्यों।
जोड़ा लेखक Jagd, स्रोत
यहां सिंगल कोट्स के अंदर डबल कोट्स नोट है। मेरे मूल कार्य में 'टर्म *' था, यह काम नहीं करता था। हालांकि '' शब्द * '' करता है। धन्यवाद
जोड़ा लेखक Yablargo, स्रोत
मैं इसे एसक्यूएल 2005 में पुन: पेश नहीं कर सकता। खोज स्ट्रिंग के सामने एक * का उपयोग करके दिखाया गया है कि कोई पंक्तियां वापस नहीं आती हैं।
जोड़ा लेखक gregmac, स्रोत
एक अग्रणी वाइल्डकार्ड sqlserver में काम नहीं करता है, इसलिए मूल प्रश्न के परिप्रेक्ष्य से देखे जाने पर यह उत्तर गलत है।
जोड़ा लेखक Evert, स्रोत
@ जगद से सहमत, इसे वोट के रूप में वोट दिया जाना चाहिए और जवाब के रूप में चिह्नित किया जाना चाहिए। ओपी स्पष्ट रूप से एफटी इंडेक्स (इसलिए * वाइल्डकार्ड के रूप में) के बारे में बात कर रहा है और यह पूरी तरह से और बस गलत है कि यह बताता है कि * एफटी इंडेक्स ऑपरेशन में उपसर्ग के रूप में काम करता है। गलत साबित होने के लिए खुश लेकिन मुझे नहीं लगता कि मैं हूं।
जोड़ा लेखक John B, स्रोत

SQL सर्वर में वाइल्डकार्ड वर्ण % चिह्न है और यह ठीक ठीक, अग्रणी, पिछला या अन्यथा काम करता है।

उस ने कहा, यदि आप किसी भी प्रकार की गंभीर पूर्ण पाठ खोज करने जा रहे हैं तो मैं पूर्ण टेक्स्ट इंडेक्स क्षमताओं का उपयोग करने पर विचार करूंगा। % और _ जंगली कार्ड का उपयोग करने से आपके डेटाबेस को गंभीर प्रदर्शन हिट करने का कारण बन जाएगा।

0
जोड़ा

जब पूर्ण-पाठ खोज की बात आती है, तो मेरे पैसे के लिए कुछ भी नहीं होता है लुसीन । एक .NET पोर्ट उपलब्ध है जो जावा के साथ बनाए गए इंडेक्स के साथ संगत है संस्करण।

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

उदाहरण के तौर पर, यह खोज कार्यक्षमता Lucene.Net द्वारा संचालित है।

0
जोड़ा

केवल वाइल्डकार्ड के लिए कामकाज:

  • store the text reversed in a different field (or in materialised view)
  • create a full text index on this column
  • find the reversed text with an *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

निश्चित रूप से त्वरित कार्यवाही के लिए, कई कमियां हैं ...

संक्षेप में उल्लेख नहीं है ...

0
जोड़ा

बस एफवाईआई, Google कोई सबस्ट्रिंग खोज या छंटनी नहीं करता है, दाएं या बाएं। वाक्यांश में अज्ञात शब्दों को खोजने के लिए उनके पास वाइल्डकार्ड वर्ण * है, लेकिन एक शब्द नहीं।

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

0
जोड़ा

2008 धागा पर मेरे परीक्षण से, इस धागे को स्पष्टता जोड़ने के लिए, फ्रांजो ऊपर सही है। पूर्ण पाठ खोज से निपटने पर, कम से कम CONTAINS वाक्यांश का उपयोग करते समय, आप एक अग्रणी , केवल एक पिछला कार्यात्मक रूप से उपयोग नहीं कर सकते हैं। * वाइल्डकार्ड है, पूर्ण पाठ में% नहीं।

कुछ ने सुझाव दिया है कि * अनदेखा किया जाता है। ऐसा लगता है कि यह मामला प्रतीत नहीं होता है, मेरे परिणाम दिखाते हैं कि पिछली * कार्यक्षमता काम करती है। मुझे लगता है कि अग्रणी * इंजन द्वारा अनदेखा कर रहे हैं।

मेरी अतिरिक्त समस्या हालांकि यह है कि एक पिछली क्वेरी, पीछे की ओर *, जो वाइल्डकार्ड के साथ पूर्ण पाठ का उपयोग करती है, 2005 (20 सेकंड) पर अपेक्षाकृत तेज़ी से काम करती है, और 2008 आर 2 में डीबी माइग्रेट करने के 12 मिनट बाद धीमी होती है। ऐसा लगता है कि कम से कम एक अन्य उपयोगकर्ता के समान परिणाम थे और उन्होंने एक फोरम पोस्ट शुरू किया जिसे मैंने जोड़ा ... FREETEXT अभी भी तेजी से काम करता है, लेकिन 2008 में प्रक्रियाओं के दौरान कुछ "लगता है" बदल गया है। वे अपग्रेड सलाहकार में सभी प्रकार की चेतावनियां देते हैं कि उन्होंने पूर्ण पाठ को "बेहतर" किया है, इसलिए आपका कोड टूट सकता है, लेकिन दुर्भाग्य से वे आपको कुछ बहिष्कृत कोड आदि के बारे में कोई विशेष चेतावनी नहीं देते हैं ... केवल एक अस्वीकरण कि उन्होंने इसे बदल दिया है, अपने जोखिम पार इस्तेमाल करें।

http: //social.msdn .microsoft.com / मंच / अर-एसए / sqlsearch / धागा / 7e45b7e4-2061-4c89-af68-febd668f346c

Maybe, this is the closest MS hit related to these issues... http://msdn.microsoft.com/en-us/library/ms143709.aspx

0
जोड़ा

संग्रहीत प्रक्रिया में पैरामीटर के रूप में आप इसका उपयोग इस प्रकार कर सकते हैं:

ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
    @PROPRIETARY_NAME varchar(10)
)
as
    set nocount on
    declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'

    select ldp.*, lkp.DRUG_PKG_ID
    from Lkp_DrugProduct ldp
    left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
    where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)
0
जोड़ा

शायद निम्न लिंक वाइल्डकार्ड के इस उपयोग के अंतिम उत्तर प्रदान करेगा: एफटीएस वाइल्डकार्ड खोजें प्रदर्शन

उस मार्ग पर ध्यान दें जो कहता है: "हालांकि, यदि आप निर्दिष्ट करते हैं? चेन? या? च ऐन ?, आपको अपेक्षित परिणाम नहीं मिलेगा। तारांकन को सामान्य विराम चिह्न चिह्न के रूप में माना जाएगा जो वाइल्डकार्ड वर्ण नहीं है "

0
जोड़ा