2010-03-04 6 views
5

मूल रूप से मैं इस तरह एक मेज है:प्रासंगिकता द्वारा पहले और अंतिम नाम और क्रम के लिए SQL सर्वर 2008 डेटाबेस से क्वेरी कैसे करें?

CREATE TABLE Person(
    PersonID int IDENTITY(1,1) NOT NULL, 
    FirstName nvarchar(512) NOT NULL, 
    LastName nvarchar(512) NULL 
) 

और मैं इस तरह एक उपयोगकर्ता के क्वेरी के आधार पर शीर्ष n परिणाम खोजने की जरूरत है:

"Joh Smi" 

निम्न क्वेरी परिणाम देता है मुझे चाहिए (मुझे लगता है)। बस प्रासंगिक क्रम में नहीं।

SELECT 
    PersonID, FirstName, LastName 
FROM 
    Person 
WHERE 
    FirstName LIKE 'Joh%' OR 
    LastName LIKE 'Joh%' OR 
    FirstName LIKE 'Smi%' OR 
    LastName LIKE 'Smi%' 

निम्न नामों डेटाबेस में थे और हमारे उपयोगकर्ता के प्रश्न था "Joh Smi" नाम (या समान) निम्न क्रम में दिखाई देनी चाहिए

  1. जॉन स्मिथ
  2. जॉनी स्मिथ हैं
  3. जॉन जैकब
  4. डेविड स्मिथसोनियन
  5. डैनियल जॉनसन

मैं इसे फेसबुक की स्वत: पूर्ण मित्र-खोज के समान काम करने की उम्मीद कर रहा हूं।

तो, मैं शीर्ष n SQL सर्वर 2008 में सबसे प्रासंगिक पंक्तियों को कैसे वापस कर सकता हूं?

उत्तर

2

OMG टट्टू जवाब देने के लिए एक परिशिष्ट के रूप में ...

एक पूर्ण पाठ खोज आप करोड़ करना चाह सकते हैं से सर्वोत्तम परिणाम प्राप्त करने के लिए एक अनुक्रमित दृश्य को खाएं जो पहले और अंतिम नाम फ़ील्ड को जोड़ता है।

यह आपको पूर्ण नाम के अलग-अलग हिस्सों को अधिक सटीक रूप से वजन देने की अनुमति देगा।

उदाहरण कोड इस प्रकार है:

CREATE VIEW [dbo].[vFullname] WITH SCHEMABINDING AS 
    SELECT personID, FirstName + ' ' + LastName AS name 
    FROM dbo.person 

    WITH ranks AS(
    SELECT FT_TBL.personid 
     ,FT_TBL.name 
     ,KEY_TBL.RANK 
    FROM dbo.vfullname AS FT_TBL 
     INNER JOIN CONTAINSTABLE(vfullname, (name), 
    'ISABOUT ("Smith" WEIGHT (0.4), "Smi*" WEIGHT (0.2), 
"John" WEIGHT (0.3), "Joh*" WEIGHT (0.1))') AS KEY_TBL 
      ON FT_TBL.personid = KEY_TBL.[KEY] 
    ) 
    SELECT 
    r.personID, 
    p.firstname, 
    p.lastname, 
    r.rank 
    FROM ranks r INNER JOIN 
    person p ON r.personID = p.personID 
    ORDER BY rank DESC; 

CTE केवल आपके व्यक्तिगत firstname और lastname क्षेत्रों वापस जाने के लिए अनुमति देता है। यदि आपको आउटपुट के रूप में इनकी आवश्यकता नहीं है तो इसे अनदेखा करें।

1

आपको पहले यह तय करने की आवश्यकता है कि प्रासंगिकता से आपका क्या मतलब है। यहाँ प्रासंगिकता

  1. की मेरी सूची दोनों शब्द वास्तव में पहले स्थान पर है और अंतिम नाम पहली लेकिन उलटा आदेश के रूप में
  2. ही
  3. एक है पूर्ण शब्द, एक सबस्ट्रिंग है 3
  4. दोनों के रूप में
  5. एक ही है सबस्ट्रिंग्स हैं इस के अंदर आप (अच्छा अधिक साधन) सबस्ट्रिंग की लंबाई

सबस्ट्रिंग

  • एक यह है द्वारा रेट कर सकते हैं तो मैं समारोह है कि प्रथम और अंतिम नाम लेने के लिए और इनपुट स्ट्रिंग और बदले पूर्णांक, या accoring तैर सकती है बनाने के लिए आप की सिफारिश करेंगे नियमों के लिए, फिर इसके द्वारा क्रमबद्ध करें।

  • +0

    सूची को प्यार करें। लेकिन एसक्यूएल क्वेरी/फंक्शन कैसा दिखता है? :-) –

    +0

    अरे, यह लगभग 2 बजे है, मैं सोना चाहता हूं :) – Andrey

    +0

    हाहा। ठीक है ... मैं तुम्हें एक ब्रेक दूंगा। –

    5

    मैं दो कारणों के लिए पूर्ण पाठ खोज (FTS) को लागू करने की सलाह देते हैं:

    1. क्वेरी को सरल बनाएँ
    2. (ORS, which'll खराब प्रदर्शन की जरूरत नहीं होना चाहिए) रैंकिंग कार्यक्षमता FTS उपयोग - देखना this article
    संबंधित मुद्दे