2008-08-19 17 views
12

मैं वर्तमान में एक ऐसे एप्लिकेशन पर काम कर रहा हूं जहां हमारे पास एक SQL-Server डेटाबेस है और मुझे एक पूर्ण पाठ खोज काम करने की आवश्यकता है जो हमें लोगों के नामों की खोज करने की अनुमति देता है।एसक्यूएल सर्वर पूर्ण पाठ खोज

वर्तमान में उपयोगकर्ता एक ऐसे नाम फ़ील्ड में प्रवेश कर सकता है जो 3 अलग वर्चर्स कोल्स खोजता है। पहला, अंतिम, मध्य नाम

तो कहें कि मेरे पास निम्नलिखित जानकारी के साथ 3 पंक्तियां हैं।

1 - फिलिप - जम्मू - फ्राई

2 - एमी - शून्य - वोंग

3 - लियो - शून्य - वोंग

उपयोगकर्ता फ्राई 'कहीं भी होगी जैसे नाम दर्ज करता है वापसी पंक्ति 1. हालांकि अगर वे फिलिप फ्राई, या फ्रा, या फिल में प्रवेश करते हैं तो उन्हें कुछ भी नहीं मिलता .. और मुझे समझ में नहीं आता कि यह क्यों कर रहा है। यदि वे वोंग की खोज करते हैं तो वे पंक्तियों 2 और 3 प्राप्त करते हैं यदि वे एमी वोंग की खोज करते हैं तो उन्हें फिर से कुछ भी नहीं मिलता है।

वर्तमान में क्वेरी CONTAINSTABLE का उपयोग कर रही है, लेकिन मैंने परिणामों में किसी भी उल्लेखनीय अंतर के बिना FREETEXTTABLE, CONTAINS, और FREETEXT के साथ स्विच किया है। तालिका विधियों को प्राथमिकता दी जाती है क्योंकि वे समान परिणाम लौटाते हैं लेकिन रैंकिंग के साथ।

यहां प्रश्न है।

.... 
@Name nvarchar(100), 
.... 
--""s added to prevent crash if searching on more then one word. 
DECLARE @SearchString varchar(100) 
SET @SearchString = '"'[email protected]+'"' 
SELECT Per.Lastname, Per.Firstname, Per.MiddleName 
FROM Person as Per 
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL 
ON Per.Person_ID = KEYTBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
ORDER BY KEYTBL.RANK DESC; 
.... 

कोई विचार ...? यह पूर्ण पाठ खोज सही तरीके से क्यों काम नहीं कर रही है?

उत्तर

3

प्रतिक्रियाओं लोगों के लिए धन्यवाद मैं अंत में यह काम करने के लिए प्राप्त करने में सक्षम था।बिरी, और किब्बी के दोनों उत्तरों के हिस्से के साथ। मुझे स्ट्रिंग में * जोड़ने और काम करने के लिए रिक्त स्थान पर इसे तोड़ने की आवश्यकता थी। तो अंत में मुझे मिल गया

.... 
@Name nvarchar(100), 
.... 
--""s added to prevent crash if searching on more then one word. 
DECLARE @SearchString varchar(100) 

--Added this line 
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*') 
SET @SearchString = '"*'[email protected]+'*"' 

SELECT Per.Lastname, Per.Firstname, Per.MiddleName 
FROM Person as Per 
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL 
ON Per.Person_ID = KEYTBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
ORDER BY KEYTBL.RANK DESC; 
.... 

अधिक क्षेत्रों खोजा जा रहा पर मैं सिर्फ सवाल के लिए यह सरल बनाया है, अत: क्षमा करें, मुझे नहीं लगता था कि यह जवाब असर होगा। यह वास्तव में एक कॉलम की खोज करता है जिसमें उपनामों का एक सीएसवी और नोट्स कॉलम भी होता है।

सहायता के लिए धन्यवाद।

+0

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

+0

उत्तर के लिए धन्यवाद। आप लीला और बेंडर भूल गए। क्या मैं इसके लिए लुसीन का उपयोग कर सकता हूं? –

4

फ्रीटेक्स्टटेबल काम करना चाहिए।

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString 'फिलिप फ्राई' की तरह मान होने चाहिए (एक लंबी स्ट्रिंग रिक्तियों से अलग देखने तार के सभी युक्त)। फिल * और फादर *

'फिल' वास्तव में शब्द 'फिल' की तलाश में है:

आप फादर या फिल के लिए खोज करना चाहते हैं, तो आप तारांकन उपयोग करना चाहिए। 'फिल *' हर शब्द जिसके साथ शुरू हो रहा है की तलाश में है 'फिल'

4

तुम सिर्फ लोगों के नाम खोज रहे हैं, यह आपके हित भी पूरा टेक्स्ट सूचकांक का उपयोग नहीं करने के लिए हो सकता है। आप बड़े पाठ क्षेत्रों है जब पूर्ण पाठ सूचकांक समझ में आता है, लेकिन अगर आप ज्यादातर क्षेत्र प्रति एक शब्द के साथ काम कर रहे हैं, मुझे यकीन है कि कितना अतिरिक्त आप पूरा टेक्स्ट अनुक्रमित से बाहर निकलना होगा नहीं हूँ। नए रिकॉर्ड की खोज करने से पहले पूर्ण टेक्स्ट इंडेक्स को खुद को रीइंडेक्स करने की प्रतीक्षा करना कई समस्याओं में से एक हो सकता है।

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

 
Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%' 
or MiddleName like @searchterm1 + '%' 
or LastName like @searchterm1 + '%' 
or Firstname like @searchterm2 + '%' 
etc.... 
2

एक और दृष्टिकोण अलग-अलग क्षेत्रों से खोज को अमूर्त करने के लिए हो सकता है।

दूसरे शब्दों में अर्थात FULL_NAME

फिर दृश्य पर खोज जो concatenated क्षेत्रों में FIRSTNAME LASTNAME की तरह सभी विभाजन क्षेत्रों बदल जाता है अपने डेटा को दृश्य बनाते हैं। यह संभवतः खोज क्वेरी को सरल बना देगा।

2

आप पूर्ण पाठ के विकल्प के रूप में Lucene.net को देखना चाहेंगे।

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