2010-12-21 10 views
6

मुझे .NET में मेरी lucene.net अनुक्रमणिका को सॉर्ट करने में समस्या है। मैंने स्टैक ओवरफ्लो पर लगभग हर समाधान की कोशिश की और Google उत्तरों की तलाश की। मैं Lucene.NET 2.9.2 और ASP.NET 2.0 का उपयोग कर रहा हूं। मैं एसक्यूएल में स्ट्रिंग को सॉर्ट करना चाहता हूं, आप 'ऑर्डर बाय टाइटल desc [asc]'Lucene.net 2.9.2 सॉर्टिंग (सॉर्ट काम नहीं करता है)

मैं आपको अपना कोड दिखाऊंगा और मुझे उम्मीद है कि कोई मेरी मदद कर सकता है।

//Here I create Index with some fields 
    doc.Add(new Field("prod_id",row["prod_id"].ToString(),Field.Store.YES,Field.Index.ANALYZED)); 
      doc.Add(new Field("prod_title", row["prod_title"].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("prod_desc", row["prod_desc"].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("prod_author", row["prod_author"].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("prod_publisher", row["prod_publisher"].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("prod_price", row["prod_price"].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 

//Then next I try to do search with sort option: 

//method for return approciate Sort object 
private static Sort SetSortForLucene(string _sort) 
    { 
     Sort sort; 
     switch (_sort) 
     { 
      case "UnitPriceGorss": 
       sort = new Sort(new SortField("prod_price",SortField.DOUBLE,false); 
       break; 

      case "UnitPriceGorssDESC": 
       sort = new Sort(new SortField("prod_price",SortField.DOUBLE,true); 
       break; 

      case "Title": 
       //not working 
       sort = new Sort(new SortField("prod_title", SortField.STRING, true)); 
       break; 

      case "TitleDESC": 
       //not working 
       sort = new Sort(new SortField("prod_title", SortField.STRING, false)); 
       break; 
      case "": 
       sort = new Sort(new SortField("prod_title", SortField.STRING, false)); 
       break; 
      default: 
       sort = new Sort(new SortField("prod_title", SortField.STRING, false)); 
       break; 
     } 
     return sort; 
    } 
//Inside my query of lucene method: 
StandardAnalyzer analizer = new StandardAnalyzer(Version.LUCENE_29); 
IndexReader reader =IndexReader.Open(IndexPath); 
Searcher searcher = new IndexSearcher(reader); 
//Here call for Sort object 
Sort sort = SetSortForLucene(_sort); 
TopFieldDocCollector collector = new TopFieldDocCollector(reader, sort, pageSize); 
//Find which document field need to me asked in QueryParser object 
string _luceneField = ""; 

     if (luceneField.Contains("_")) 
      _luceneField = luceneField; 
     else 
     switch (luceneField) 
     { 
      case "Title": _luceneField = "prod_title"; break; 
      case "Description": _luceneField = "prod_desc"; break; 
      case "Author": _luceneField = "prod_author"; break; 
      case "Publisher": _luceneField = "prod_publisher"; break; 
      default: _luceneField = "prod_title"; break; 
     } 
     QueryParser parser = new QueryParser(_luceneField, analizer); 
     Query query = parser.Parse(luceneQuery); 
     ScoreDoc[] hits; 
     searcher.Search(query,collector); 
//Obtaining top records from search but without any sort. 
     hits = collector.TopDocs().scoreDocs; 

     foreach (ScoreDoc hit in hits) 
     { 
      Document doc = searcher.Doc(hit.doc); 
      string a = doc.Get("prod_id"); 
      int id = 0; 
      if (hit.score > score) 
      { 
       if (int.TryParse(doc.Get("prod_id"), out id)) 
           tmpId.Add(id); 
      } 
     } 
//I also define stop words for full text searching and i think this is 
//real cause of problem with sorting. 
System.String[] stopWords = new System.String[]{"a","że","w","przy","o","bo","co","z","za","ze","ta","i","no","do"}; 

मैं अपने समस्या को हल करने के लिए इस link in stackoverflow. और this pretty one link थे, लेकिन छंटाई विफल रहता है और मैं नहीं जानता कि क्या मेरे कोड के साथ गलत है।

कुछ दिनों बाद मुझे एक समाधान मिला। जब मैं स्ट्रिंग मान का प्रतिनिधित्व करता हूं तो जिस क्षेत्र को मैं सॉर्ट करना चाहता हूं उसे टोकननाइज़ नहीं किया जाना चाहिए।

उदाहरण है जब मैं तुम्हें कुछ इस तरह रखना चाहिए शीर्षक (आरोही/उतरते) द्वारा उत्पादों क्रमबद्ध करना चाहते हैं के लिए:

doc.Add(new Field(Product.PROD_TITLE_SORT, row["prod_title"].ToString().Replace(" ", "_") + "_" + row[Product.PROD_ID].ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED)); 

मैं क्या नहीं मिलता है इस तथ्य क्यों इस क्षेत्र को संगृहीत कर रहा है और analizyng नहीं है और इस प्रकार lucene.net इस अतिरिक्त क्षेत्र द्वारा क्रमबद्ध कर सकते हैं। इस तरह का क्षेत्र भी इंडेक्स में नहीं है !! मैंने lukeall-1.0.1.jar इंडेक्स ब्राउज़र के साथ जांच की।

private static Sort SetSortForLucene(string _sort) 
     { 
      Sort sort; 
      _sort = !string.IsNullOrEmpty(_sort) ? _sort : ""; 
      switch (_sort) 
      { 
       case "UnitPriceGorss": 
        sort = new Sort(new SortField(PROD_PRICE, SortField.DOUBLE, false)); 
        break; 

       case "UnitPriceGorssDESC": 
        sort = new Sort(new SortField(PROD_PRICE, SortField.DOUBLE, true)); 
        break; 

       case "Title": 
        //not it works perfectly. 
        sort = new Sort(new SortField(PROD_TITLE_SORT, SortField.STRING, true)); 
        break; 

       case "TitleDESC": 
        //not it works perfectly. 
        sort = new Sort(new SortField(PROD_TITLE_SORT, SortField.STRING, false)); 
        break; 
       case ""://Here is default sorting behavior. It get's result according to Lucene.NET search result score. 
        sort = new Sort(SortField.FIELD_SCORE); 
        break; 
       default: 
        sort = new Sort(SortField.FIELD_SCORE); 
        break; 
      } 
      return sort; 
     } 

क्या मुझे वास्तव में संदिग्ध बना देता है उस तरह है SortField.DOUBLE साथ काम करता है जब क्षेत्र Lucene की प्रतिलिपि प्राप्त इंडेक्स में सूचीबद्ध किया गया है:

दूसरी बात आप एक उचित प्रकार विधि बनाने के लिए की जरूरत है।

मुझे आशा है कि यह पोस्ट सॉर्टिंग के साथ समान समस्या वाले किसी भी व्यक्ति की सहायता करेगी।

उत्तर

6

फ़ील्ड को तब तक संग्रहीत करने की आवश्यकता नहीं है जब तक कि आप अपनी क्वेरी में डेटा वापस नहीं कर लेते। हालांकि यह अभी भी सूचकांक में जोड़ा गया है।

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

मेरा मानना ​​है कि आप क्षेत्र स्टोर कर सकते हैं, लेकिन जब तक आप अपने प्रश्न में यह वापस करना चाहते कोई जरूरत नहीं है।

4

मुझे एक महत्वपूर्ण बात है जिसे मुझे सॉर्ट करने के बारे में पता होना चाहिए।

यह टोकननाइज्ड (विश्लेषण) डेटा पर काम नहीं करता है।

+0

तो .... उस डेटा के लिए एक गैर-विश्लेषण फ़ील्ड जोड़ें जिसे आप सॉर्ट करना चाहते हैं, और सॉर्टिंग के लिए इसका उपयोग करें, यदि आप इसे विश्लेषण करना चाहते हैं तो आपको फ़ील्ड को डुप्लिकेट करना पड़ सकता है। – Myster

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