2013-05-29 7 views
5

मुझे jquery या C# में एक सटीक खोज फ़ंक्शन की आवश्यकता है। यदि संभव हो तो मैं गूगल :-) के रूप में के रूप में शानदार खोज चाहतेअधिक सटीक खोज कैसे बनाएं?

तो यहाँ C# कोड है:

संक्षिप्त विवरण:
इस डेटाबेस में पूरी जानकारी है कि में सभी उपयोगकर्ताओं के खोज करता है। यह वर्तमान में लॉग इन उपयोगकर्ता को छोड़कर सभी उपयोगकर्ताओं को खोजता है।

string[] ck = keyword.Split(new string[] { " ", ",", "." }, 
          StringSplitOptions.RemoveEmptyEntries); 

using (dbasecore db = ConfigAndResourceComponent.BaseCampContext()) 
{ 
    var results = (from u in db.users 
        join uinfo in db.userinfoes 
         on u.UserID equals uinfo.UserID 
        where u.UserID != userid && 
         (ck.Contains(u.LastName) || ck.Contains(u.FirstName) || 
         ck.Contains(u.MiddleName) || ck.Contains(u.LoginID)) 
        orderby u.LastName, u.FirstName, u.MiddleName ascending 
        select uinfo).Skip(skip).Take(take).ToList(); 

    return (from i in results select new UserInfo(i)).ToList(); 
} 

और परिणाम:

enter image description here

घेर लिया नाम के बाद से इसे और अधिक कीवर्ड से मेल खाता खोज आइटम के शीर्ष पर होना चाहिए।
कोई विचार?

+0

पूर्ण टेक्स्ट में रैंक है, – vikas

+0

का उपयोग करें क्या आपका कॉलम पूर्ण टेक्स्ट – vikas

उत्तर

1

सरलता के लिए मैं इस तरह उपयोगकर्ता संस्था के साथ एक मेज का उपयोग करेगा:

public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
} 

यहाँ है क्वेरी (एफई में काम करता है), जो प्रत्येक उपयोगकर्ता के लिए मैच मूल्य की गणना करता है, और उसके बाद ही उन जो कुछ खोजशब्दों का मिलान नहीं हुआ का चयन करें, मैच मूल्य द्वारा आदेश देने के परिणाम:

var keywords = new [] {"Sergey", "Berezovskiy"}; 

var users = from u in context.Users 
      let match = (keywords.Contains(u.FirstName) ? 1 : 0) + 
         (keywords.Contains(u.LastName) ? 1 : 0) + 
         (keywords.Contains(u.MiddleName) ? 1 : 0) 
      where match > 0 
      orderby match descending, 
        u.LastName, u.FirstName 
      select u; 

रेंज चर match मान होगा 0 से 3 को (यदि कोई नहीं क्षेत्रों कीवर्ड मिलान) (यदि सभी क्षेत्रों मिलान)।

+1

है, मैंने इसे उत्तर के रूप में स्वीकार किया क्योंकि यह सरल और काम कर रहा है। उदाहरण के लिए धन्यवाद। – fiberOptics

0

अच्छा ... आप अपने select में एक विशिष्ट ऑर्डरिंग निर्दिष्ट करते हैं। मुझे लगता है कि आपको वह आदेश मिल रहा है, है ना?

1) खुद रैंकिंग लिखें:

एक रैंकिंग समारोह, कि गिनती कितने खोज शब्दों परिणाम में मौजूद हैं के आधार पर परिणामों में शुमार लिखें ...

5

वहाँ प्राप्त करने के लिए आप क्या चाहते हैं कई तरीके हैं कलन विधि। इसका मतलब है कि आपको लिंक का उपयोग करके परिणाम मिलते हैं और फिर उन्हें अपने रैंकिंग फ़ंक्शन का उपयोग करके सॉर्ट करें - जो कि कुछ सरल हो सकता है, जैसे शब्दों में विभाजन का अनुरोध करना और प्रत्येक परिणाम या कुछ जटिल में उन शब्दों की उपस्थिति की गणना करना, जैसे अनुरोध के विभिन्न रूपों को ढूंढने के लिए स्टेमिंग का उपयोग करना शर्तों, शर्तों के बीच दूरी को मापना, कुछ शर्तों को बढ़ावा देना आदि। मैं इस तरह से जाने की अनुशंसा नहीं करता - क्योंकि Like क्वेरी एसक्यूएल पर धीमी हैं और आपको कुछ लिखने की जरूरत है जो पहले से ही लिखी गई है।

2) एसक्यूएल सर्वर पूर्ण पाठ खोज का उपयोग करें: http://msdn.microsoft.com/en-us/library/ms142524(v=sql.105).aspx। हालांकि मैं SQL सर्वर पूर्ण पाठ खोज का उपयोग करने का प्रशंसक नहीं हूं, यह अच्छा और व्यावहारिक समाधान है।

3) तीसरे पक्ष की पूर्ण पाठ खोज का उपयोग करें, कुछ विकल्प हैं, लुसीन (http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net) संभवतः .NET में सबसे अधिक उपयोग किया जाता है। इससे आपको गति और लचीलापन मिल जाता है, आप विभिन्न तरीकों से अपने डेटा को इंडेक्स कर सकते हैं, लेकिन निश्चित रूप से पर्याप्त है कि आप इसे अनुक्रमणित करने के लिए उत्तरदायी हैं। ल्यूसीन के ऊपर एपीआई भी है, जैसे सोलर, जिसे मैं सबसे ज्यादा प्यार करता हूं - हालांकि यह आपके मामले में बहुत अधिक हो सकता है।

1

Google के रूप में शानदार होने के नाते बहुत रोना हो सकता है, लेकिन आप एक बहुत ही सरल तकनीक का उपयोग करके कुछ स्वीकार्य प्राप्त कर सकते हैं। यहां विचार है:

WHERE ck.Contains(u.LastName) || ck.Contains(u.FirstName) करने के बजाय, अपने WHERE खंड में, आप एक अभिव्यक्ति जोड़ सकते हैं जो प्रत्येक सफल मानदंड (इसके सापेक्ष वजन के अनुसार) को मान निर्दिष्ट करती है और अंतिम स्कोर प्राप्त करने के लिए उन्हें जोड़ती है। उदाहरण के लिए:

WHERE (ck.Contains(u.LastName)? 1 : 0) + (ck.Contains(u.FirstName)? 2 : 0) + ... 

सुनिश्चित नहीं हैं कि अगर LINQ त्रिगुट ऑपरेटर या समर्थन करता है, नहीं है, लेकिन आप एक पाश और मैनुअल विधि भी का उपयोग कर एक ही प्राप्त कर सकते हैं, तो ऐसा नहीं है। सभी शर्तों का योग उन उम्मीदवारों को उच्च स्कोर देगा जो निकटतम मैच हैं। फिर आप इस कॉलम द्वारा क्रमबद्ध कर सकते हैं।

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