通通WPF随笔(1)——基于lucene.NET让ComboBox拥有强大的下拉联想功能
2013-02-05 10:46
423 查看
我一直很疑惑百度、谷哥搜索框的下拉联想功能是怎么实现的?是不断地查询数据库吗?其实到现在我也不知道,他们是怎么实现这么高效的。后来在博客园无意邂逅了“鹿神”,搜索引擎唉,听起来就很高端。于是研究了一段时间后就产生了这个WPF的下拉联想控件。
名称:
View Code
2、查询索引
就是构造lucene查询query时用PrefixQuery类就行,如下:
3、ComboBox绑定数据源
数据源为ObservableCollection<dynamic>类型集合,后台我们只用动态构造出每一个查询对象添加进集合里即可。初始化dynamic对象时还不能用ExpandoObject,虽然ExpandoObject很方便,但是这是一个封闭类,不能继承。ComboBox在选中其中一项显示到文本框里时,其实是执行了选中项数据源的ToString()方法。所以不能重载ExpandoObject的ToString()方法。所以这里自定义了一个轻量级的ExpandoObject类,继承于DynamicObject实现。
代码:
这样就实现了一个简易的ExpandoObject了。接下来遍历查询结果,通过SetValue动态创建对象的属性,添加进ObservableCollection<dynamic>数据集合,ComboBox直接数据绑定即可。
下载:demo
参考文献:
lucene,你也会(7篇)——第一篇 快速入门
使用Lucene.Net实现全文检索
WPF地区选择控件(内附下载地址)
后记
其实相同的功能我用查询数据库的方法,也实现过了,但是耗时每次都是100多毫秒。lucene估计有个缓存吧,速度会越来越快,而且经常被查寻的东西优先级别会提高,排在前面。
以我的经验,写关于美工的文章比逻辑的获得的关注和推荐多得多。我也很想把通通玩Blend美工这个系列写下去,毕竟我大部分的粉丝都来源于这个系列。但是,最近几个月,都在纠结WF、WCF等等逻辑方面的,对美工没什么好的创意。
写博客图个什么?不就是作为一个平凡的码农,想要得到更多人的关注和认可,让我觉得自己其实和民工还是有点区别的。
对了,我之前嵌在博客里的silverlight为什么都显示不出来了?xap文件我都是放在博客园的文件里的。求大神解答。
名称:
View Code
private void Button_Click_1(object sender, RoutedEventArgs e) { //设置索引文件夹 var directory = FSDirectory.GetDirectory(DirTextBox.Text, true); //创建一个索引,采用StandardAnalyzer对句子进行分词 IndexWriter indexWriter = new IndexWriter(directory, new StandardAnalyzer()); var columnName= ColumnNameTextBox.Text.Split(','); //设置数据库连接字符串 if (ComboBox1.Text=="Sqlite") { helper=new CopDb.CopDbHelper(CopDb.CopDbHelper.CopDbType.Sqlite,ConnTestBox.Text); } if (ComboBox1.Text=="Access") { helper = new CopDb.CopDbHelper(CopDb.CopDbHelper.CopDbType.Access, ConnTestBox.Text); } int timeOut = Environment.TickCount; var read = helper.ExecuteReader(SQLStrTextBox.Text); SqlTimeTextBox.Text = (Environment.TickCount - timeOut).ToString(); while (read.Read()) { //创建文档 Document doc = new Document(); //添加字段 foreach (var item in columnName) { doc.Add(new Field(item, read[item].ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); } indexWriter.AddDocument(doc); } read.Close(); //对索引文件进行优化 indexWriter.Optimize(); indexWriter.Close(); MessageBox.Show("创建索引完成"); }
2、查询索引
就是构造lucene查询query时用PrefixQuery类就行,如下:
var cols = SearchColTextBox.Text.Split(','); BooleanQuery query = new BooleanQuery(); foreach (var item in cols) { query.Add(new PrefixQuery(new Term(item, SearchTextBox.Text)),BooleanClause.Occur.SHOULD); } //query.parse:注入查询条件 var hits = search.Search(query);
3、ComboBox绑定数据源
数据源为ObservableCollection<dynamic>类型集合,后台我们只用动态构造出每一个查询对象添加进集合里即可。初始化dynamic对象时还不能用ExpandoObject,虽然ExpandoObject很方便,但是这是一个封闭类,不能继承。ComboBox在选中其中一项显示到文本框里时,其实是执行了选中项数据源的ToString()方法。所以不能重载ExpandoObject的ToString()方法。所以这里自定义了一个轻量级的ExpandoObject类,继承于DynamicObject实现。
代码:
class dyData:DynamicObject { public dyData(string colName) { this.colName = colName; } //ToString时需要输出的属性 public string colName { get; set; } //用于存储属性名和对应的值 Dictionary<string, object> data = new Dictionary<string, object>(); //绑定时获取对应属性的值 public override bool TryGetMember(GetMemberBinder binder, out object result) { return data.TryGetValue(binder.Name,out result); } //用于添加属性和对应的值 public void SetValue(string name, object value) { data.Add(name, value); } //重写Tostring方法 public override string ToString() { try { return data[colName].ToString(); } catch (Exception ex) { MessageBox.Show("找不到列名"+colName,"设置text要显示的项名时出错",MessageBoxButton.OK,MessageBoxImage.Error); return null; } } }
这样就实现了一个简易的ExpandoObject了。接下来遍历查询结果,通过SetValue动态创建对象的属性,添加进ObservableCollection<dynamic>数据集合,ComboBox直接数据绑定即可。
下载:demo
参考文献:
lucene,你也会(7篇)——第一篇 快速入门
使用Lucene.Net实现全文检索
WPF地区选择控件(内附下载地址)
后记
其实相同的功能我用查询数据库的方法,也实现过了,但是耗时每次都是100多毫秒。lucene估计有个缓存吧,速度会越来越快,而且经常被查寻的东西优先级别会提高,排在前面。
以我的经验,写关于美工的文章比逻辑的获得的关注和推荐多得多。我也很想把通通玩Blend美工这个系列写下去,毕竟我大部分的粉丝都来源于这个系列。但是,最近几个月,都在纠结WF、WCF等等逻辑方面的,对美工没什么好的创意。
写博客图个什么?不就是作为一个平凡的码农,想要得到更多人的关注和认可,让我觉得自己其实和民工还是有点区别的。
对了,我之前嵌在博客里的silverlight为什么都显示不出来了?xap文件我都是放在博客园的文件里的。求大神解答。
相关文章推荐
- 利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。
- 通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
- 火力全开——仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 文本框(Textbox)和下拉框(Combobox)自动联想功能的实现
- 文本框(Textbox)和下拉框(Combobox)自动联想功能的实现
- 仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
- 【转】文本框(Textbox)和下拉框(Combobox)自动联想功能的实现
- WPF ComboBox下拉绑定Treeview 功能的实现
- 通通WPF随笔(2)——自己制作轻量级asp.net网站服务
- 火力全开——仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 使用FlexBox和Json实现类似ComboBox(类似Google的输入提示和自动)功能-基于JQuery-ASP.NET
- 火力全开——仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 站内搜索------仿造Baidu简单实现基于Lucene.net的全文检索的功能
- 瞎折腾之 Lucene.Net + MVC 搜索功能(上)
- lucene.net helper类 【结合盘古分词进行搜索的小例子(分页功能)】
- VB.net中COMBOBOX控件下拉颜色的变化
- EXT.NET 选择ComboBox下拉框中的值,另外一个下拉框的显示状态跟着变化
- lucene.net 2.9.2 实现索引生成,修改,查询,删除功能