2008-10-13 6 views
9

मेरी पूर्ण पाठ खोज क्वेरी में, मैं विशेष कॉलम को एक उच्च वेटेज असाइन करना चाहता हूं।मैं पूर्ण पाठ खोज में विभिन्न स्तंभों के लिए वजन कैसे निर्दिष्ट करूं?

SELECT Key_Table.RANK, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN FREETEXTTABLE(Restaurants, *, 'chilly chicken') AS Key_Table 
ON FT_Table.RestaurantID = Key_Table.[KEY] 
ORDER BY Key_Table.RANK DESC 

अब, मैं नाम स्तंभ परिणामों में एक उच्च महत्व करना चाहते हैं (नाम, कीवर्ड और स्थान पूर्ण-पाठ अनुक्रमित हैं): इस क्वेरी पर विचार करें। वर्तमान में, यदि परिणाम किसी भी तीन कॉलम में पाया जाता है, तो रैंक प्रभावित नहीं होते हैं।

उदाहरण के लिए, मुझे "चिली चिकन" नाम के साथ एक पंक्ति पसंद है, जिसमें कीवर्ड "चिली चिकन" के साथ एक से अधिक रैंक होगा, लेकिन दूसरा नाम।

संपादित करें:

मैं ContainsTable का उपयोग करने के लिए उत्सुक नहीं हूँ, क्योंकि उस वाक्यांश (मिर्च और चिकन, आदि) है, जो शामिल होगा मुझे सभी संभव संयोजनों खोज करने के लिए होने को अलग करने का मतलब होगा - मिर्च और चिकन, मिर्च या चिकन, आदि। मैं चाहता हूं कि एफटीएस इंजन स्वचालित रूप से यह पता लगाए कि कौन से परिणाम सबसे अच्छे हैं, और मुझे लगता है कि FREETEXT इस तरह से एक अच्छा काम करता है।

क्षमा करें अगर मैंने गलत समझा है कि कंटेनर/कंटेनस्टबल कैसे काम करता है।

उत्तर

7

सबसे अच्छा समाधान ContainsTable का उपयोग करना है। एक क्वेरी बनाने के लिए एक यूनियन का उपयोग करें जो सभी 3 कॉलम खोजता है और यह इंगित करने के लिए एक पूर्णांक जोड़ता है कि कौन सा कॉलम खोजा गया था। परिणामों को उस पूर्णांक से सॉर्ट करें और फिर रैंक desc।

रैंक एसक्यूएल सर्वर के लिए आंतरिक है और कुछ भी आप समायोजित नहीं कर सकते हैं।

आप को भी पूर्णांक द्वारा रैंक को विभाजित करके रैंक लौटा सकते हैं (नाम 1, कीवर्ड और स्थान 2 या उच्चतर द्वारा विभाजित किया जाएगा)। इससे विभिन्न रैंकिंग की उपस्थिति होगी।

यहां कुछ उदाहरण एसक्यूएल
है: शुरू परिवर्तन ट्रैकिंग का उपयोग कर --Recommend और शुरू पृष्ठभूमि updateindex (किताबें ऑनलाइन देख)

 
    SELECT 1 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Name, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

UNION SELECT 2 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Keywords, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

UNION SELECT 3 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN ContainsTable(Restaurant, Location, 'chilly chicken') AS Key_Table ON 
FT_Table.RestaurantId = Key_Table.[Key] 

ORDER BY ColumnLocation, Rank DESC 

उत्पादन परिवेश में, मैं एक तालिका में क्वेरी के उत्पादन में सम्मिलित होगा परिणाम लौटने से पहले कोई अतिरिक्त हेरफेर करने के लिए परिवर्तनीय (इस मामले में आवश्यक नहीं हो सकता है)। साथ ही, * का उपयोग करने से बचें, केवल उन स्तंभों को सूचीबद्ध करें जिन्हें आपको वास्तव में चाहिए।

संपादित करें: आप ContainsTable उपयोग के बारे में सही हो, तो आप ' "सर्द *" और "चिकन *"', मैं इस एक प्रक्रिया है कि एक इनपुट वाक्यांश tokenizes का उपयोग करते हैं होने के लिए कीवर्ड को संशोधित करना होगा। यदि आप ऐसा नहीं करना चाहते हैं, तो FreeTextTable के साथ उपरोक्त कंटेनटेबल के प्रत्येक इंस्टेंस को प्रतिस्थापित करें, क्वेरी अभी भी वही काम करेगी।

+1

मुझे आश्चर्य हुआ कि यूनियन का उपयोग करने वाला कुछ संभव था, लेकिन मेरा दिमाग शामिल एसक्यूएल को संसाधित नहीं कर सका! :) मुझे लगता है कि ये दोनों महान समाधान हैं, और उनमें से एक शायद समस्या को हल करेगा! मुझे जांचने और आपको वापस आने दो। मुझे समझ में नहीं आया, हालांकि, आपने अतिरिक्त जोड़ों का उल्लेख क्यों किया? –

+0

डेव, समाधान सॉर्टा काम करता है। समस्या यह है कि चुनिंदा रिटर्न डुप्लिकेट परिणाम देता है। मुझे लगता है कि सबसे अच्छा विकल्प टेबल वैरिएबल में स्टोर करना है, जैसा कि आपने सुझाव दिया था? –

+0

चयन डुप्लिकेट वापस करेगा, तालिका चर का उपयोग करें, फिर अलग का चयन करें। डुप्लीकेट वापस लौटाए जाते हैं क्योंकि कॉलमलोकेशन और रैंक मान प्रत्येक चयन में अलग होंगे, इसलिए एसक्यूएल उन्हें संघ द्वारा शामिल होने में डुप्लिकेट के रूप में नहीं देखता है। –

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