WEBUS2.0 In Action - [源代码] - C#代码搜索器

最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索器程序, 非常方便的完成了这项工作.

Code Search程序首先会在选定的目录中搜索所有cs文件:

    private void btnOpen_Click(object sender, EventArgs e)
{
try
{
if (folderBrowserDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Task.Factory.StartNew(IndexProc);
//...
}

然后创建IIndexer, 并在一个线程中为所有找到的文件编制索引:

        void IndexProc()
{
var files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.cs", SearchOption.AllDirectories);
if (files != null && files.Length > 0)
{
//...this.ResetIndex();
foreach (var file in files)
{
Document doc = new Document();
doc.Fields.Add(new Field("FileName", file, FieldAttributes.None));
doc.Fields.Add(new Field("Code", StringHelper.LoadString(file), FieldAttributes.AnalyseIndex));
m_Index.Add(doc);
//...

}
}
//...
} void ResetIndex()
{
if (m_Index != null)
{
m_Index.Close();
}
m_Index = new IndexManager(new CodeAnalyzer());
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 + @"\Index");
m_Searcher = new IndexSearcher(m_Index);
}

通过调节DumpDocs和DumpSize, 可以优化程序的内存占用;

通过调节Min/MaxIndexSize和MergeFactor, 可以优化程序的IO性能, 目前我设置的MinIndexSize最大意味着自始至终只会生成一个索引片段; MergeFactor最大意味着从不合并索引片段.

在创建索引的时候, 我们使用的是专门为代码分析设计的IAnalyzer:

    class CodeAnalyzer : IAnalyzer
{
//...public ITokenStream GetTokenStream(Webus.Documents.Field field)
{
if (field.Name == "Code")
{
return this.GetTokenStream(field.Value.ToString());
}
else
{
return null;
}
}
} class CodeTokenStream : ITokenStream
{
HashSet<string> stops = new HashSet<string>(new string[] {
"abstract",
"event",
"new",
//...
"enum",
"namespace",
"string"

});

Queue<Token> m_Buffer = new Queue<Token>();
public CodeTokenStream(string text)
{
MatchCollection mc = Regex.Matches(text, @"\w+");
foreach (Match m in mc)
{
var key = m.Value.ToLower();
if (stops.Contains(key) == false)
{
m_Buffer.Enqueue(
new Token(key, m.Index, m.Length));
}

}
}
//...
}

这个分析器中包含了所有C#的关键词, 由于他们是绝对高频词并且没有搜索的意义, 因此在分析的时候会跳过这些词汇而不做任何处理.

在编制索引的时候通过事件将状态更新到UI上面:

        private void frmCodeSearch_Load(object sender, EventArgs e)
{
try
{
this.StatusChanged += new StatusChangeEventHandler(frmCodeSearch_StatusChanged);
//...
} delegate void UpdateUI();
void frmCodeSearch_StatusChanged(object sender, string status)
{
this.Invoke(new UpdateUI(() => { this.txtStatus.Text = status; }));
}

这里是跨线程更新UI, 因此需要使用this.Invoke来封送相应操作.

索引编制过程中就可以开始搜索了:

对应代码如下:

        private void txtKeyword_TextChanged(object sender, EventArgs e)
{
try
{
TermQuery query = 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;
}
catch (Exception ex)
{
MessageBox.Show(ExceptionHelper.ToString(ex));
}
}

创建一个TermQuery对象, 对Code字段进行搜索, 构建List<SearchResult>类型的结果集, 并且绑定到DataGridView上面, 大功告成! enjoy~!

下载源代码

阅读更多WEBUS2.0 SDK文章

 
 
分类: WEBUS
标签: c#索引WEBUS

C#代码搜索器的更多相关文章

  1. WEBUS2.0 In Action - [源代码] - C#代码搜索器

    最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...

  2. [源代码] - C#代码搜索器 - 续

    在前文 [源代码] - C#代码搜索器 中我开发了一个代码搜索器. 我对其做的最后改动是将索引保存到磁盘中, 以备今后使用. 如今, 我在工作中又接到一项新任务: 有一个大项目, 其中10个负责数据访 ...

  3. 开源代码搜索器searchcode

    项目主页:https://searchcode.com/ 查看API:https://searchcode.com/api/ 关于:https://searchcode.com/about/ Sear ...

  4. html 音乐 QQ播放器 外链 代码 播放器 外链 代码

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha QQ播放器 外链 代码 播放器 外链 代码 ======== 歌曲链接 QQ播放器 外链 ...

  5. 利用 vuex 实现一个公用搜索器

    安装 npm i vuex vuex 的使用 先创建好如图所示的文件: 编写 modules 下的 params.js const param = { state: { params: {} }, m ...

  6. 超级文件搜索器(SuperSearch)

    写了个工具,各个分享渠道上传太难了,在这里分享给大家吧! 中文名称:超级文件搜索器 英文名称:  SuperSearch 适用对象:硬盘里文件达到数万至数千万级的用户 运行环境:WindowXP,Wi ...

  7. 推荐一个C#代码混淆器 .NET Reactor【转】

    C#的代码辛苦写出来之后,一个反射工具,就可以完全显露出来. 当然,在做项目时,这个功能还不错.因为我就曾在一个项目上使用C#,没有进行任何混淆.结果在项目二年多之后,需要做一些调整,自己保存的源代码 ...

  8. Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码

    我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...

  9. C# 必应代码搜索

    微软宣布推出必应代码搜索服务,暂时只支持 C# 语言,日后将支持更多代码语言. Visual Studio 用户安装必应搜索插件之后可使用该服务来简化编程任务.Visual Studio 与 MSDN ...

随机推荐

  1. .Net2.0 --Winform结合WebBrowser控件和Socket老技术来实现另类Push~

    原文:.Net2.0 --Winform结合WebBrowser控件和Socket老技术来实现另类Push~ 目前的企业级开发比较流行的是Web2.0技术,但是由于Web技术基于请求--响应的交互模式 ...

  2. 跟着大神重写的KNN 文档归类小工具

    ·背景 在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算.在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393. ...

  3. 多线程学习之BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...

  4. unity3d插件Daikon Forge GUI 中文教程-1-Daikon Forge介绍

    (游戏蛮牛首发)大家好我是孙广东官网提供了专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. 只是教程 ...

  5. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  6. css3中display和box小结

    display:table用处: 1.创建登高列 2.实现大小不确定元素的垂直居中 3.容器内子项目数目未知,子项目平均分配容器的水平空间 float必须指定其宽度才行,不确定的话就用display: ...

  7. 通过Web Api 和 Angular.js 构建单页面的web 程序

    通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...

  8. DDD分层架构之值对象(介绍篇)

    DDD分层架构之值对象(介绍篇) 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使 ...

  9. 转载:你需要知道的16个Linux服务器监控命令

    源址:http://web.itivy.com/article-653-1.html 如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Lin ...

  10. Ubuntu开启NFS,挂载根目录

    1.安装NFS server Ubuntu初始状态是没有NFS server的,首先要安装NFS server: $ sudo apt-get install nfs-kernel-server (安 ...