Changeset 879


Ignore:
Timestamp:
Nov 22, 2009, 4:39:30 PM (12 years ago)
Author:
enkler
Message:

Improved Lucene.Net support

Location:
trunk/CrypCore
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypCore/SearchProvider.cs

    r274 r879  
    1616    public class SearchResult
    1717    {
     18        public SearchResult()
     19        {
     20            Contexts = new List<string>();
     21        }
     22
    1823        public string Plugin { get; set; }
    19         public string Context { get; set; }
     24        public List<string> Contexts { get; set; }
    2025        public float Score { get; set; }
    2126    }
     
    2530        private const string ContentField = "content";
    2631        private const string PluginField = "plugin";
    27         //private const string HelpFilePath = "";
    28         //private const string IndexPath = "";
    2932        public string HelpFilePath { get; set; }
    3033        public string IndexPath { get; set; }
     
    3538            LocalSearch.Search(SearchString);
    3639
    37 
    38 
    39 
    40 
     40            //Hier eventuell dann noch die Online-Suche miteinbauen.
     41            //Einfach neben der Klasse "LocalSearchTool" noch eine Klasse
     42            //"OnlineSearchTool" erstellen
    4143            return LocalSearch.SearchResults;
    4244        }
     
    4547        {
    4648            Lucene.Net.Store.Directory dir = FSDirectory.GetDirectory(IndexPath, true);
    47 
    4849            Analyzer analyzer = new StandardAnalyzer();
    49 
    50             var indexWriter = new
    51             IndexWriter(dir, analyzer, true);
    52 
    53             indexWriter.SetMaxFieldLength(int.MaxValue);
     50            var indexWriter = new IndexWriter(dir, analyzer, true, new IndexWriter.MaxFieldLength(25000));
    5451
    5552            foreach (var File in Directory.GetFiles(HelpFilePath))
    5653            {
    57                 var text = GetTextFromXaml(File);
     54                var text = GetTextFromXaml(File).Replace("\r\n"," ").Replace("\n"," ");
    5855                var doc = new Document();
    5956
     
    6461                doc.Add(fldContent);
    6562                doc.Add(fldName);
    66                 indexWriter.AddDocument(doc, analyzer);
     63                indexWriter.AddDocument(doc);
    6764            }
    68 
    6965            indexWriter.Optimize();
    7066            indexWriter.Close();
     
    113109        private const int ContextLeftOffset = 15;
    114110        private const int ContextRightOffset = 35;
    115         private const int ContextLength = ContextLeftOffset + ContextRightOffset;
    116111
    117112        public override void Search(string SearchString)
     
    120115            SearchString = SearchString.ToLower();
    121116            var dir = FSDirectory.GetDirectory(IndexPath, false);
    122 
    123117            var searcher = new IndexSearcher(dir);
    124 
    125             IndexReader Reader = searcher.Reader;
    126 
    127118            var parser = new QueryParser(ContentField, new StandardAnalyzer());
    128119            Query query = parser.Parse(SearchString);
    129120
    130             Lucene.Net.Search.Hits hits = searcher.Search(query);
     121            Hits hits = searcher.Search(query);
    131122
    132123            for (int i = 0; i < hits.Length(); i++)
    133124            {
    134125                Document doc = hits.Doc(i);
     126                var result = new SearchResult { Score = hits.Score(i), Plugin = doc.Get(PluginField) };
     127
     128                //Text des aktuellen Dokuments auslesen
    135129                string text = doc.Get(ContentField);
    136                 var tpv = (TermPositionVector)Reader.GetTermFreqVector(hits.Id(i), ContentField);
     130                //Alle indizierten Wörter dieses Dokumentes auslesen
     131                var tpv = (TermPositionVector)IndexReader.Open(dir).GetTermFreqVector(hits.Id(i), ContentField);
    137132                String[] DocTerms = tpv.GetTerms();
     133                //Die Anzahl der Erscheinungen aller Wörter auslesen
    138134                int[] freq = tpv.GetTermFrequencies();
     135                //Hier wollen wir nun die Positionen der Erscheinungen des Suchwortes herausfinden
    139136                for (int t = 0; t < freq.Length; t++)
    140137                {
     138                    //Falls das Suchwort mit dem aktuellen Wort übereinstimmt...
    141139                    if (DocTerms[t].Equals(SearchString))
    142140                    {
     141                        //...können wir die Positionen auslesen
    143142                        TermVectorOffsetInfo[] offsets = tpv.GetOffsets(t);
    144                         int[] pos = tpv.GetTermPositions(t);
    145 
    146                         for (int tp = 0; tp < pos.Length; tp++)
     143                        //Das Array beinhaltet nun für das Suchwort alle Auftreten mit jeweils Anfang und Ende
     144                        for (int j = 0; j < offsets.Length; j++)
    147145                        {
    148                             int start = offsets[tp].GetStartOffset();
    149                             int indexStart = start - ContextLeftOffset < 0 ? 0 : start - ContextLeftOffset;
    150                             int contextstart = 0;
    151                             if (indexStart > 0)
    152                                 contextstart = text.IndexOf(' ', indexStart) + 1;
    153                             int contextlength = text.IndexOf(' ', contextstart + ContextLength) - contextstart;
    154                             string context = contextstart + contextlength > text.Length ? text.Substring(contextstart) : text.Substring(contextstart, contextlength);
    155                             SearchResults.Add(new SearchResult { Plugin = doc.Get(PluginField), Context = context, Score = hits.Score(i) });
     146                            //Jetz muss nur noch ein kleiner Kontextausschnitt ausgelesen werden, damit der User etwas damit anfangen kann
     147                            int start = offsets[j].GetStartOffset();
     148                            int end = offsets[j].GetEndOffset();
     149                            int contextStart = start - ContextLeftOffset;
     150                            contextStart = contextStart < 0 ? 0 : contextStart;
     151                            int contextEnd = end + ContextRightOffset;
     152                            contextEnd = contextEnd > text.Length ? text.Length : contextEnd;
     153                            //Nun wollen wir noch bis zum Ende des nächsten Wortes lesen, um das Ergebnis besser lesbar zu machen
     154                            int nextEndSpace = text.IndexOf(" ", contextEnd);
     155                            contextEnd = nextEndSpace > 0 ? nextEndSpace : contextEnd;
     156                            //Maximal so viele Zeichen darf der Text nach einem Leerzeichen links von dem Suchergebnis durchsucht werden
     157                            int leftSpaceOffset = contextStart;
     158                            //Finden des nächstenLeerzeichens links vom Suchergebnis
     159                            int nextStartSpace = text.LastIndexOf(" ", contextStart, leftSpaceOffset);
     160                            //Falls es kein Space in der Nöhe gibt brauchen wir natürlich auch nichts verändern
     161                            contextStart = nextStartSpace > 0 ? nextStartSpace : contextStart;
     162                            int contextLength = contextEnd - contextStart;
     163                            contextLength = contextLength > text.Length ? text.Length : contextLength;
     164                            //Kontext auslesen
     165                            string context = text.Substring(contextStart, contextLength);
     166                            //und den Searchresults zusammen mit dem zugehörigen PlugInNamen und dem HitScore hinzufügen
     167                            result.Contexts.Add(context);
    156168                        }
    157169                    }
    158170                }
    159 
     171                SearchResults.Add(result);
    160172            }
    161173        }
Note: See TracChangeset for help on using the changeset viewer.