public AnonymousClassHitCollector1(Lucene.Net.Search.HitCollector results, int start, ParallelMultiSearcher enclosingInstance)
 {
     InitBlock(results, start, enclosingInstance);
 }
 private void  InitBlock(Lucene.Net.Search.HitCollector results, int start, ParallelMultiSearcher enclosingInstance)
 {
     this.results           = results;
     this.start             = start;
     this.enclosingInstance = enclosingInstance;
 }
 public AnonymousClassCollector1(Lucene.Net.Search.Collector collector, int start, ParallelMultiSearcher enclosingInstance)
 {
     InitBlock(collector, start, enclosingInstance);
 }
 private void InitBlock(Lucene.Net.Search.Collector collector, int start, ParallelMultiSearcher enclosingInstance)
 {
     this.collector = collector;
     this.start = start;
     this.enclosingInstance = enclosingInstance;
 }
Esempio n. 5
0
		public virtual void  TestParallelMultiSort()
		{
			Searcher searcher = new ParallelMultiSearcher(new Searchable[]{searchX, searchY});
			RunMultiSorts(searcher, false);
		}
Esempio n. 6
0
        public static List<SearchRecord> HighLightSearch(out Dictionary<string,List<int>> statistics)
        {
            List<SearchRecord> recordList = new List<SearchRecord>();
            statistics = new Dictionary<string,List<int>>();
            try
            {
                if (searchIndexList.Count > 0)
                {
                    foreach (IndexSet indexSet in searchIndexList)
                    {
                        if (indexSet.Type == IndexTypeEnum.Increment)
                            continue;
                        Query query = GetQuery(indexSet);
                        Source source = indexDict[indexSet];
                        Dictionary<string, IndexField> fpDict = source.FieldDict;
                        //IndexSearcher searcher = new IndexSearcher(indexSet.Path);
                        IndexSearcher presearcher = new IndexSearcher(indexSet.Path);
                        ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                        System.Console.WriteLine(query.ToString());
#endif
                        Highlighter highlighter = new Highlighter(new QueryScorer(query));
                        highlighter.SetTextFragmenter(new SimpleFragmenter(SupportClass.FRAGMENT_SIZE));
                        TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                        List<int> posList=new List<int>();
                        for (int i = 0; i < scoreDocs.Length; i++)
                        {
                            float score = scoreDocs[i].score;
                            if (score < searchSet.MinScore)
                                continue;
                            Document doc = searcher.Doc(scoreDocs[i].doc);
                            Field[] fields = new Field[doc.GetFields().Count];
                            doc.GetFields().CopyTo(fields, 0);
                            List<SearchField> sfList = new List<SearchField>();
                            foreach (Field field in fields)
                            {
                                string key = field.Name();
                                string value = field.StringValue();
                                string output = SupportClass.String.DropHTML(value);
                                TokenStream tokenStream = analyzer.TokenStream(key, new System.IO.StringReader(output));
                                string result = "";
                                result = highlighter.GetBestFragment(tokenStream, output);
                                if (result != null && string.IsNullOrEmpty(result.Trim()) == false)
                                {
                                    if (fpDict.ContainsKey(key))
                                        sfList.Add(new SearchField(key, fpDict[key].Caption, value, result, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                                    else
                                        sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                                }
                                else
                                {
                                    if (fpDict.ContainsKey(key))
                                        sfList.Add(new SearchField(key, fpDict[key].Caption, value, value, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                                    else
                                        sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                                }
                            }
                            recordList.Add(new SearchRecord(indexSet, sfList, indexDict[indexSet].PrimaryKey, score));
                            posList.Add(recordList.Count - 1);
                        }
                        try
                        {
                            statistics.Add(indexSet.Caption, posList);
                        }
                        catch (Exception)
                        {
                            int i = 2;
                            while (statistics.ContainsKey(indexSet.Caption + i.ToString()))
                                i++;
                            statistics.Add(indexSet.Caption + i.ToString(), posList);
                        }
                    }
                }
                else
                {
                    foreach (IndexSet indexSet in indexFieldsDict.Keys)
                    {
                        if (indexSet.Type == IndexTypeEnum.Increment)
                            continue;
                        Query query = GetQuery(indexSet);
                        Source source = indexDict[indexSet];
                        Dictionary<string, IndexField> fpDict = source.FieldDict;
                        //IndexSearcher searcher = new IndexSearcher(indexSet.Path);
                        IndexSearcher presearcher = new IndexSearcher(indexSet.Path);
                        ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                        System.Console.WriteLine(query.ToString());
#endif
                        Highlighter highlighter = new Highlighter(new QueryScorer(query));
                        highlighter.SetTextFragmenter(new SimpleFragmenter(SupportClass.FRAGMENT_SIZE));
                        TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                        List<int> posList=new List<int>();
                        for (int i = 0; i < scoreDocs.Length; i++)
                        {
                            float score = scoreDocs[i].score;
                            if (score < searchSet.MinScore)
                                continue;
                            Document doc = searcher.Doc(scoreDocs[i].doc);
                            Field[] fields = new Field[doc.GetFields().Count];
                            doc.GetFields().CopyTo(fields, 0);
                            List<SearchField> sfList = new List<SearchField>();
                            foreach (Field field in fields)
                            {
                                string key = field.Name();
                                string value = field.StringValue();
                                string output = SupportClass.String.DropHTML(value);
                                TokenStream tokenStream = analyzer.TokenStream(key, new System.IO.StringReader(output));
                                string result = "";
                                result = highlighter.GetBestFragment(tokenStream, output);
                                if (result != null && string.IsNullOrEmpty(result.Trim()) == false)
                                {
                                    if (fpDict.ContainsKey(key))
                                        sfList.Add(new SearchField(key, fpDict[key].Caption, value, result, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                                    else
                                        sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                                }
                                else
                                {
                                    if (fpDict.ContainsKey(key))
                                        sfList.Add(new SearchField(key, fpDict[key].Caption, value, value, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                                    else
                                        sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                                }
                            }
                            recordList.Add(new SearchRecord(indexSet, sfList, indexDict[indexSet].PrimaryKey, score));
                            posList.Add(recordList.Count - 1);
                        }
                        try
                        {
                            statistics.Add(indexSet.Caption, posList);
                        }
                        catch (Exception)
                        {
                            int i = 2;
                            while (statistics.ContainsKey(indexSet.Caption + i.ToString()))
                                i++;
                            statistics.Add(indexSet.Caption + i.ToString(), posList);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                SupportClass.FileUtil.WriteToLog(SupportClass.LogPath, e.StackTrace.ToString());
            }
            return recordList;
        }
Esempio n. 7
0
    public void Query()
    {
        //������ѯ��Ҫ��ʵ������
        //==================================>(1)������������:  File ��File2<==============================
        //Lucene.Net.Index.MultiReader reader = new Lucene.Net.Index.MultiReader(new IndexReader[] { IndexReader.Open(@"\\172.16.32.189\File"), IndexReader.Open(Server.MapPath("./") + @"index\\File\\") });

        Lucene.Net.Search.ParallelMultiSearcher searcher;

        System.String index1 = Server.MapPath("./") + "index\\File\\";
        IndexReader reader1 = IndexReader.Open(index1);//��ȡ������ȡ����ʵ�����ô�Ϊ������ȡ��reader��ȡ�ļ���Ϊindex���ļ���(Ŀ¼)
        Searcher searcher1 = new IndexSearcher(reader1);//ָ��searcher(����)�� IndexReader(������ȡ��)
        Analyzer analyzer = new StandardAnalyzer();//��׼������

        System.String index2 = @"\\172.16.32.189\File";
        //System.String index = Server.MapPath("./") + "index\\File2\\";//�������ڵ�Ŀ¼��

        if (new System.IO.FileInfo(index2).Exists)
        {
            IndexReader reader2 = Lucene.Net.Index.IndexReader.Open(index2);//��ȡ������ȡ����ʵ�����ô�Ϊ������ȡ��reader��ȡ�ļ���Ϊindex���ļ���(Ŀ¼)
            IndexSearcher searcher2 = new IndexSearcher(reader2);
            searcher = new Lucene.Net.Search.ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searcher1, searcher2 });
        }
        else
        {
            searcher = new Lucene.Net.Search.ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searcher1 });
        }

        //==================================>(2)�����ڴ�����<==============================
        //Lucene.Net.Search.IndexSearcher searcher = new IndexSearcher(ramdir);

        //��ѯǰ���ѽ������ʾ���
        this.result_TxtBox.Text = "";
        //�����ѯ����
        if (this.query_txtbox.Text.Trim(new char[] { ' ' }) == String.Empty)
            return;

        System.String Query_condition = this.query_txtbox.Text.Trim();

        //====================>(1)�����ѯ����<==============================================
           //System.String field= "title";//���ڱ�����ҳɹ����ļ����ڵ�Ŀ¼
           //QueryParser parser = new QueryParser("field", analyzer);//������ѯ��������ָ����field(������ָcontents��Ŀ¼), analyzer����׼��������

           //====================>(2)�����ѯ����<==============================================
           string[] strs = new string[] { "title", "contents" };
           Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.MultiFieldQueryParser(strs, new StandardAnalyzer());
           parser.SetDefaultOperator(Lucene.Net.QueryParsers.QueryParser.OR_OPERATOR);

           Query query = parser.Parse(Query_condition);//����һ����ѯ����ָ����ѯ����Query_condition������ this.Query_txt.Text��
           //�����
        Hits hits = searcher.Search(query);//����hits��������Search������)query���õ����ļ�
        if (hits.Length()==0)
        {
            this.result_TxtBox.Text += "==========������˼����ѯ����������Ĺؼ��֡�^+^===========" + "\n";
         }
           else{
           for (int i = 0; i < hits.Length(); i++)
        {
            // �õ����е��ĵ�
            Document doc = hits.Doc(i);

            //string filename = doc.Get("path");//�õ������ļ���������Ŀ¼·��
            string result_path = doc.Get("path");//�õ����е��ļ�Ŀ¼��

            //string folder = Path.GetDirectoryName(result_path);

            string filename = Path.GetFileName(result_path);//�õ������ļ���

            //DirectoryInfo di = new DirectoryInfo(folder);

            this.result_TxtBox.Text += "======================================================" + "\n";
            this.result_TxtBox.Text += "��ѯ������ڵ��ļ�:   "+filename + "\n";
            //this.result_TxtBox.Text += "��ѯ������ڵ�Ŀ¼:   " + di.FullName + "\n";

        }
        }
           //reader.Close();
           searcher.Close();
    }
Esempio n. 8
0
 /// <summary>
 /// 初始化MultiSearcher
 /// </summary>
 /// <returns>返回MultiSearcher实例</returns>
 public static ParallelMultiSearcher GenerateMultiSearcher(string fileType)
 {
     IndexSearcher[] searchs;
     if (!string.IsNullOrEmpty(fileType))
     {
         List<string> types = fileType.Split(',').ToList();
         for (int i = types.Count - 1; i >= 0; i--)
         {
             var temp = types[i];
             if (!System.IO.Directory.Exists("E:\\Indexs\\" + temp))
             {
                 types.Remove(temp);
             }
         }
         searchs = new IndexSearcher[types.Count];
         for (int i = 0; i < types.Count; i++)
         {
             SetIndexStorePath("E:\\Indexs\\" + types[i]);
             searchs[i] = GenerateSearcher();
         }
     }
     else
     {
         DirectoryInfo dir = System.IO.Directory.CreateDirectory(_indexStorePath);
         DirectoryInfo[] dirs = dir.GetDirectories();
         searchs = new IndexSearcher[dirs.Length];
         for (int i = 0; i < dirs.Length; i++)
         {
             SetIndexStorePath("E:\\Indexs\\" + dirs[i].Name);
             searchs[i] = GenerateSearcher();
         }
     }
     _multiSearch = new ParallelMultiSearcher(searchs);
     return _multiSearch;
 }
Esempio n. 9
0
    /// <summary>
    /// �������ڡ��������ķ���
    /// </summary>
    private void search()
    {
        DateTime start = DateTime.Now;

        //try
        //{
        // }
        //catch (Exception e)
        //{

        //    Response.Write("<script type='text/javascript'>window.alert(' " + e.ToString() + " ');</script>");

        //}

        // ��������
        //�������ڡ�index��Ŀ¼��
        string indexDirectory1 = Server.MapPath("./")+"index\\1.5\\";
        IndexSearcher searcher1 = new IndexSearcher(indexDirectory1);

           string indexDirectory2 = Server.MapPath("./") + "index\\1.4\\";
        IndexSearcher searcher2 = new IndexSearcher(indexDirectory2);

        //System.String index3 = @"\\192.168.1.130\index\1.5";
        //Lucene.Net.Index.IndexReader reader3;
        Lucene.Net.Search.ParallelMultiSearcher searcher;

           /* if (System.IO.Directory.Exists(index3))//�Ƿ����Ŀ¼
        {
            reader3 = Lucene.Net.Index.IndexReader.Open(index3);//��ȡ������ȡ����ʵ�����ô�Ϊ������ȡ��reader��ȡ�ļ���Ϊindex���ļ���(Ŀ¼)
            IndexSearcher searcher3 = new IndexSearcher(reader3);

            searcher = new Lucene.Net.Search.ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searcher3,searcher1, searcher2 });
        }
        else
        {
            searcher = new Lucene.Net.Search.ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searcher1, searcher2 });
        }*/
            searcher = new Lucene.Net.Search.ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searcher1, searcher2 });

        //====================>(1)�����ѯ����<==============================================
        //System.String field = "text";//���ڱ�����ҳɹ����ļ����ڵ�Ŀ¼
        //QueryParser parser = new QueryParser(field, new StandardAnalyzer());//������ѯ��������ָ����field(������ָcontents��Ŀ¼), analyzer����׼��������

        //====================>(2)�����ѯ����<==============================================
        string[] strs = new string[] { "text", "path","fullpath","keywords","description","title" };
        Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.MultiFieldQueryParser(strs, new StandardAnalyzer());
        parser.SetDefaultOperator(Lucene.Net.QueryParsers.QueryParser.OR_OPERATOR);

        // ���������
        this.Results.Columns.Add("link", typeof(string));
        this.Results.Columns.Add("title", typeof(string));
        this.Results.Columns.Add("sample", typeof(string));
        this.Results.Columns.Add("path", typeof(string));

        // ����
        Query query = parser.Parse(this.Query);//����һ����ѯ����ָ����ѯ����Query_condition������ this.Query_txt.Text��
        Hits hits = searcher.Search(query);

        this.total = hits.Length();

        // ���� �����Ĺؼ���,Ĭ����<b>..</b>
          // �����ָ��<read>..</read>
          SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<B style='color:Red;'>", "</B>");
          Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
          // ���һ�������Ҫ���صģ����������ݳ���
          // ���̫С����ֻ�����ݵĿ�ʼ���ֱ��������������ҷ��ص�����Ҳ��    ̫����ʱ̫�˷��ˡ�
          highlighter.SetTextFragmenter(new SimpleFragmenter(100));

        // initialize startAt
        this.startAt = initStartAt();

        // ��ʾ�������ġ������Ŀ
        int resultsCount = smallerOf(total, this.maxResults + this.startAt);

        for (int i = startAt; i < resultsCount; i++)
        {
            // �õ����е��ĵ�
            Document doc = hits.Doc(i);

            //��ӽ�β����֤��β������Ų�������
            string title = doc.Get("title") + "  ";
            // �õ��ļ�����
            System.String text =Search.CutString( doc.Get("text"),480);
            // �õ��ļ�������ȷ·��
            string path = doc.Get("path");
            string orpath = doc.Get("fullpath");

            Lucene.Net.Analysis.TokenStream titkeStream = analyzer.TokenStream("title", new System.IO.StringReader(title));//��Ŀ
            Lucene.Net.Analysis.TokenStream tokenStream = analyzer.TokenStream("text", new System.IO.StringReader(text));//ժҪ
            Lucene.Net.Analysis.TokenStream pathStream = analyzer.TokenStream("path", new System.IO.StringReader(path));//��ʾ��·��

            System.String result = highlighter.GetBestFragments(tokenStream, text, 2, "...");
            string tresult = highlighter.GetBestFragments(titkeStream, title, 2, "..");
            string pathwords = highlighter.GetBestFragments(pathStream, path, 2, ".."); //·����ʱ��ʾ

            // ����һ������ʾ�������Ľ��
            DataRow row = this.Results.NewRow();
            if (tresult == "")
            {
                row["title"] = title;
            }
            else {
                row["title"] = tresult;

            }
            if (getpath(row, System.IO.Path.GetFileName(path.Replace("\\", "/"))))
            {
               row["link"]=getFullpath( System.IO.Path.GetFileName(doc.Get("path")));
            }
            else {
                row["link"] =orpath;
                if (pathwords=="")
                {
                    row["path"] = orpath;

                }
                else
                {
                    row["path"] = pathwords.Replace("\\", "/");

                }

            }

            if (result == ""){
                row["sample"] = text;

            }
            else {
                row["sample"] = result;

            }

            this.Results.Rows.Add(row);
        }
        searcher.Close();

        // �����Ϣ
        this.duration = DateTime.Now - start;
        this.fromItem = startAt + 1;
        this.toItem = smallerOf(startAt + maxResults, total);
    }
Esempio n. 10
0
        public virtual void  TestParallelMultiSort()
        {
            Searcher searcher = new ParallelMultiSearcher(new Lucene.Net.Search.Searchable[] { searchX, searchY });

            RunMultiSorts(searcher);
        }
Esempio n. 11
0
 public static List<SearchRecord> SearchPage(out Query query, out Dictionary<string, int> statistics,List<string> filterList,int pageSize, int pageNum,bool fileInclude,bool highLight)
 {
     List<SearchRecord> recordList = new List<SearchRecord>();
     query = GetQuery(fileInclude);
     statistics = new Dictionary<string, int>();
     try
     {
         #region Add Index Dir
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "begin to init searcher.");
         List<IndexSearcher> searcherList = new List<IndexSearcher>();
         if (searchIndexList.Count > 0)
         {
             foreach (IndexSet indexSet in searchIndexList)
             {
                 if (indexSet.Type == IndexTypeEnum.Increment)
                     continue;
                 searcherList.Add(new IndexSearcher(indexSet.Path));
             }
         }
         else
         {
             foreach (IndexSet indexSet in indexFieldsDict.Keys)
             {
                 if (indexSet.Type == IndexTypeEnum.Increment)
                     continue;
                 searcherList.Add(new IndexSearcher(indexSet.Path));
             }
         }
         if (fileInclude)
         {
             searcherList.Add(new IndexSearcher(fileSet.Path));
         }
         #endregion
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "begin to Search.");
         ParallelMultiSearcher searcher = new ParallelMultiSearcher(searcherList.ToArray());
         TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
         ScoreDoc[] scoreDocs = topDocs.scoreDocs;
         Highlighter highlighter = new Highlighter(new QueryScorer(query));
         highlighter.SetTextFragmenter(new SimpleFragmenter(SupportClass.FRAGMENT_SIZE));
         #region Order by Score
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "Add to list.");
         List<ScoreDoc> scoreDocList = new List<ScoreDoc>();
         for (int i = 0; i < scoreDocs.Length; i++)
         {
             float score = scoreDocs[i].score;
             if (score < searchSet.MinScore)
                 continue;
             scoreDocList.Add(scoreDocs[i]);
         }
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "Begin to sort.");
         scoreDocList.Sort(delegate(ScoreDoc x, ScoreDoc y)
         {
             if (x.score > y.score)
                 return -1;
             else if (x.score == y.score)
                 return 0;
             else
                 return 1;
         });
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "End sort.");
         #endregion
         #region Doc Statistic
         int start = 0, end = scoreDocList.Count;
         if (pageSize > 0 && pageNum >= 1)
         {
             start = pageSize * (pageNum - 1)+1;
             end = pageNum * pageSize;
         }
         int current = 1;
         SpecialFieldSelector sfSelector = new SpecialFieldSelector(SupportClass.TableFileNameField);
         for (int recNum = 0; recNum < scoreDocList.Count; recNum++)
         {
             float score = scoreDocList[recNum].score;
             if (score < searchSet.MinScore)
                 continue;
             Document fDoc = searcher.Doc(scoreDocList[recNum].doc,sfSelector);
             string caption = fDoc.Get(SupportClass.TableFileNameField);
             if ((caption.Equals(SupportClass.TFNFieldValue) == false))
             {
                 if (sfpDict.ContainsKey(caption) == false || nameIndexDict.ContainsKey(caption) == false)
                 {
                     continue;
                 }
             }
             if (statistics.ContainsKey(caption))
             {
                 statistics[caption] = statistics[caption] + 1;
             }
             else
             {
                 statistics.Add(caption, 1);
             }
             if (filterList != null && filterList.Count>0)
             {
                 if (!filterList.Contains(caption))
                     continue;
             }
             #region Add Page
             if (current >= start && current <= end)
             {
                 Document doc = searcher.Doc(scoreDocList[recNum].doc);
                 doc.RemoveField(SupportClass.TableFileNameField);
                 Dictionary<string, IndexField> fpDict = sfpDict[caption];
                 Field[] fields = new Field[doc.GetFields().Count];
                 doc.GetFields().CopyTo(fields, 0);
                 #region SearchField
                 List<SearchField> sfList = new List<SearchField>();
                 foreach (Field field in fields)
                 {
                     string key = field.Name();
                     string value = field.StringValue();
                     string result = "";
                     if (highLight)
                     {
                         string output = SupportClass.String.DropHTML(value);
                         TokenStream tokenStream = analyzer.TokenStream(key, new System.IO.StringReader(output));
                         result = highlighter.GetBestFragment(tokenStream, output);
                         if (result != null && string.IsNullOrEmpty(result.Trim()) == false)
                         {
                             if (fpDict.ContainsKey(key))
                                 sfList.Add(new SearchField(key, fpDict[key].Caption, value, result, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                             else
                                 sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                         }
                         else
                         {
                             if (fpDict.ContainsKey(key))
                                 sfList.Add(new SearchField(key, fpDict[key].Caption, value, value, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                             else
                                 sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                         }
                     }
                     else
                     {
                         if (fpDict.ContainsKey(key))
                             sfList.Add(new SearchField(key, fpDict[key].Caption, value, value, field.GetBoost(), fpDict[key].IsTitle, true, fpDict[key].Order));
                         else
                             sfList.Add(new SearchField(key, key, value, result, field.GetBoost(), false, false, 0));
                     }
                 }
                 #endregion
                 if (caption.Equals(SupportClass.TFNFieldValue) == false)
                 {
                     IndexSet indexSet = nameIndexDict[caption];
                     recordList.Add(new SearchRecord(indexSet, sfList, indexDict[indexSet].PrimaryKey, score));
                 }
                 else
                 {
                     recordList.Add(new SearchRecord("文件", "文件", "文件", score, sfList));
                 }
             }
             #endregion
             current++;
         }
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search.log", "End of Search.");
         #endregion
     }
     catch (Exception)
     {
         //SupportClass.FileUtil.WriteToLog(@"D:\Indexer\log\search_log.txt", e.StackTrace.ToString());
     }
     return recordList;
 }
Esempio n. 12
0
        public static List<SearchRecord> HighLightSearchFile()
        {
            List<SearchRecord> recordList = new List<SearchRecord>();
            try
            {
                Query query = GetFileQuery();
                IndexSearcher presearcher = new IndexSearcher(fileSet.Path);
                ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                System.Console.WriteLine(query.ToString());
#endif
                Highlighter highlighter = new Highlighter(new QueryScorer(query));
                highlighter.SetTextFragmenter(new SimpleFragmenter(SupportClass.FRAGMENT_SIZE));
                TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                for (int i = 0; i < scoreDocs.Length; i++)
                {
                    float score = scoreDocs[i].score;
                    if (score < searchSet.MinScore)
                        continue;
                    Document doc = searcher.Doc(scoreDocs[i].doc);
                    string name = doc.Get("Name");
                    string path = doc.Get("Path");
                    string content = doc.Get("Content");
                    TokenStream nts = analyzer.TokenStream("Name", new System.IO.StringReader(name));
                    TokenStream pts = analyzer.TokenStream("Path", new System.IO.StringReader(path));
                    TokenStream cts = analyzer.TokenStream("Content", new System.IO.StringReader(content));
                    string nr = "",pr="",cr="";
                    nr = highlighter.GetBestFragment(nts, name);
                    pr = highlighter.GetBestFragment(pts, path);
                    cr = highlighter.GetBestFragment(cts, content);
                    SearchField nf;
                    SearchField pf;
                    SearchField cf;
                    if (nr != null && string.IsNullOrEmpty(nr.Trim()) == false)
                    {
                        nf = new SearchField("文件名", "文件名", name, nr, 1.0f, true, true, 0);
                    }
                    else
                    {
                        nf = new SearchField("文件名", "文件名", name, name, 1.0f, true, true, 0);
                    }
                    if (pr != null && string.IsNullOrEmpty(pr.Trim()) == false)
                    {
                        pf = new SearchField("路径", "路径", path, pr, 1.0f, false, true, 0);
                    }
                    else
                    {
                        pf = new SearchField("路径", "路径", path, path, 1.0f, false, true, 0);
                    }
                    if (cr != null && string.IsNullOrEmpty(cr.Trim()) == false)
                    {
                        cf = new SearchField("内容", "内容", content, cr, 1.0f, false, true, 0);
                    }
                    else
                    {
                        cf = new SearchField("内容", "内容", content, content, 1.0f, false, true, 0);
                    }
                    recordList.Add(new SearchRecord("文件", "文件", "文件",score, nf, pf, cf));
                }
            }
            catch (Exception e)
            {
                SupportClass.FileUtil.WriteToLog(SupportClass.LogPath, e.StackTrace.ToString());
            }
            return recordList;
        }
Esempio n. 13
0
        public static List<SearchRecord> SearchFile()
        {
            List<SearchRecord> recordList = new List<SearchRecord>();
            try
            {
                Query query = GetFileQuery();
                IndexSearcher presearcher = new IndexSearcher(fileSet.Path);
                ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                System.Console.WriteLine(query.ToString());
#endif
                TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                for (int i = 0; i < scoreDocs.Length; i++)
                {
                    float score = scoreDocs[i].score;
                    if (score < searchSet.MinScore)
                        continue;
                    Document doc = searcher.Doc(scoreDocs[i].doc);
                    string name = doc.Get("Name");
                    string path = doc.Get("Path");
                    string content = doc.Get("Content");
                    SearchField nf = new SearchField("文件名", "文件名", name, name, 1.0f, true, true, 0);
                    SearchField pf = new SearchField("路径", "路径", path, path, 1.0f, false, true, 0);
                    SearchField cf = new SearchField("内容", "内容", content, content, 1.0f, false, true, 0);
                    recordList.Add(new SearchRecord("文件","文件","文件",score,nf,pf,cf));
                }
            }
            catch (Exception e)
            {
                SupportClass.FileUtil.WriteToLog(SupportClass.LogPath, e.StackTrace.ToString());
            }
            return recordList;
        }
Esempio n. 14
0
 public AnonymousClassCollector1(Lucene.Net.Search.Collector collector, int start, ParallelMultiSearcher enclosingInstance)
 {
     InitBlock(collector, start, enclosingInstance);
 }
Esempio n. 15
0
        public IEnumerable<IHit> Query(int pageIndex, int pageSize, out int totalCount, out IEnumerable<FacetGroup> facetedResults)
        {
            totalCount = 0;
            facetedResults = null;

            if (searchPaths == null || searchPaths.Count <= 0)
                searchPaths.AddRange(indexPaths.Values.Select(o => o.Path));

            List<LuceneHit> results = new List<LuceneHit>();

            List<IndexSearcher> subSearchs = new List<IndexSearcher>();

            searchPaths.ForEach(o => subSearchs.Add(new IndexSearcher(FSDirectory.Open(o))));

            if (facetFields != null && facetFields.Count > 0)
            {
                var facetGroups = new List<FacetGroup>();
                var mainQueryFilter = new CachingWrapperFilter(new QueryWrapperFilter(query));
                MultiReader readers = new MultiReader(subSearchs.Select(o => o.IndexReader).ToArray());

                foreach (var facetField in facetFields)
                {
                    FacetGroup fg = new FacetGroup();
                    fg.FieldName = facetFieldNameProvider.GetMapName(TypeName, facetField);
                    var items = new List<FacetItem>();

                    var allDistinctField = FieldCache_Fields.DEFAULT.GetStrings(readers, facetField).Distinct().ToArray();
                    int totalHits = 0;

                    Parallel.ForEach(allDistinctField, fieldValue =>
                        {
                        //foreach (var fieldValue in allDistinctField)
                        //{
                            var facetQuery = new TermQuery(new Term(facetField, fieldValue));
                            var facetQueryFilter = new CachingWrapperFilter(new QueryWrapperFilter(facetQuery));

                            var bs = new OpenBitSetDISI(facetQueryFilter.GetDocIdSet(readers).Iterator(), readers.MaxDoc);
                            bs.InPlaceAnd(mainQueryFilter.GetDocIdSet(readers).Iterator());
                            int count = (Int32)bs.Cardinality();

                            FacetItem item = new FacetItem();
                            item.GroupValue = fieldValue;
                            item.Count = count;

                            items.Add(item);
                            totalHits += count;
                        }
                    );

                    fg.FacetItems = items.OrderByDescending(o => o.Count);
                    fg.TotalHits = totalHits;

                    facetGroups.Add(fg);
                }

                facetedResults = facetGroups.OrderBy(o => o.FieldName);
            }
            ParallelMultiSearcher searcher = new ParallelMultiSearcher(subSearchs.ToArray());
            Sort sort = null;
            if (sortFields != null && sortFields.Count > 0)
            {
                sort = new Sort(sortFields.ToArray());
            }

            int maxDoc = searcher.MaxDoc;
            int startIndex = 0;
            if (pageIndex >= 0 && pageSize > 0)
            {
                startIndex = pageIndex * pageSize;
                maxDoc = pageSize * (pageIndex + 1);
            }
            var docs = sort == null ?  searcher.Search(query, null, maxDoc) : searcher.Search(query, null, maxDoc, sort);
            totalCount = docs.TotalHits;
            int endIndex = docs.TotalHits - startIndex;
            for (int i = startIndex; i < endIndex; i++)
            {
                LuceneHit h = new LuceneHit(TypeName, DocumentBuilder, searcher.Doc(docs.ScoreDocs[i].Doc));
                results.Add(h);
            }
            return results;
        }
Esempio n. 16
0
 private void  InitBlock(Lucene.Net.Search.Collector collector, int start, ParallelMultiSearcher enclosingInstance)
 {
     this.collector         = collector;
     this.start             = start;
     this.enclosingInstance = enclosingInstance;
 }
Esempio n. 17
0
			public AnonymousClassHitCollector1(Lucene.Net.Search.HitCollector results, int start, ParallelMultiSearcher enclosingInstance)
			{
				InitBlock(results, start, enclosingInstance);
			}
Esempio n. 18
0
		public virtual void  TestEmptyFieldSort()
		{
			sort.SetSort("string");
			AssertMatches(full, queryF, sort, "ZJI");
			
			sort.SetSort("string", true);
			AssertMatches(full, queryF, sort, "IJZ");
			
			sort.SetSort(new SortField("i18n", new System.Globalization.CultureInfo("en")));
			AssertMatches(full, queryF, sort, "ZJI");
			
			sort.SetSort(new SortField("i18n", new System.Globalization.CultureInfo("en"), true));
			AssertMatches(full, queryF, sort, "IJZ");
			
			sort.SetSort("int");
			AssertMatches(full, queryF, sort, "IZJ");
			
			sort.SetSort("int", true);
			AssertMatches(full, queryF, sort, "JZI");
			
			sort.SetSort("float");
			AssertMatches(full, queryF, sort, "ZJI");
			
			// using a nonexisting field as first sort key shouldn't make a difference:
			sort.SetSort(new SortField[]{new SortField("nosuchfield", SortField.STRING), new SortField("float")});
			AssertMatches(full, queryF, sort, "ZJI");
			
			sort.SetSort("float", true);
			AssertMatches(full, queryF, sort, "IJZ");
			
			// When a field is null for both documents, the next SortField should be used.
			// Works for
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float")});
			AssertMatches(full, queryG, sort, "ZWXY");
			
			// Reverse the last criterium to make sure the test didn't pass by chance
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float", true)});
			AssertMatches(full, queryG, sort, "ZYXW");
			
			// Do the same for a MultiSearcher
			Searcher multiSearcher = new MultiSearcher(new Searchable[]{full});
			
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float")});
			AssertMatches(multiSearcher, queryG, sort, "ZWXY");
			
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float", true)});
			AssertMatches(multiSearcher, queryG, sort, "ZYXW");
			// Don't close the multiSearcher. it would close the full searcher too!
			
			// Do the same for a ParallelMultiSearcher
			Searcher parallelSearcher = new ParallelMultiSearcher(new Searchable[]{full});
			
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float")});
			AssertMatches(parallelSearcher, queryG, sort, "ZWXY");
			
			sort.SetSort(new SortField[]{new SortField("int"), new SortField("string", SortField.STRING), new SortField("float", true)});
			AssertMatches(parallelSearcher, queryG, sort, "ZYXW");
			// Don't close the parallelSearcher. it would close the full searcher too!
		}
Esempio n. 19
0
			private void  InitBlock(Lucene.Net.Search.HitCollector results, int start, ParallelMultiSearcher enclosingInstance)
			{
				this.results = results;
				this.start = start;
				this.enclosingInstance = enclosingInstance;
			}
Esempio n. 20
0
		public virtual void  TestParallelMultiSort()
		{
			Searcher searcher = new ParallelMultiSearcher(new Lucene.Net.Search.Searchable[]{searchX, searchY});
			RunMultiSorts(searcher);
		}
Esempio n. 21
0
        public static List<SearchRecord> SearchEx(out Dictionary<string,List<int>> statistics)
        {
            List<SearchRecord> recordList = new List<SearchRecord>();
            statistics = new Dictionary<string,List<int>>();
            try
            {
                if (searchIndexList.Count > 0)
                {
                    foreach (IndexSet indexSet in searchIndexList)
                    {
                        if (indexSet.Type == IndexTypeEnum.Increment)
                            continue;
                        Query query = GetQuery(indexSet);
                        Source source = indexDict[indexSet];
                        Dictionary<string, IndexField> fpDict = source.FieldDict;
                        //IndexSearcher searcher = new IndexSearcher(indexSet.Path);
                        IndexSearcher presearcher = new IndexSearcher(indexSet.Path);
                        ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                        System.Console.WriteLine(query.ToString());
#endif
                        TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                        List<int> posList=new List<int>();
                        for (int i = 0; i < scoreDocs.Length; i++)
                        {
                            Document doc = searcher.Doc(scoreDocs[i].doc);
                            float score = scoreDocs[i].score;
                            if (score < searchSet.MinScore)
                                continue;
                            Field[] fields = new Field[doc.GetFields().Count];
                            doc.GetFields().CopyTo(fields, 0);
                            List<SearchField> sfList = new List<SearchField>();
                            foreach (Field field in fields)
                            {
                                if (fpDict.ContainsKey(field.Name()))
                                    sfList.Add(new SearchField(field, fpDict[field.Name()]));
                                //else
                                //    sfList.Add(new SearchField(field,false));
                            }
                            recordList.Add(new SearchRecord(indexSet, sfList, indexDict[indexSet].PrimaryKey, score));
                            posList.Add(recordList.Count - 1);
                        }
                        try
                        {
                            statistics.Add(indexSet.Caption, posList);
                        }
                        catch (Exception)
                        {
                            int i = 2;
                            while (statistics.ContainsKey(indexSet.Caption + i.ToString()))
                                i++;
                            statistics.Add(indexSet.Caption + i.ToString(), posList);
                        }
                    }
                }
                else
                {
                    foreach (IndexSet indexSet in indexFieldsDict.Keys)
                    {
                        if (indexSet.Type == IndexTypeEnum.Increment)
                            continue;
                        Query query = GetQuery(indexSet);
                        Source source = indexDict[indexSet];
                        Dictionary<string, IndexField> fpDict = source.FieldDict;
                        //IndexSearcher searcher = new IndexSearcher(indexSet.Path);
                        IndexSearcher presearcher = new IndexSearcher(indexSet.Path);
                        ParallelMultiSearcher searcher = new ParallelMultiSearcher(new IndexSearcher[] { presearcher });
#if DEBUG
                        System.Console.WriteLine(query.ToString());
#endif
                        TopDocs topDocs = searcher.Search(query.Weight(searcher), null, searchSet.MaxMatches);
                        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                        List<int> posList=new List<int>();
                        for (int i = 0; i < scoreDocs.Length; i++)
                        {
                            Document doc = searcher.Doc(scoreDocs[i].doc);
                            float score = scoreDocs[i].score;
                            if (score < searchSet.MinScore)
                                continue;
                            Field[] fields = new Field[doc.GetFields().Count];
                            doc.GetFields().CopyTo(fields, 0);
                            List<SearchField> sfList = new List<SearchField>();
                            foreach (Field field in fields)
                            {
                                if (fpDict.ContainsKey(field.Name()))
                                    sfList.Add(new SearchField(field, fpDict[field.Name()]));
                                //else
                                //    sfList.Add(new SearchField(field, false));
                            }
                            recordList.Add(new SearchRecord(indexSet, sfList, indexDict[indexSet].PrimaryKey, score));
                            posList.Add(recordList.Count - 1);
                        }
                        try
                        {
                            statistics.Add(indexSet.Caption, posList);
                        }
                        catch (Exception)
                        {
                            int i = 2;
                            while (statistics.ContainsKey(indexSet.Caption + i.ToString()))
                                i++;
                            statistics.Add(indexSet.Caption + i.ToString(), posList);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                SupportClass.FileUtil.WriteToLog(SupportClass.LogPath, e.StackTrace.ToString());
            }
            return recordList;
        }