让DotNetNuke 4.3.5使用SQL Full-text index 查找用户信息

简介: 近日在开发DotNetNuke系统时,要实现一个查找站内注册用户信息的功能,我首先想到的就是系统自带的用户管理页面,因为系统自带的管理页面,在功能上,已经实现了大部份我要的功能,比如按用户名查找用户,按用户的其他Profile信息查找。
近日在开发DotNetNuke系统时,要实现一个查找站内注册用户信息的功能,我首先想到的就是系统自带的用户管理页面,因为系统自带的管理页面,在功能上,已经实现了大部份我要的功能,比如按用户名查找用户,按用户的其他Profile信息查找。

但有一个问题,那就是DotNetNuke自带的用户管理的查找功能很弱,对于稍稍不常见的中文查找就会出现找不到的情况,特别是查找公司名称,如果查找“北京三一重工有限公司”,如果用户只输入“三一”是不会返回任何结果的。那么能不能搭一搭SQL的Full-text index search这个顺风车呢?

经过一番研究(当中几千字日后再写.....),简单的解决方案如下:

在SQL数据库中找到如下的存储过程:
SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  ON  
GO


ALTER    PROCEDURE  dbo. [ GetUsersByProfileProperty ]
    
@PortalId          int ,
    
@PropertyName     nvarchar ( 256 ),
    
@PropertyValue    nvarchar ( 256 ),
    
@PageIndex        int ,
    
@PageSize         int
AS
BEGIN
    
--  Set the page bounds
     DECLARE   @PageLowerBound   INT
    
DECLARE   @PageUpperBound   INT
    
SET   @PageLowerBound   =   @PageSize   *   @PageIndex
    
SET   @PageUpperBound   =   @PageSize   -   1   +   @PageLowerBound

    
--  Create a temp table TO store the select results
     CREATE   TABLE  #PageIndexForUsers
    (
        IndexId 
int   IDENTITY  ( 0 1 NOT   NULL ,
        UserId 
int
    )

    
--  Insert into our temp table
     INSERT   INTO  #PageIndexForUsers (UserId)
        
SELECT  U.UserId 
        
FROM    ProfilePropertyDefinition P
            
INNER   JOIN  UserProfile UP  ON  P.PropertyDefinitionID  =  UP.PropertyDefinitionID 
            
INNER   JOIN  Users U  ON  UP.UserID  =  U.UserID
        
WHERE  (PropertyName  =   @PropertyName AND  (PropertyValue  LIKE @PropertyValue OR PropertyText LIKE @PropertyValue  )
            
AND  (P.Portalid  =   @PortalId   OR  (P.PortalId  Is   Null   AND   @PortalId   is   null  ))
        
ORDER   BY  U.DisplayName

    
SELECT    *
    
FROM     vw_Users u, 
            #PageIndexForUsers p
    
WHERE   u.UserId  =  p.UserId
            
AND  ( PortalId  =   @PortalId   OR  (PortalId  Is   Null   AND   @PortalId   is   null  ))
            
AND  p.IndexId  >=   @PageLowerBound   AND  p.IndexId  <=   @PageUpperBound
        
ORDER   BY  U.DisplayName

    
SELECT   TotalRecords  =   COUNT ( * )
    
FROM     #PageIndexForUsers

END

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO


1、在企业管理器中,为UserProfile表的PropertyValue和PropertyText建立全文检索。

2、在SQL企业管理器中,点击“工具->查询分析器(Query Analyer)" 运行以下代码:


use DotNetNuke(请更换为你使用的数据库名称)
GO


if
  exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[GetUsersByProfileProperty] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
drop   procedure   [ dbo ] . [ GetUsersByProfileProperty ]
GO



SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  ON  
GO


CREATE   PROCEDURE  dbo. [ GetUsersByProfileProperty ]
    
@PortalId          int ,
    
@PropertyName     nvarchar ( 256 ),
    
@PropertyValue    nvarchar ( 256 ),
    
@PageIndex        int ,
    
@PageSize         int
AS
BEGIN
    
--  Set the page bounds
     DECLARE   @PageLowerBound   INT
    
DECLARE   @PageUpperBound   INT
    
SET   @PageLowerBound   =   @PageSize   *   @PageIndex
    
SET   @PageUpperBound   =   @PageSize   -   1   +   @PageLowerBound

    
--  Create a temp table TO store the select results
     CREATE   TABLE  #PageIndexForUsers
    (
        IndexId 
int   IDENTITY  ( 0 1 NOT   NULL ,
        UserId 
int
    )

    
--  Insert into our temp table
     INSERT   INTO  #PageIndexForUsers (UserId)
        
SELECT  U.UserId 
        
FROM    ProfilePropertyDefinition P
            
INNER   JOIN  UserProfile UP  ON  P.PropertyDefinitionID  =  UP.PropertyDefinitionID 
            
INNER   JOIN  Users U  ON  UP.UserID  =  U.UserID
        
WHERE  (PropertyName  =   @PropertyName AND  ( contains(PropertyValue,@PropertyValue) OR contains(PropertyText,@PropertyValue  ))
            
AND  (P.Portalid  =   @PortalId   OR  (P.PortalId  Is   Null   AND   @PortalId   is   null  ))
        
ORDER   BY  U.DisplayName

    
SELECT    *
    
FROM     vw_Users u, 
            #PageIndexForUsers p
    
WHERE   u.UserId  =  p.UserId
            
AND  ( PortalId  =   @PortalId   OR  (PortalId  Is   Null   AND   @PortalId   is   null  ))
            
AND  p.IndexId  >=   @PageLowerBound   AND  p.IndexId  <=   @PageUpperBound
        
ORDER   BY  U.DisplayName

    
SELECT   TotalRecords  =   COUNT ( * )
    
FROM     #PageIndexForUsers

END

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO


因为时间紧张,先写到这里,还有很多要补充的,并且这个解决方案直接改到了DotNetNuke系统的内核程序,不能向后兼容,写出来只是提供参考,解一时之急,正确的做法应该是写一个新的Provider,这个有时间再说吧。
相关文章
|
2月前
|
SQL 数据库 索引
SQL CREATE INDEX 语句
【7月更文挑战第20天】SQL CREATE INDEX 语句。
25 1
|
3月前
|
SQL 数据库 索引
SQL CREATE INDEX 语句
SQL CREATE INDEX 语句
29 4
|
3月前
|
SQL 弹性计算 分布式计算
实时数仓 Hologres操作报错合集之在执行SQL查询时遇到了问题,报错原因是“Invalid index column id: 2”,该怎么处理
在使用阿里云实时数仓Hologres时,可能会遇到不同类型的错误。例如:1.内存超限错误、2.字符串缓冲区扩大错误、3.分区导入错误、4.外部表访问错误、5.服务未开通或权限问题、6.数据类型范围错误,下面是一些常见错误案例及可能的原因与解决策略的概览。
|
4月前
|
SQL Oracle 关系型数据库
SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句用于在表中创建索引。 索引用于比其他方式更快地从数据库中检索数据。用户无法看到索引,它们只是用于加速搜索/查询。 注意: 使用索引更新表比不使用索引更新表需要更多的时间(因为索引也需要更新)。因此,只在经常进行搜索的列上创建索引。
65 5
java.sql.SQLException: Parameter index out of range (6 >
java.sql.SQLException: Parameter index out of range (6 >
137 0
|
SQL 存储
在 SQL Server 中查找活动连接和死锁
在SQL Server中有几种方法可以找到活动的 SQL 连接。让我们看看一些使用 T-SQL 查询的简单快捷的方法。
283 0
|
SQL Java 程序员
SQL 查找是否“存在“,别再 count 了!
根据某一条件从数据库表中查询 『有』 与 『没有』 ,只有两种状态, 那为什么在写SQL的时候,还要SELECT count(*) 呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的count
122 0
SQL 查找是否“存在“,别再 count 了!
|
SQL 消息中间件 JavaScript
SQL查找是否"存在",别再count了!
SQL查找是否"存在",别再count了!
|
SQL 关系型数据库 数据库
【RDS PostgreSQL】查找最耗费资源的 SQL(Top SQL)
数据库是较大型的应用,对于繁忙的数据库,需要消耗大量的内存、CPU、IO、网络资源。SQL 优化是数据库优化的手段之一,而为了达到 SQL 优化的最佳效果,您首先需要了解最消耗资源的 SQL(Top SQL),例如 IO 消耗最高的 SQL。 数据库资源分为多个维度、CPU、内存、IO 等,为能够从各个维度层面查找最消耗数据库资源的 SQL,您可以使用 pg_stat_statements 插件统计数据库的资源开销和分析 Top SQL。 本文将通过示例介绍如何创建 pg_stat_statements 插件、如何分析 Top SQL 以及如何重置统计信息。
494 0
【RDS PostgreSQL】查找最耗费资源的 SQL(Top SQL)