2011-10-10 18 views
5

एम्परसैंड (&) के साथ समस्या हैएसक्यूएल सर्वर पूर्ण पाठ खोज एंपरसैंड (&)

शब्द (या वाक्य) है कि एक एंपरसैंड (&) होते हैं के लिए खोज करने के लिए कैसे।

उदाहरण के लिए, डेटाबेस में कर रहे हैं:

1: "Johnson & Johnson" 
2: "AT&T" 
3: "Sample & Sample" 

मैं व्यक्तिगत रिकॉर्ड के लिए खोज करने के लिए एक पूर्ण पाठ खोज क्वेरी कैसे लिखना चाहिए?

SELECT * from Companies c WHERE CONTAINS(c.CompanyName, '"AT&T"') 

मुझे पता है कि चरित्र (&) तार्किक और ऑपरेशन के लिए जिम्मेदार है। लेकिन मुझे नहीं पता कि पूर्ण टेक्स्ट खोज के साथ पाठ में खोजने के लिए इसे कैसे एन्कोड करना है।

कोई विचार?

उत्तर

5

लघु संस्करण: आप कर सकते हैं नहीं (या कम से कम आप कर सकते हैं, लेकिन आप और अधिक परिणाम आपकी अपेक्षा से प्राप्त कर सकते हैं)

लांग संस्करण: चरित्र '&' एक "शब्द ब्रेकर" के रूप में व्यवहार किया जाता है , यानी जब SQL सर्वर '&' से मुकाबला करता है तो यह इसे एक नए "शब्द" (यानी टोकन) की शुरुआत के रूप में मानता है। "AT&T" पार्सिंग करते समय SQL सर्वर सीज़ दो टोकन, "AT" और "T" है।

आप अपने आप को sys.dm_fts_parser प्रयोग करने के लिए इस जाँच कर सकते हैं:

SELECT * FROM sys.dm_fts_parser('AT&T', 1033, 0, 0) 

keyword  group_id phrase_id occurrence special_term display_term expansion_type source_term 
----------- ----------- ----------- ----------- ------------- ------------- -------------- ----------- 
0x00610074 1   0   1   Noise Word at   0    AT 
0x0074  2   0   1   Noise Word t    0    T 

इसका मतलब है कि "AT&T" के लिए खोज काफी वास्तव में सिर्फ "AT T" के लिए खोज के रूप में ही है।

यह डिज़ाइन द्वारा है, जहां तक ​​मैं इस व्यवहार को संशोधित करने का एकमात्र तरीका देख सकता हूं, यह आपके word breaker को स्थापित करना होगा, हालांकि ऐसा कुछ नहीं है जिसे मैं करने की अनुशंसा करता हूं।

2

स्वीकृत उत्तर पूरी तरह से सही नहीं है। डबल-कोट्स में खोज शब्द को बंद करना शब्दों के समूह को "वाक्यांश" मिलान बनाता है। इस मामले में, ampsersand (&) को शाब्दिक चरित्र के रूप में माना जा सकता है, जैसे कि एक या अधिक अक्षरों से घिरा हुआ जब ज्ञात शब्द न बनें। बस अपने "AT&T" उदाहरण को देखते हुए, हम देखते हैं:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"AT&T"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

रिटर्न:

keyword    group phrase occurrence special  display expansion source 
        id  id     term   term  type  term 
0x0061007400260074 1  0  1   Exact Match at&t  0   AT&T 

आप देख सकते हैं, एम्परसेंड सभी में कोई समस्या प्रस्तुत करता है, जब तक यह (डबल उद्धरण में संलग्न है ") जो आप पहले से ही कर रहे हैं, वू!

हालांकि

, कि "Johnson & Johnson" उदाहरण के लिए के रूप में सफाई से काम नहीं करता है:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"Johnson & Johnson"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

रिटर्न:

keyword       group phrase occurrence special  display expansion source 
           id  id     term   term  type  term 
0x006A006F0068006E0073006F006E 1  0  1   Exact Match johnson 0   Johnson & Johnson 
0x006A006F0068006E0073006F006E 1  0  2   Exact Match johnson 0   Johnson & Johnson 

कि भी Johnson Johnson की खोज शब्द से मेल करने के लिए है, जो नहीं है प्रतीत होता है तकनीकी रूप से सही।

तो, डबल उद्धरण में संलग्न करने के अलावा, आप भी एम्परसेंड में बदल सकते हैं एक अंडरस्कोर (_) जो अलग ढंग से नियंत्रित किया जाता है होना करने के लिए:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"Johnson _ Johnson"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

रिटर्न:

keyword       group phrase occurrence special  display expansion source 
           id  id     term   term  type  term 
0x006A006F0068006E0073006F006E 1  0  1   Exact Match johnson 0   Johnson _ Johnson 
0x005F       1  0  2   Exact Match _  0   Johnson _ Johnson 
0x006A006F0068006E0073006F006E 1  0  3   Exact Match johnson 0   Johnson _ Johnson 

और , ऐसा करने के लिए कि एक वर्ण अनुवाद मूल "AT&T" खोज पर प्रतिकूल प्रभाव नहीं लग रहा है:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"AT_T"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 

रिटर्न:

keyword    group phrase occurrence special  display expansion source 
        id  id     term   term  type  term 
0x00610074005F0074 1  0  1   Exact Match at_t  0   AT_T 
संबंधित मुद्दे