程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WEBUS2.0 In Action

WEBUS2.0 In Action

編輯:C#入門知識

最近由於工作的需要, 要分析大量C#代碼, 在數萬個cs文件中搜索特定關鍵詞. 這是一項非常耗時的工作, 用Notepad++要運行接近半個小時. 於是我利用WEBUS2.0 SDK創建了一個代碼搜索器程序, 非常方便的完成了這項工作.

        var files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.cs", SearchOption.AllDirectories);
             (files !=  && files.Length > //... ( file Document doc //... (m_Index != =  IndexManager(m_Index.DumpDocs = 3000;
            m_Index.DumpSize = 10;
            m_Index.MinIndexSize = int.MaxValue;
            m_Index.MaxIndexSize = int.MaxValue;
            m_Index.MergeFactor = int.MaxValue;
            m_Index.New(AppDomain.CurrentDomain.BaseDirectory + = 

通過調節DumpDocs和DumpSize, 可以優化程序的內存占用;

通過調節Min/MaxIndexSize和MergeFactor, 可以優化程序的IO性能, 目前我設置的MinIndexSize最大意味著自始至終只會生成一個索引片段; MergeFactor最大意味著從不合並索引片段.

在創建索引的時候, 我們使用的是專門為代碼分析設計的IAnalyzer:

     (field.Name ==   HashSet<string> stops = new HashSet<string>(new string[] { 
            "abstract",
            "event",    
            "new",    
             
            "enum",    
            "namespace",    
            "string"
        });
        Queue<Token> m_Buffer =  Queue<Token> CodeTokenStream(= Regex.Matches(text,  (Match m  key =if (stops.Contains(key) == false)
                {
                    m_Buffer.Enqueue(new Token(key, m.Index, m.Length));
                }
            }
        }
        

這個分析器中包含了所有C#的關鍵詞, 由於他們是絕對高頻詞並且沒有搜索的意義, 因此在分析的時候會跳過這些詞匯而不做任何處理. 

在編制索引的時候通過事件將狀態更新到UI上面:

          frmCodeSearch_Load(this.StatusChanged += new StatusChangeEventHandler(frmCodeSearch_StatusChanged);
                
  frmCodeSearch_StatusChanged( sender, this.Invoke(new UpdateUI(() => { this.txtStatus.Text = status; }));
        }

這裡是跨線程更新UI, 因此需要使用this.Invoke來封送相應操作. 

索引編制過程中就可以開始搜索了:

= new TermQuery(new Term("Code", txtKeyword.Text.ToLower())); var hits = m_Searcher.Search(query); List<SearchResult> result = new List<SearchResult>(); foreach (HitDoc hit in hits) { StandardHighlighter hl = new StandardHighlighter(hit); result.Add(new SearchResult(hit)); } dgvResult.DataSource = result; }

創建一個TermQuery對象, 對Code字段進行搜索, 構建List<SearchResult>類型的結果集, 並且綁定到DataGridView上面, 大功告成! enjoy~!

下載源代碼

閱讀更多WEBUS2.0 SDK文章

增強了搜索功能, 支持WEBUS2.0 SDK的查詢表達式, 能夠完成各種復雜的搜索任務. 具體語法將在後面的文章中介紹. 

2013-8-20補充: 

Build - 選擇一個文件夾開始編制索引, 編好的索引自動保存在當前目錄的CodeSearch.Index子目錄下面. 比如我們選擇C:\SourceCode來編制索引, 這索引數據會保存在C:\SourceCode\CodeSearch.Index中. 

Open - 打開已經存在的索引, 即上面所說的CodeSearch.Index文件夾. 

關閉程序時會自動關閉當前索引. 索引關閉後全部數據都保存到磁盤上, 下次可以直接打開來繼續使用. 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved