Spring.net整合全文检索Lucene.net的方法(附例子)
要实现Spring.net与Lucene.net的整合,关键点在于: 1、查询时,使用Spring.net集成的nHibernate来管理Lucene.net使用的Session; 2、对数据实体的CRUD进行事件监控,以便动态更新索引 经过一番尝试,
要实现Spring.net与Lucene.net的整合,关键点在于:
1、查询时,使用Spring.net集成的nHibernate来管理Lucene.net使用的Session;
2、对数据实体的CRUD进行事件监控,以便动态更新索引
经过一番尝试,决定将原有的框架进行升级——spring.net 1.2.0 + nHibernaet 2.0.1 + Lucene.net 2.0 + nHibernate.Search。
ok,看看都需要进行哪些调整:
一、实体生成模板加上索引
在model层引用nHibernate.Search程序集,它的作用是根据实体上的元标记,选择是否为实体开启存储空间,以及索引的字段范围。
修改codeSmith中的nHibernate Template,像这样,用以将主键和字符型字段进行索引:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a C# class for use with NHibnate" %> <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the mapping file is based on" %> <%@ Property Name="Namespace" Type="System.String" Default="MyNamespace.Data" Category="Object" Description="The class namespace that the mapping file should use" %> <%@ Property Name="Assembly" Type="System.String" Default="MyApp.MyAssembly" Category="Object" Description="The assembly that the class will be used in" %> <%@ Property Name="RemoveTablePrefix" Type="System.String" Default="tbl" Category="Object" Description="The prefix to remove from table names" %> <%@ Property Name="ForceId" Type="System.Boolean" Default="true" Category="Object" Description="Force Id for identity column" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Assembly Name="System.Data" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Text.RegularExpressions" %> using System; using System.Collections.Generic; using NHibernate.Search.Attributes; using NHibernate.Search; namespace <%= Namespace %> { #region <%= ClassName(SourceTable) %> /// <summary> /// <%= ClassName(SourceTable) %> object for NHibernate mapped table '<%= ClassTable(SourceTable) %>'. /// </summary> [Serializable] [TableInfo(TableName = "<%= ClassTable(SourceTable) %>", PrimaryKey = "<%= ColumnName(SourceTable.PrimaryKey.MemberColumns[0])%>" , Columns="<% for(int i=0;i<SourceTable.Columns.Count;i ) {%><%=ColumnName(SourceTable.Columns[i]) (i==SourceTable.Columns.Count-1 ? "":",") %><%}%>")] [Indexed(Index = "<%= ClassName(SourceTable) %>")] public class <%= ClassName(SourceTable) %> { #region Member Variables <% if (SourceTable.PrimaryKey.MemberColumns.Count == 1) {%> protected <%= IdMemberType(SourceTable) %> <%= IdMemberName(SourceTable) %>; <% } %> <% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %> protected <%= MemberType(column) %> <%= MemberName(column) %>; <% } %> <% foreach (TableKeySchema foreignKey in SourceTable.ForeignKeys) { %> protected <%= ManyToOneClass(foreignKey) %> <%= ManyToOneMemberName(foreignKey) %>; <% if ((foreignKey.ForeignKeyTable == SourceTable) && (foreignKey.PrimaryKeyTable == SourceTable)) { %> protected <%= CollectionType(foreignKey)%> <%= CollectionMemberName(foreignKey)%>; <% } %> <% } %> <% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %> <% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { %> protected <%= CollectionType(primaryKey)%> <%= CollectionManyToManyMemberName(primaryKey)%>; <% } else if (IsOneToOneTable(primaryKey)) { %> protected <%= OneToOneClass(primaryKey) %> <%= OneToOneMemberName(primaryKey) %>; <% } else if (IsSubClassTable(primaryKey)) { %> <% } else { %> protected <%= CollectionType(primaryKey)%> <%= CollectionMemberName(primaryKey)%>; <% } %> <% } %> #endregion #region Constructors public <%= ClassName(SourceTable) %>() { } public <%= ClassName(SourceTable) %>( <% int count = 0; foreach(ColumnSchema column in SourceTable.NonKeyColumns) { if (count > 0) Response.Write(", "); %><%= MemberType(column) %> <%= ParameterName(column) %><% count ; } foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { if (count > 0) Response.Write(", "); %><%= ManyToOneClass(foreignKey) %> <%= ManyToOneParameterName(foreignKey) %><% count ; } %> ) { <% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %> this.<%= MemberName(column) %> = <%= ParameterName(column) %>; <% } %> <% foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { %> this.<%= ManyToOneMemberName(foreignKey) %> = <%= ManyToOneParameterName(foreignKey) %>; <% } %> } #endregion #region Public Properties <% if (SourceTable.PrimaryKey.MemberColumns.Count == 1) {%> [DocumentId] public <%= IdMemberType(SourceTable) %> <%= IdName(SourceTable) %> { get {return <%= IdMemberName(SourceTable) %>;} <% if (IdMemberType(SourceTable) == "string" ) {%> set { if ( value != null && value.Length > <%= ColumnLength(SourceTable.PrimaryKey.MemberColumns[0])%>) throw new ArgumentOutOfRangeException("Invalid value for <%= IdName(SourceTable) %>", value, value.ToString()); <%= IdMemberName(SourceTable) %> = value; } <% } else { %> set {<%= IdMemberName(SourceTable) %> = value;} <% } %> } <% } %> <% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %> <%if( MemberType(column) =="string"){%> [Field(Index.Tokenized, Store = Store.Yes)] <%}%> public <%= MemberType(column) %> <%= PropertyName(column) %> { get { return <%= MemberName(column) %>; } <% if (MemberType(column) == "string") {%> set { <% if(ColumnLength(column) != "16" ){ %> if ( value != null && value.Length > <%= ColumnLength(column)%>) throw new ArgumentOutOfRangeException("Invalid value for <%= PropertyName(column) %>", value, value.ToString()); <%}%> <%= MemberName(column) %> = value; } <% } else { %> set { <%= MemberName(column) %> = value; } <% } %> } <% } %> <% foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { %> public <%= ManyToOneClass(foreignKey) %> <%= ManyToOneName(foreignKey) %> { get { return <%= ManyToOneMemberName(foreignKey) %>; } set { <%= ManyToOneMemberName(foreignKey) %> = value; } } <% if ((foreignKey.ForeignKeyTable == SourceTable) && (foreignKey.PrimaryKeyTable == SourceTable)) { %> public <%= CollectionType(foreignKey) %> <%= CollectionName(foreignKey) %> { get { return <%= CollectionMemberName(foreignKey) %>; } set { <%= CollectionMemberName(foreignKey) %> = value; } } <% } %> <% } %> <% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %> <% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { %> public <%= CollectionType(primaryKey) %> <%= CollectionManyToManyName(primaryKey) %> { get { if (<%= CollectionManyToManyMemberName(primaryKey) %>==null) { <%= CollectionManyToManyMemberName(primaryKey) %> = <%= NewCollectionType(primaryKey) %>; } return <%= CollectionManyToManyMemberName(primaryKey) %>; } set { <%= CollectionManyToManyMemberName(primaryKey) %> = value; } } <% } else if (IsOneToOneTable(primaryKey)) { %> public <%= OneToOneClass(primaryKey) %> <%= OneToOneName(primaryKey) %> { get { return <%= OneToOneMemberName(primaryKey) %>; } set { <%= OneToOneMemberName(primaryKey) %> = value; } } <% } else if (IsSubClassTable(primaryKey)) { %> <% } else { %> public <%= CollectionType(primaryKey) %> <%= CollectionName(primaryKey) %> { get { if (<%= CollectionMemberName(primaryKey) %>==null) { <%= CollectionMemberName(primaryKey) %> = <%= NewCollectionType(primaryKey) %>; } return <%= CollectionMemberName(primaryKey) %>; } set { <%= CollectionMemberName(primaryKey) %> = value; } } <% } %> <% } %> #endregion <% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %> <% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { } %> <% else if (IsSubClassTable(primaryKey)) { %> #region <%= JoinedSubclassName(primaryKey) %> /// <summary> /// <%= JoinedSubclassName(primaryKey) %> object for NHibernate mapped table '<%= JoinedSubclassTable(primaryKey) %>'. /// </summary> public class <%= JoinedSubclassName(primaryKey) %> : <%= ClassName(SourceTable) %> { #region Member Variables <% foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { %> protected <%= MemberType(column) %> <%= MemberName(column) %>; <% } %> <% foreach (TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { %> <% if (foreignKey.PrimaryKeyTable != SourceTable) { %> protected <%= ManyToOneClass(foreignKey) %> <%= ManyToOneMemberName(foreignKey) %>; <% } %> <% if ((foreignKey.ForeignKeyTable == primaryKey.ForeignKeyTable) && (foreignKey.PrimaryKeyTable == primaryKey.ForeignKeyTable)) { %> protected <%= CollectionType(foreignKey)%> <%= CollectionMemberName(foreignKey)%>; <% } %> <% } %> #endregion #region Constructors public <%= JoinedSubclassName(primaryKey) %>() : base() { } public <%= JoinedSubclassName(primaryKey) %>( <% count = 0; foreach(ColumnSchema column in SourceTable.NonKeyColumns) { if (count > 0) Response.Write(", "); %><%= MemberType(column) %> <%= ParameterName(column) %><% count ; } foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { if (count > 0) Response.Write(", "); %><%= ManyToOneClass(foreignKey) %> <%= ManyToOneParameterName(foreignKey) %><% count ; } foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { if (count > 0) Response.Write(", "); %><%= MemberType(column) %> <%= ParameterName(column) %><% count ; } foreach(TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { if (foreignKey.PrimaryKeyTable != SourceTable) { if (count > 0) Response.Write(", "); %><%= ManyToOneClass(foreignKey) %> <%= ManyToOneParameterName(foreignKey) %><% count ; } } %> ) : base(<% count = 0; foreach(ColumnSchema column in SourceTable.NonKeyColumns) { if (count > 0) Response.Write(", "); %><%= ParameterName(column) %><% count ; } foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { if (count > 0) Response.Write(", "); %><%= ManyToOneParameterName(foreignKey) %><% count ; } %>) { <% foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { %> this.<%= MemberName(column) %> = <%= ParameterName(column) %>; <% } %> <% foreach (TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { %> <% if (foreignKey.PrimaryKeyTable != SourceTable) { %> this.<%= ManyToOneName(foreignKey) %>
精彩图集
精彩文章
热门标签
音乐播放
网页请求
excel表
字典操作
左键
错误处理
WScript.Shel
指定进程
a元素
美化
指定以外
header
windows换行符
加载数据
正则表
java实现验证码
3G
控件字体
cscript
加入Windows服务
前端
清除重复数据
简明总结
dd命令
zip()函数
意义
浮点数格式化
RMAN备份
导致
移动设备检测
Prim算法
CSS属性
mysql数据表损坏
QQ签名
base64_encod
函数参数
js读写json
进行
100的阶乘
类常量
左端
pickle类库
头条
拖动
堆空间
css
404页面
播放视频
更新事
stderr
格式化日期
发布/订阅模式
不带重复
类型校验
drawable
GDI+
指定类型文件
卡号
find_in_set
声音波形图
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229