热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring.net整合Lucene.net实现全文检索(附例程)转载

什么是Lucene.net?引用wikipedia上的介绍:“Lucene是一套用于全文检索和搜尋的開放源碼程式庫,由Apache软件基金会支持和提供。

什么是Lucene.net?

引用wikipedia上的介绍:“Lucene是一套用于全文检索和搜尋的開放源碼程式庫,由Apache软件基金会支持和提供。Lucene提供了一個簡單卻強大的應用程式介面,能夠做全文索引和搜尋...”

而Lucene.net便是Lucene在dot net平台上的移植版本。关于Lucene的一些概念,有兴趣的朋友可以参考这里。

要实现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,像这样,用以将主键和字符型字段进行索引:



<%&#64; CodeTemplate Language&#61;"C#" TargetLanguage&#61;"C#" Description&#61;"Generates a C# class for use with NHibnate" %>
<%&#64; Property Name&#61;"SourceTable" Type&#61;"SchemaExplorer.TableSchema" Category&#61;"Context" Description&#61;"Table that the mapping file is based on" %>
<%&#64; Property Name&#61;"Namespace" Type&#61;"System.String" Default&#61;"MyNamespace.Data" Category&#61;"Object" Description&#61;"The class namespace that the mapping file should use" %>
<%&#64; Property Name&#61;"Assembly" Type&#61;"System.String" Default&#61;"MyApp.MyAssembly" Category&#61;"Object" Description&#61;"The assembly that the class will be used in" %>
<%&#64; Property Name&#61;"RemoveTablePrefix" Type&#61;"System.String" Default&#61;"tbl" Category&#61;"Object" Description&#61;"The prefix to remove from table names" %>
<%&#64; Property Name&#61;"ForceId" Type&#61;"System.Boolean" Default&#61;"true" Category&#61;"Object" Description&#61;"Force Id for identity column" %>
<%&#64; Assembly Name&#61;"SchemaExplorer" %>
<%&#64; Assembly Name&#61;"System.Data" %>
<%&#64; Import Namespace&#61;"SchemaExplorer" %>
<%&#64; Import Namespace&#61;"System.Data" %>
<%&#64; Import Namespace&#61;"System.Text.RegularExpressions" %>
using System;
using System.Collections.Generic;
using NHibernate.Search.Attributes;
using NHibernate.Search;

namespace <%&#61; Namespace %>
{
    
#region <%&#61; ClassName(SourceTable) %>

    
/// 
    
/// <%&#61; ClassName(SourceTable) %> object for NHibernate mapped table &#39;<%&#61; ClassTable(SourceTable) %>&#39;.
    
/// 

    [Serializable]
    [TableInfo(TableName 
&#61; "<%&#61; ClassTable(SourceTable) %>", PrimaryKey &#61; "<%&#61; ColumnName(SourceTable.PrimaryKey.MemberColumns[0])%>" , Columns&#61;"<% for(int i&#61;0;i<%&#61;ColumnName(SourceTable.Columns[i]) &#43; (i&#61;&#61;SourceTable.Columns.Count-1 ? "":",") %><%}%>")]
    [Indexed(Index 
&#61; "<%&#61; ClassName(SourceTable) %>")] 
    
public class <%&#61; ClassName(SourceTable) %>
    {
        
#region Member Variables
        
        
<% if (SourceTable.PrimaryKey.MemberColumns.Count &#61;&#61; 1) {%>
        
protected <%&#61; IdMemberType(SourceTable) %> <%&#61; IdMemberName(SourceTable) %>;
        
<% } %>        
        
<% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %>
        
protected <%&#61; MemberType(column) %> <%&#61; MemberName(column) %>;
        
<% } %>
        
<% foreach (TableKeySchema foreignKey in SourceTable.ForeignKeys) { %>
        
protected <%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneMemberName(foreignKey) %>;
        
<% if ((foreignKey.ForeignKeyTable &#61;&#61; SourceTable) && (foreignKey.PrimaryKeyTable &#61;&#61; SourceTable)) { %>
        
protected <%&#61; CollectionType(foreignKey)%> <%&#61; CollectionMemberName(foreignKey)%>;
        
<% } %>
        
<% } %>
        
<% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %>
        
<% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { %>
        
protected <%&#61; CollectionType(primaryKey)%> <%&#61; CollectionManyToManyMemberName(primaryKey)%>;
        
<% } else if (IsOneToOneTable(primaryKey)) { %>
        
protected <%&#61; OneToOneClass(primaryKey) %> <%&#61; OneToOneMemberName(primaryKey) %>;
        
<% } else if (IsSubClassTable(primaryKey)) { %>
        
<% } else { %>
        
protected <%&#61; CollectionType(primaryKey)%> <%&#61; CollectionMemberName(primaryKey)%>;
        
<% } %>
        
<% } %>

        
#endregion

        
#region Constructors

        
public <%&#61; ClassName(SourceTable) %>() { }

        
public <%&#61; ClassName(SourceTable) %><%
            
int count &#61; 0;
            
foreach(ColumnSchema column in SourceTable.NonKeyColumns)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; MemberType(column) %> <%&#61; ParameterName(column) %><%
                count 
&#43;&#43;;
            }
            
foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneParameterName(foreignKey) %><%
                count 
&#43;&#43;;
            }
            
%> )
        {
        
<% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %>
            
this.<%&#61; MemberName(column) %> &#61; <%&#61; ParameterName(column) %>;
        
<% } %>
        
<% foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { %>
            
this.<%&#61; ManyToOneMemberName(foreignKey) %> &#61; <%&#61; ManyToOneParameterName(foreignKey) %>;
        
<% } %>
        }

        
#endregion

        
#region Public Properties

        
<% if (SourceTable.PrimaryKey.MemberColumns.Count &#61;&#61; 1) {%>
        [DocumentId]
        
public <%&#61; IdMemberType(SourceTable) %> <%&#61; IdName(SourceTable) %>
        {
            
get {return <%&#61; IdMemberName(SourceTable) %>;}
            
<% if (IdMemberType(SourceTable) &#61;&#61; "string" ) {%>
            
set
            {
                
if ( value !&#61; null && value.Length > <%&#61; ColumnLength(SourceTable.PrimaryKey.MemberColumns[0])%>)
                    
throw new ArgumentOutOfRangeException("Invalid value for <%&#61; IdName(SourceTable) %>", value, value.ToString());
                
<%&#61; IdMemberName(SourceTable) %> &#61; value;
            }
            
<% } else { %>
            
set {<%&#61; IdMemberName(SourceTable) %> &#61; value;}
            
<% } %>
        }
        
<% } %>

        
<% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %>
        
<%if( MemberType(column) &#61;&#61;"string"){%>
        [Field(Index.Tokenized, Store 
&#61; Store.Yes)]
        
<%}%>
        
public <%&#61; MemberType(column) %> <%&#61; PropertyName(column) %>
        {
            
get { return <%&#61; MemberName(column) %>; }
            
<% if (MemberType(column) &#61;&#61; "string") {%>
            
set
            {
                
<% if(ColumnLength(column) !&#61; "16" ){ %>
                
if ( value !&#61; null && value.Length > <%&#61; ColumnLength(column)%>)
                    
throw new ArgumentOutOfRangeException("Invalid value for <%&#61; PropertyName(column) %>", value, value.ToString());
                
<%}%>    
                
<%&#61; MemberName(column) %> &#61; value;
            }
            
<% } else { %>
            
set { <%&#61; MemberName(column) %> &#61; value; }
            
<% } %>
        }

        
<% } %>
        
<% foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { %>
        
public <%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneName(foreignKey) %>
        {
            
get { return <%&#61; ManyToOneMemberName(foreignKey) %>; }
            
set { <%&#61; ManyToOneMemberName(foreignKey) %> &#61; value; }
        }

        
<% if ((foreignKey.ForeignKeyTable &#61;&#61; SourceTable) && (foreignKey.PrimaryKeyTable &#61;&#61; SourceTable)) { %>
        
public <%&#61; CollectionType(foreignKey) %> <%&#61; CollectionName(foreignKey) %>
        {
            
get { return <%&#61; CollectionMemberName(foreignKey) %>; }
            
set { <%&#61; CollectionMemberName(foreignKey) %> &#61; value; }
        }

        
<% } %>
        
<% } %>
        
<% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %>
        
<% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { %>
        
public <%&#61; CollectionType(primaryKey) %> <%&#61; CollectionManyToManyName(primaryKey) %>
        {
            
get
            {
                
if (<%&#61; CollectionManyToManyMemberName(primaryKey) %>&#61;&#61;null)
                    {
                    
<%&#61; CollectionManyToManyMemberName(primaryKey) %> &#61; <%&#61; NewCollectionType(primaryKey) %>;
                }
                
return <%&#61; CollectionManyToManyMemberName(primaryKey) %>;
            }
            
set { <%&#61; CollectionManyToManyMemberName(primaryKey) %> &#61; value; }
        }

        
<% } else if (IsOneToOneTable(primaryKey)) { %>
        
public <%&#61; OneToOneClass(primaryKey) %> <%&#61; OneToOneName(primaryKey) %>
        {
            
get { return <%&#61; OneToOneMemberName(primaryKey) %>; }
            
set { <%&#61; OneToOneMemberName(primaryKey) %> &#61; value; }
        }

        
<% } else if (IsSubClassTable(primaryKey)) { %>
        
<% } else { %>
        
public <%&#61; CollectionType(primaryKey) %> <%&#61; CollectionName(primaryKey) %>
        {
            
get
            {
                
if (<%&#61; CollectionMemberName(primaryKey) %>&#61;&#61;null)
                {
                    
<%&#61; CollectionMemberName(primaryKey) %> &#61; <%&#61; NewCollectionType(primaryKey) %>;
                }
                
return <%&#61; CollectionMemberName(primaryKey) %>;
            }
            
set { <%&#61; CollectionMemberName(primaryKey) %> &#61; value; }
        }

        
<% } %>
        
<% } %>
        

        
#endregion
        
<% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %>
        
<% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { } %>
        
<% else if (IsSubClassTable(primaryKey)) { %>

    
#region <%&#61; JoinedSubclassName(primaryKey) %>

    
/// 
    
/// <%&#61; JoinedSubclassName(primaryKey) %> object for NHibernate mapped table &#39;<%&#61; JoinedSubclassTable(primaryKey) %>&#39;.
    
/// 

    public class <%&#61; JoinedSubclassName(primaryKey) %> : <%&#61; ClassName(SourceTable) %>
    {
        
#region Member Variables

        
<% foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { %>
        
protected <%&#61; MemberType(column) %> <%&#61; MemberName(column) %>;
        
<% } %>
        
<% foreach (TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { %>
        
<% if (foreignKey.PrimaryKeyTable !&#61; SourceTable) { %>
        
protected <%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneMemberName(foreignKey) %>;
        
<% } %>
        
<% if ((foreignKey.ForeignKeyTable &#61;&#61; primaryKey.ForeignKeyTable) && (foreignKey.PrimaryKeyTable &#61;&#61; primaryKey.ForeignKeyTable)) { %>
        
protected <%&#61; CollectionType(foreignKey)%> <%&#61; CollectionMemberName(foreignKey)%>;
        
<% } %>
        
<% } %>

        
#endregion

        
#region Constructors

        
public <%&#61; JoinedSubclassName(primaryKey) %>() : base() { }

        
public <%&#61; JoinedSubclassName(primaryKey) %><%
            count 
&#61; 0;
            
foreach(ColumnSchema column in SourceTable.NonKeyColumns)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; MemberType(column) %> <%&#61; ParameterName(column) %><%
                count 
&#43;&#43;;
            }
            
foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneParameterName(foreignKey) %><%
                count 
&#43;&#43;;
            }
            
foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; MemberType(column) %> <%&#61; ParameterName(column) %><%
                count 
&#43;&#43;;
            }
            
foreach(TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys)
            {
                
if (foreignKey.PrimaryKeyTable !&#61; SourceTable)
                {
                    
if (count > 0) Response.Write("");
                    
%><%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneParameterName(foreignKey) %><%
                    count 
&#43;&#43;;
                }
            }
            
%> ) : base(<%
            count 
&#61; 0;
            
foreach(ColumnSchema column in SourceTable.NonKeyColumns)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; ParameterName(column) %><%
                count 
&#43;&#43;;
            }
            
foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys)
            {
                
if (count > 0) Response.Write("");
                
%><%&#61; ManyToOneParameterName(foreignKey) %><%
                count 
&#43;&#43;;
            }
            
%>)
        {
        
<% foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { %>
            
this.<%&#61; MemberName(column) %> &#61; <%&#61; ParameterName(column) %>;
        
<% } %>
        
<% foreach (TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { %>
        
<% if (foreignKey.PrimaryKeyTable !&#61; SourceTable) { %>
            
this.<%&#61; ManyToOneName(foreignKey) %> &#61; <%&#61; ManyToOneParameterName(foreignKey) %>;
        
<% } %>
        
<% } %>
        }

        
#endregion

        
#region Public Properties

        
<% foreach(ColumnSchema column in primaryKey.ForeignKeyTable.NonKeyColumns) { %>
        
public <%&#61; MemberType(column) %> <%&#61; PropertyName(column) %>
        {
            
get { return <%&#61; MemberName(column) %>; }
            
set { <%&#61; MemberName(column) %> &#61; value; }
        }

        
<% } %>
        
<% foreach(TableKeySchema foreignKey in primaryKey.ForeignKeyTable.ForeignKeys) { %>
        
<% if (foreignKey.PrimaryKeyTable !&#61; SourceTable) { %>
        
public <%&#61; ManyToOneClass(foreignKey) %> <%&#61; ManyToOneName(foreignKey) %>
        {
            
get { return <%&#61; ManyToOneMemberName(foreignKey) %>; }
            
set { <%&#61; ManyToOneMemberName(foreignKey) %> &#61; value; }
        }

        
<% } %>
        
<% if ((foreignKey.ForeignKeyTable &#61;&#61; primaryKey.ForeignKeyTable) && (foreignKey.PrimaryKeyTable &#61;&#61; primaryKey.ForeignKeyTable)) { %>
        
public <%&#61; CollectionType(foreignKey) %> <%&#61; CollectionName(foreignKey) %>
        {
            
get { return <%&#61; CollectionName(foreignKey) %>; }
            
set { <%&#61; CollectionName(foreignKey) %> &#61; value; }
        }

        
<% } %>
        
<% } %>
        
#endregion
    }

    
#endregion
        
<% } %>
        
<% } %>
    }
    
#endregion

}

在例程包中的“其他”目录中&#xff0c;有完整的生成模板。

二、集成环境配置

修改web.config&#xff0c;进行Spring.net和nHibernate.Search的配置&#xff1a; 

web.config

 此处的"hibernate.search.default.indexBase"值"~/Index"可以更改为您希望的目录名称。这里的意义在于&#xff0c;当监控到数据变化时&#xff0c;会将索引变化写入到"~/Index/实体名/“。

在nHibernate 2.0中&#xff0c;加入了对数据库事件的监控&#xff0c;在配置文件中&#xff0c;给集成环境中的SessionFactory加上"EventListeners" 属性&#xff0c;便可轻松捕捉到诸如Insert、Update、Delete等事件&#xff0c;交由nHibernate.Search进行索引处理&#xff1a;  


appDaoContext.xml

三、全文搜索

给数据访问模板DaoTemplate添加一个全文搜索的方法&#xff1a;

/// 
        
/// 全文检索
        
/// 

        
/// 类型
        
/// 关键词
        
/// 

        IList FullTextSearch(string query)


四、运行一下

Insert对象&#xff1a;

 

 Search&#xff1a;

 

随笔写得很粗糙&#xff0c;大部分细节在附件的例程包中&#xff08;包括数据库备份&#xff0c;模板&#xff0c;项目文件&#xff09;&#xff0c;如果有兴趣&#xff0c;还是参考实例吧&#xff1a;



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
指定不告诉你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有