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 > )
{
//...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~!
2013-7-21补充:
增强了搜索功能, 支持WEBUS2.0 SDK的查询表达式, 能够完成各种复杂的搜索任务. 具体语法将在后面的文章中介绍.

2013-8-20补充:
Build - 选择一个文件夹开始编制索引, 编好的索引自动保存在当前目录的CodeSearch.Index子目录下面. 比如我们选择C:\SourceCode来编制索引, 这索引数据会保存在C:\SourceCode\CodeSearch.Index中.
Open - 打开已经存在的索引, 即上面所说的CodeSearch.Index文件夹.
关闭程序时会自动关闭当前索引. 索引关闭后全部数据都保存到磁盘上, 下次可以直接打开来继续使用.
WEBUS2.0 In Action - [源代码] - C#代码搜索器的更多相关文章
- [源代码] - C#代码搜索器 - 续
在前文 [源代码] - C#代码搜索器 中我开发了一个代码搜索器. 我对其做的最后改动是将索引保存到磁盘中, 以备今后使用. 如今, 我在工作中又接到一项新任务: 有一个大项目, 其中10个负责数据访 ...
- C#代码搜索器
WEBUS2.0 In Action - [源代码] - C#代码搜索器 最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++ ...
- WEBUS2.0 In Action - 搜索操作指南 - (1)
上一篇:WEBUS2.0 In Action - 索引操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(2) 1. IQueriable中内置的搜索功能 在Webus ...
- WEBUS2.0 In Action - 搜索操作指南 - (2)
上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...
- WEBUS2.0 In Action - 搜索操作指南 - (3)
上一篇:WEBUS2.0 In Action - 搜索操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(4) 3. 评分机制 (Webus.Search.IHitSc ...
- WEBUS2.0 In Action - 搜索操作指南 - (4)
上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...
- WEBUS2.0 In Action - 索引操作指南(2)
上一篇:WEBUS2.0 In Action - 索引操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(1) 3. 添加.删除.撤销删除和修改文档 在WEBUS中要将 ...
- 开源代码搜索器searchcode
项目主页:https://searchcode.com/ 查看API:https://searchcode.com/api/ 关于:https://searchcode.com/about/ Sear ...
- 从源代码分析modelDriven拦截器和params拦截器和拦截器prepare 和paramsPrepareParamsStack拦截器栈(让你的Struts2代码更简洁——如何培养框架设计能力
源代码文件:Web App Libraries/struts2-core-2.3.15.3.jar/struts-default.xml 拦截器modelDriven: <interceptor ...
随机推荐
- 国内Jquery CDN
新浪CDN: <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js">< ...
- FastDfs点滴
1.centos安装后提示找不到libevent动态库 根据系统是64位版本还是32位版本,若是64位版本则默认回到 /usr/lib64 目录下查找,而对于32位则到 /usr/lib 目录下查找. ...
- DevExpress TreeList 那些事儿
1:TreeList绑定数据源 当我们给予TreeList 的 parentFieldName 和 KeyFieldName 两个属性之后 会自动的生成树结构. 1 var sql = @" ...
- 最近在看 ASP.NET 5,有关官方实现的 OAuth 2 包
有了官方实现的 OAuth 2 包,再扩展到国内就方便多了(懒得找第三方). 官方实现的有关授权和验证的包:https://github.com/aspnet/Security 根据这些,我就扩展了几 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 使用datatable 将测试数据与业务分离
当基本一致的业务流程, 需要测试繁杂的测试数据时,就可以将测试数据参数化了,同时使用datatable来实现测试数据与业务分离,这个方法在我现在的项目中应用在很多地方,感觉超级方便,现对工作中的应用做 ...
- lintcode:买卖股票的最佳时机 I
买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...
- ubuntu14.04安装MATLAB R2014a
1. 首先现在matlab2014a,http://pan.baidu.com/s/1pJGF5ov [Matlab2014a(密码:en52).该文件下载解压后如下所示: 2. 解压解压包(用lin ...
- ffmpeg转码MPEG2-TS的音视频同步机制分析
http://blog.chinaunix.net/uid-26000296-id-3483782.html 一.FFmpeg忽略了adaptation_field()数据 FFmpeg忽略了包含PC ...
- yafeilinux.com的开源项目非常好的东西
转自:http://www.yafeilinux.com/?page_id=9 声明:我们网站的资源可以自由下载,转载,但是不能用作商业用途.如有问题请联系我们www.yafeilinux.com . ...