Changeset 274


Ignore:
Timestamp:
Apr 6, 2009, 12:08:18 AM (13 years ago)
Author:
enkler
Message:

continued implementation of local search, quasi finished

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypCore/SearchProvider.cs

    r271 r274  
    99using Lucene.Net.Search;
    1010using Lucene.Net.Store;
    11 using Directory=System.IO.Directory;
     11using Directory = System.IO.Directory;
     12using System;
    1213
    1314namespace Cryptool.Core
     
    1718        public string Plugin { get; set; }
    1819        public string Context { get; set; }
     20        public float Score { get; set; }
    1921    }
    2022
    2123    public class SearchProvider
    2224    {
     25        private const string ContentField = "content";
     26        private const string PluginField = "plugin";
    2327        //private const string HelpFilePath = "";
    2428        //private const string IndexPath = "";
     
    2832        public List<SearchResult> Search(string SearchString)
    2933        {
    30             var LocalSearch = new LocalSearchTool {IndexPath = IndexPath};
     34            var LocalSearch = new LocalSearchTool { IndexPath = IndexPath };
    3135            LocalSearch.Search(SearchString);
    3236
     
    4650            var indexWriter = new
    4751            IndexWriter(dir, analyzer, true);
    48            
     52
    4953            indexWriter.SetMaxFieldLength(int.MaxValue);
    5054
    51             foreach(var File in Directory.GetFiles(HelpFilePath))
     55            foreach (var File in Directory.GetFiles(HelpFilePath))
    5256            {
    5357                var text = GetTextFromXaml(File);
    5458                var doc = new Document();
    5559
    56                 var fldContent =
    57                     new Field("content", text, Field.Store.YES, Field.Index.TOKENIZED,
     60                var fldContent = new Field(ContentField, text, Field.Store.YES, Field.Index.TOKENIZED,
    5861                              Field.TermVector.WITH_POSITIONS_OFFSETS);
    59                 var fldName =
    60                     new Field("plugin", Path.GetFileNameWithoutExtension(Path.GetFileName(File)), Field.Store.YES, Field.Index.NO,
     62                var fldName = new Field(PluginField, Path.GetFileNameWithoutExtension(Path.GetFileName(File)), Field.Store.YES, Field.Index.NO,
    6163                              Field.TermVector.NO);
    6264                doc.Add(fldContent);
     
    9597        public List<SearchResult> SearchResults { get; set; }
    9698
     99        protected const string ContentField = "content";
     100        protected const string PluginField = "plugin";
     101
    97102
    98103        public virtual void Search(string SearchString)
    99104        {
    100             SearchResults = new List<SearchResult>();   
     105            SearchResults = new List<SearchResult>();
    101106        }
    102107    }
     
    106111        public string IndexPath { get; set; }
    107112
     113        private const int ContextLeftOffset = 15;
     114        private const int ContextRightOffset = 35;
     115        private const int ContextLength = ContextLeftOffset + ContextRightOffset;
     116
    108117        public override void Search(string SearchString)
    109118        {
    110119            base.Search(SearchString);
     120            SearchString = SearchString.ToLower();
    111121            var dir = FSDirectory.GetDirectory(IndexPath, false);
    112122
    113123            var searcher = new IndexSearcher(dir);
    114124
    115             var parser = new QueryParser("content", new StandardAnalyzer());
     125            IndexReader Reader = searcher.Reader;
     126
     127            var parser = new QueryParser(ContentField, new StandardAnalyzer());
    116128            Query query = parser.Parse(SearchString);
    117129
     
    121133            {
    122134                Document doc = hits.Doc(i);
     135                string text = doc.Get(ContentField);
     136                var tpv = (TermPositionVector)Reader.GetTermFreqVector(hits.Id(i), ContentField);
     137                String[] DocTerms = tpv.GetTerms();
     138                int[] freq = tpv.GetTermFrequencies();
     139                for (int t = 0; t < freq.Length; t++)
     140                {
     141                    if (DocTerms[t].Equals(SearchString))
     142                    {
     143                        TermVectorOffsetInfo[] offsets = tpv.GetOffsets(t);
     144                        int[] pos = tpv.GetTermPositions(t);
    123145
    124                 var positions = searcher.Reader.TermPositions(new Term("content", SearchString));
    125                 positions.GetHashCode();
    126 
    127                 var text = doc.Get("content");
    128                 text.GetHashCode();
    129                 while (positions.Next())
    130                 {
    131                     var Doc = positions.Doc();
    132                     Doc.GetHashCode();
    133                     var position = positions.NextPosition();
    134                     position.GetHashCode();
     146                        for (int tp = 0; tp < pos.Length; tp++)
     147                        {
     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) });
     156                        }
     157                    }
    135158                }
    136159
    137                 SearchResults.Add(new SearchResult { Plugin = doc.Get("plugin") });
    138160            }
    139161        }
    140162    }
    141163}
     164
  • trunk/CrypCoreSearchTest/Program.cs

    r271 r274  
    2222            {
    2323                Console.WriteLine(Result.Plugin);
     24                Console.WriteLine(Result.Score);
     25                Console.WriteLine(Result.Context);
    2426            }
    2527            Console.ReadKey();
Note: See TracChangeset for help on using the changeset viewer.