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,像这样,用以将主键和字符型字段进行索引:
Code [http://www.xueit.com]
<%@ 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) %>
精彩图集
精彩文章
热门标签
Oracle数据库
ctype函数
mysql小技巧
MIME
II
超链接
js操作table
PHP框架
hashing
des加密
vspace
SessionFacto
print_r
抓取豆瓣
创建
o
squid
jsp操作MySQL
加减
则是
COLOR
Shell.Applic
jira
起止时间
当前url
c00ce56e
消息窗口
nagios飞信监控
in_array
RAC
http
提交数据
内存管理
计算机
手电筒
pytho
过滤排序
oracle下载
大类
数组查询
传输
APPPOOL
漫画
技能
python代码检查
硬件列表
访问远程文
基础 纯属疑问
之双
php程序员
验证
浅谈
GPS功能
多个定时器
我所
改变按钮
数据存储
数据库主键
除法运算
文件夹
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229

