2012-07-25 12 views
7

हमारे पास एक ऐसा एप्लिकेशन है जो SQL Server 2008 डेटाबेस और पूर्ण-पाठ खोज का उपयोग कर रहा है।एक हाइफ़न युक्त वाक्यांश के लिए SQL सर्वर पूर्ण-पाठ खोज अपेक्षित परिणाम नहीं लौटाती

सबसे पहले, एक वाक्यांश एक हाइफन शब्द वाले, इस तरह::

contains(column_name, '"one two-three-four five"') 

और दूसरा, एक समान वाक्यांश, जहां हाइफ़न रिक्त स्थान की जगह मुझे समझ में क्यों निम्नलिखित खोजें अलग ढंग से व्यवहार कोशिश कर रहा हूँ :

contains(column_name, '"one two three four five"') 

पूर्ण-पाठ सूचकांक अंग्रेजी का उपयोग करता है (1033) स्थान, और डिफ़ॉल्ट प्रणाली stoplist।

हाइफेनेटेड शब्दों वाले अन्य पूर्ण-पाठ खोजों के मेरे अवलोकनों से, पहले व्यक्ति को one two three four five या one twothreefour five पर मिलानों की अनुमति देनी चाहिए। इसके बजाए, यह केवल one twothreefour five से मेल खाता है (और one two-three-four five नहीं)।


टेस्ट केस

सेटअप:

create table ftTest 
(
    Id int identity(1,1) not null, 
    Value nvarchar(100) not null, 
    constraint PK_ftTest primary key (Id) 
); 

insert ftTest (Value) values ('one two-three-four five'); 
insert ftTest (Value) values ('one twothreefour five'); 

create fulltext catalog ftTest_catalog; 
create fulltext index on ftTest (Value language 1033) 
    key index PK_ftTest on ftTest_catalog; 
GO 

क्वेरी:

--returns one match 
select * from ftTest where contains(Value, '"one two-three-four five"') 

--returns two matches 
select * from ftTest where contains(Value, '"one two three four five"') 
select * from ftTest where contains(Value, 'one and "two-three-four five"') 
select * from ftTest where contains(Value, '"one two-three-four" and five') 
GO 

सफाई:

drop fulltext index on ftTest 
drop fulltext catalog ftTest_catalog; 
drop table ftTest; 

उत्तर

7

http://support.microsoft.com/default.aspx?scid=kb;en-us;200043

"कहाँ गैर अक्षरांकीय चरित्र खोज शर्तों को पूरा करते ('-' मुख्य रूप से पानी का छींटा चरित्र) में इस्तेमाल किया जाना चाहिए।, की प्रतिलिपि प्राप्त करने के बजाय Transact-SQL की तरह खंड का उपयोग करें या विधेय शामिल है"

+1

प्रश्न के बारे में * क्यों * एसक्यूएल सर्वर मिलान के लिए अलग-अलग व्यवहार प्रदर्शित अधिक है:

कृपया, क्यों के लिए लिंक का पालन करें।इसके चारों ओर काम करना निश्चित रूप से करने योग्य है, लेकिन यह मुझे समझ में नहीं आता है कि "दो-तीन-चार पांच" दोनों पंक्तियों को वापस कर देंगे, हालांकि "एक दो-तीन-चार पांच" नहीं होगा। "एक दो-तीन-चार" के लिए डितो। क्या यह वास्तव में अपेक्षित व्यवहार है? और यदि हां, तो क्यों? – Laviak

5

ऐसे मामलों में जहां आप शब्द-ब्रेकर के व्यवहार की अपेक्षा नहीं कर सकते हैं, यह हमेशा एक अच्छा विचार है कि sys.dm_fts_parser को अपने तारों पर चलाने के लिए हमेशा एक अच्छा विचार है कि शब्दों को कैसे विभाजित किया जा रहा है और संग्रहीत किया जा रहा है आंतरिक सूचकांक।

उदाहरण के लिए

, निम्नलिखित में '' एक दो-तीन-चार से पांच " 'पर परिणाम sys.dm_fts_parser चल रहा है -

select * from sys.dm_fts_parser('"one two-three-four five"', 1033, NULL, 0) 
--edited-- 
1 0 1 Exact Match one 
1 0 2 Exact Match two-three-four 
1 0 2 Exact Match two 
1 0 3 Exact Match three 
1 0 4 Exact Match four 
1 0 5 Exact Match five 

आप लौट आए परिणामों से देख सकते हैं, शब्द ब्रेकर पार्स स्ट्रिंग और छह रूपों को आउटपुट करता है जो आपके CONTAINS क्वेरी को चलाने के दौरान देखे गए परिणामों की व्याख्या कर सकते हैं।

1

एक पूर्ण-पाठ खोज किसी शब्द को रिक्त स्थान या विराम चिह्न के बिना वर्णों की एक स्ट्रिंग मानती है। एक गैर-अल्फान्यूमेरिक वर्ण की घटना एक खोज के दौरान एक शब्द को "तोड़" सकती है। चूंकि SQL सर्वर पूर्ण-पाठ खोज एक शब्द-आधारित इंजन है, इसलिए विराम चिह्न आम तौर पर नहीं माना जाता है और इंडेक्स को खोजते समय अनदेखा किया जाता है। इसलिए, एक कंटेनस क्लॉज जैसे 'कंटेनस (परीक्षण, "कंप्यूटर-विफलता")' मूल्य के साथ एक पंक्ति से मेल खाता है, "मेरे कंप्यूटर को खोजने में विफलता महंगी होगी।" https://support.microsoft.com/en-us/kb/200043

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