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) %>
精彩图集
精彩文章
热门标签
抓取网页正文
改变
指定日期
XML操作
自动增长列
最大Id
php php自定
数据库名
跨iframe
find函数
数据存储
按比例
创建目录
指令
选不中
注入数据库
JS多语言
twisted
select加锁
脚本自身修改
__setattr__
主从
DDL
Too
可逆加密算法
sup方法
线程并发
自增长
段空间
Oracle字符集
网络打印
svn
复制文件夹
横屏
Promise
php php写入
python函数
页面宽度
memcach
context
百度热词
发布apk
相
django-suit
for语句
四叉树
目录传输
无法解析
Tab_control控
android设计模式
ForLinux2.6
memcpy()
草稿
发布项目
iis配置php
打
分页问题
注解
$符
UDP
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229