2008-11-26 12 views
10

का उपयोग कर पेजिंग मैं .NET अनुप्रयोग पर काम कर रहा हूं जो Asp.net 3.5 और Lucene.Net का उपयोग करता है। मैं एक asp.net डेटाग्रिड में Lucene.Net द्वारा दिए गए खोज परिणाम दिखा रहा हूं। मुझे इस एएसपीएक्स पेज के लिए पेजिंग (प्रत्येक पृष्ठ पर 10 रिकॉर्ड) को लागू करने की आवश्यकता है।Lucene.net

मैं इसे लुसीन.Net का उपयोग करके कैसे प्राप्त करूं?

उत्तर

23

यहां लुसीन.Net के साथ एक विशिष्ट पृष्ठ से मेल खाने वाली एक साधारण सूची बनाने का एक तरीका है। यह एएसपी.Net विशिष्ट नहीं है।

int first = 0, last = 9; // TODO: Set first and last to correct values according to page number and size 
Searcher searcher = new IndexSearcher(YourIndexFolder); 
Query query = BuildQuery(); // TODO: Implement BuildQuery 
Hits hits = searcher.Search(query); 
List<Document> results = new List<Document>(); 
for (int i = first; i <= last && i < hits.Length(); i++) 
    results.Add(hits.Doc(i)); 

// results now contains a page of documents matching the query 

असल में हिट संग्रह बहुत हल्का है। इस सूची को प्राप्त करने की लागत न्यूनतम है। आप हिट कॉल करके आवश्यक दस्तावेज़ों को तुरंत चालू करें। (I) अपना पृष्ठ बनाने के लिए।

+1

मैं खोज शब्द पर कुंजी मेमोरी स्टोर में मेमकैच या किसी अन्य चीज़ का उपयोग करने का सुझाव दूंगा। इस तरह आपको आवश्यकता की आवश्यकता नहीं है लेकिन जांच करें कि क्या यह वास्तव में प्रदर्शन में सुधार करता है। – bleevo

+0

मुझे लगता है कि लोग यहां बिंदु खो रहे हैं। मुझे लगता है कि यहां बिंदु यह है कि ल्यूसीन के परिणामों को एक प्रारूप में कैसे बदलना है जो एएसपी.नेट डाटाग्रिड के साथ अच्छी तरह से काम करता है। एएसपी.नेट डाटाग्रिड को .NET ADO डेटासेट के साथ अच्छी तरह से काम करने के लिए डिज़ाइन किया गया है (हालांकि इसका उपयोग करने के अन्य तरीके हैं)। मेरा जवाब लुसीन ऑब्जेक्ट्स से ADO.NET ऑब्जेक्ट्स में कनवर्ट करने का एक तरीका दिखाता है। यदि आप डेटाग्रिड के विनिर्देशों को अनदेखा करते हैं, तो मुझे लगता है कि आप इस सवाल का जवाब नहीं दे रहे हैं। –

+0

डाटाग्रिड एक सूची के साथ पूरी तरह से अच्छी तरह से काम करता है। बस दस्तावेज़ ऑब्जेक्ट्स में मौजूद जानकारी से सूची बनाएं और इसे ग्रिड पर डेटाबाइंड करें। –

-8

मैं जो करता हूं वह हिट के माध्यम से पुनरावृत्त होता है और उन्हें डीबी में अस्थायी तालिका में डाल देता है। फिर मैं एक नियमित एसक्यूएल क्वेरी चला सकता हूं - उस सारणी तालिका को अन्य तालिकाओं के साथ भी जोड़ना - और ग्रिड को डेटासेट/डेटा व्यू जो वह चाहता है उसे दें।

ध्यान दें कि मैं डीबी पर एक ट्रिप में आवेषण और क्वेरी करता हूं, क्योंकि मैं केवल एक एसक्यूएल बैच का उपयोग कर रहा हूं।

void Page_Load(Object sender, EventArgs e) 
{ 

    dbutil = new DbUtil(); 
    security = new Security(); 
    security.check_security(dbutil, HttpContext.Current, Security.ANY_USER_OK); 

    Lucene.Net.Search.Query query = null; 

    try 
    { 
     if (string.IsNullOrEmpty(Request["query"])) 
     { 
      throw new Exception("You forgot to enter something to search for..."); 
     } 

     query = MyLucene.parser.Parse(Request["query"]); 

    } 
    catch (Exception e3) 
    { 
     display_exception(e3); 
    } 


    Lucene.Net.Highlight.QueryScorer scorer = new Lucene.Net.Highlight.QueryScorer(query); 
    Lucene.Net.Highlight.Highlighter highlighter = new Lucene.Net.Highlight.Highlighter(MyLucene.formatter, scorer); 
    highlighter.SetTextFragmenter(MyLucene.fragmenter); // new Lucene.Net.Highlight.SimpleFragmenter(400)); 

    StringBuilder sb = new StringBuilder(); 
    string guid = Guid.NewGuid().ToString().Replace("-", ""); 
    Dictionary<string, int> dict_already_seen_ids = new Dictionary<string, int>(); 

    sb.Append(@" 
create table #$GUID 
(
temp_bg_id int, 
temp_bp_id int, 
temp_score float, 
temp_text nvarchar(3000) 
) 
    "); 

    lock (MyLucene.my_lock) 
    { 

     Lucene.Net.Search.Hits hits = null; 
     try 
     { 
      hits = MyLucene.search(query); 
     } 
     catch (Exception e2) 
     { 
      display_exception(e2); 
     } 

     // insert the search results into a temp table which we will join with what's in the database 
     for (int i = 0; i < hits.Length(); i++) 
     { 
      if (dict_already_seen_ids.Count < 100) 
      { 
       Lucene.Net.Documents.Document doc = hits.Doc(i); 
       string bg_id = doc.Get("bg_id"); 
       if (!dict_already_seen_ids.ContainsKey(bg_id)) 
       { 
        dict_already_seen_ids[bg_id] = 1; 
        sb.Append("insert into #"); 
        sb.Append(guid); 
        sb.Append(" values("); 
        sb.Append(bg_id); 
        sb.Append(","); 
        sb.Append(doc.Get("bp_id")); 
        sb.Append(","); 
        //sb.Append(Convert.ToString((hits.Score(i)))); 
        sb.Append(Convert.ToString((hits.Score(i))).Replace(",", ".")); // Somebody said this fixes a bug. Localization issue? 
        sb.Append(",N'"); 

        string raw_text = Server.HtmlEncode(doc.Get("raw_text")); 
        Lucene.Net.Analysis.TokenStream stream = MyLucene.anal.TokenStream("", new System.IO.StringReader(raw_text)); 
        string highlighted_text = highlighter.GetBestFragments(stream, raw_text, 1, "...").Replace("'", "''"); 
        if (highlighted_text == "") // someties the highlighter fails to emit text... 
        { 
         highlighted_text = raw_text.Replace("'","''"); 
        } 
        if (highlighted_text.Length > 3000) 
        { 
         highlighted_text = highlighted_text.Substring(0,3000); 
        } 
        sb.Append(highlighted_text); 
        sb.Append("'"); 
        sb.Append(")\n"); 
       } 
      } 
      else 
      { 
       break; 
      } 
     } 
     //searcher.Close(); 
    } 
+1

मैं इस अभ्यास को हतोत्साहित करता हूं। कई चलती भागों के लिए रास्ता। इसके अलावा, एक इंडेक्स खोज प्रकार के लिए डीबी को मारने का उद्देश्य उद्देश्य को हरा देता है। –

+0

@ डेविड - विवरण: मेरे डीबी में कॉलम के साथ डेटा (बग, टिकट, समस्याएं) होती हैं जो अक्सर बदलती हैं। या तो जब भी ये कॉलम बदलते हैं, मैं दोनों डीबी और ल्यूसीन इंडेक्स को अपडेट करता हूं, या, मैं केवल डीबी अपडेट करता हूं। मैंने केवल वें डीबी अपडेट करना चुना। एक और विवरण: परिणामों को प्रदर्शित करने वाले मेरे ऐप का हिस्सा पहले से मौजूद था और इनपुट के रूप में .NET डेटासेट/डेटाव्यू ऑब्जेक्ट की अपेक्षा की गई थी। इसलिए, मैं परिणामों को किसी भी डेटासेट/डेटा व्यू में अनुवाद करना चाहता था। ओपी एक डाटाग्रिड में परिणाम प्रदर्शित करना चाहता है जो डेटासेट/डेटाव्यू इनपुट के रूप में भी चाहता है। न सिर्फ अस्वीकार करें। एक बेहतर altnerative सुझाव। –

+0

मैंने जो समाधान प्रस्तुत किया वह सवाल है कि ल्यूसीन के साथ पेजिंग कैसे करें। परिणाम को ग्रिड में बाध्य करना आसान है (अपनी दूसरी टिप्पणी का मेरा जवाब देखें)। –

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