首先来看看需求
用户输入 “北京市小饭锅餐厅电话”
如果数据库中存在着这样的全部匹配的数据时,当然可以查寻的到,但是数据库中是记的“北京小饭锅餐厅电话” 用一般的 Like '%{用户输入}%' 就不能办到了
这样怎么办,简单说下LZ思路,就是把用户输入项拆分成小单位的关键字再去搜索,任何匹配的数据就都出来了,忘了一点可以根据需要先过滤掉一些没用的词
1 using System.Linq; 2 using Core.Common; 3 using System.Web; 4 using System.Text.RegularExpressions; 5 6 namespace Core.Helper 7 { 8 public class KeySearch 9 { 10 private static int _keyCode = 2;//关键字最小组合字数 11 12 //过滤关键字 13 private static string[] ReplaceKey ={18 "省", 19 "市", 20 "县", 21 "乡", 22 "镇", 23 "地方", 24 " " 25 }; 26 /// <summary> 27 /// 搜索关键字组合方法 28 /// </summary> 29 /// <param name="keyword"></param> 30 /// <returns></returns> 31 public static string KeySearchSpan(string keyword) 32 { 33 string reStr = ""; 34 string copyStr = keyword; 35 if (copyStr.Length < _keyCode) 36 { 37 reStr = copyStr + ","; 38 } 39 else 40 { 41 var query = from data in ReplaceKey 42 select data; 43 foreach(var s in query) 44 { 45 copyStr = Regex.Replace(copyStr, s, "", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); 46 } 47 int count = copyStr.Length - _keyCode + 1; 48 for (int i = 0; i < count; i++) 49 { 50 reStr += copyStr.Substring(i, _keyCode) + ","; 51 } 52 } 53 return reStr; 54 } 55 } 56 }
通过方法处理后的字符串为 "北京,京小,小饭,饭锅,锅餐,餐厅,厅电,电话,"
按照这样的关键字再到数据库中去搜索,应该不会落下任何匹配的数据了
不多说 在看看存储过程怎么处理
1 -- ============================================= 2 -- 作者:huangtao 3 -- 功能描述: 电话搜索列表 4 -- 当前版本: 001.001.001 5 -- 修改描述: 1. 6 -- 2. 7 -- ============================================= 8 ALTER PROCEDURE [dbo].[PH_Tel_SearchList_S] 9 @SITEID INT, --城市ID 10 @KEYWORDS VARCHAR(300), --模糊查询条件 以,号分割 11 @CURPAGE INT, --当前页 12 @PAGESIZE INT, --分页大小 13 @COUNT INT OUTPUT --总条数 14 AS 15 BEGIN 16 DECLARE @POS INT --字符串分割个数 17 DECLARE @LEN INT --单次字符长度 18 DECLARE @TEMP VARCHAR(10) --单次字符内容 19 DECLARE @WHERE VARCHAR(2000) --拼接的SQL语句条件 20 DECLARE @FIELDS VARCHAR(1000) --字段名 21 SET @POS=CHARINDEX(',',@KEYWORDS,0) 22 SET @WHERE=' SITEID='+CAST(@SITEID AS VARCHAR(10)) + ' AND CCOOCHK=1 AND ISDEL=0 AND (' 23 WHILE(@POS>0) 24 BEGIN 25 SET @TEMP=SUBSTRING(@KEYWORDS,0,@POS) 26 SET @LEN=LEN(@TEMP) 27 SET @WHERE=@WHERE+'(TELNAME+TELINFO+TELINFO1+SPINFO+KEYWORD) LIKE ''%' +@TEMP+'%'' ' 28 SET @KEYWORDS=STUFF(@KEYWORDS,1,@LEN+1,'') 29 SET @POS=CHARINDEX(',',@KEYWORDS,0) 30 IF @POS>0 31 SET @WHERE=@WHERE+' OR ' 32 END 33 SET @WHERE=@WHERE+')' 34 SET @FIELDS='ID,TELNAME,TELINFO,TELINFO1,SPINFO,KEYWORD,ISTJ,ISYP,STATE,ISSTATE,UPTIME' 35 EXEC PAGE_NEW 'YP_DIR',@FIELDS,@WHERE,'ISTJ DESC,UPTIME DESC ',@PAGESIZE,@CURPAGE, @COUNT OUT 36 END
LZ的需求是电话库的搜索 任何用户输入相关数据都拿出
最后面 EXEC PAGE_NEW 这个就是一个通用的分页存储过程 百度一下到处都有 这就不贴上来了