搜索关键字,按空格分开,结果要按精确度从高到低显示,比如:
查找的关键字---> ASP JAVA PHP FLEX
数据库记录集---> ID CONTENT
1 JAVA是面对对象的语言
2 PHP学起来比JAVA要容易点
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
5 ASP,PHP用来做网页都不错那么搜索的结果排序应该是
ID
4 -->出现了4个关键字
3 -->出现了3个关键字
2 -->出现了2个关键字
5 -->出现了2个关键字
1 -->出现了1个关键字 各位CSDN的大佬 帮帮小弟 多谢
查找的关键字---> ASP JAVA PHP FLEX
数据库记录集---> ID CONTENT
1 JAVA是面对对象的语言
2 PHP学起来比JAVA要容易点
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
5 ASP,PHP用来做网页都不错那么搜索的结果排序应该是
ID
4 -->出现了4个关键字
3 -->出现了3个关键字
2 -->出现了2个关键字
5 -->出现了2个关键字
1 -->出现了1个关键字 各位CSDN的大佬 帮帮小弟 多谢
解决方案 »
- 关于SQL中查找指定时间的语句写法问题
- 怎么写一个相关子查询语句?
- 请教一句SQL,谢谢
- 请教做过实时测量系统的高手,ms-sql编程需要注意的问题?
- 关于全文索引中空格的处理!急!!!
- 高分求从odbc内导入表内数据到ms-sqlserver,例如是access的数据库,我不用直接从access内,而是用windwos内的,搞定再加分,谢谢
- 如何要windows 2000 professional版中安装SQL server 2000?
- 请教各位,存储过程中如何捕捉这样的信息。。。。。。
- access转mssql出现的问题
- 不小心删掉了一些数据库里的记录,只有半月前的备份,如何恢复到删记录前呀???用的是ms sql server 2000
- sql server 2005 怎么热备份
- 关于EXEC执行字符串问题
在库TEST上建立全文索引
*/
use test
create table poofly(id int not null, name varchar(10))
go
/* 首先创建一个唯一索引,以便全文索引利用*/
create unique clustered index un_ky1 on poofly(id)
/*创建全文目录*/
create FULLTEXT CATALOG FT1 AS DEFAULT
/*C创建全文索引*/
create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1
/*修改全文目录*/
alter FULLTEXT CATALOG FT1 REBUILD
/*删除全文目录FT(含有全文索引时候不能删除)*/
drop fulltext catalog ft
/*查看数据库所有的全文目录*/
select* from sys.fulltext_catalogs
/*
fulltext_catalog_id name path is_default is_accent_sensitivity_on data_space_id file_id principal_id is_importing
------------------- -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ------------------------ ------------- ----------- ------------ ------------
5 test NULL 0 1 NULL NULL 1 0
11 FT1 NULL 1 1 NULL NULL 1 0
*/
/* 查看所有用到全文索引的表*/
exec sp_help_fulltext_tables
/*
TABLE_OWNER TABLE_NAME FULLTEXT_KEY_INDEX_NAME FULLTEXT_KEY_COLID FULLTEXT_INDEX_ACTIVE FULLTEXT_CATALOG_NAME
-------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ------------------ --------------------- --------------------------------------------------------------------------------------------------------------------------------
dbo poofly un_ky1 1 1 FT1
*/
/*
在库TEST上建立全文索引
*/
use test
create table poofly(id int not null, name varchar(10))
go
/* 首先创建一个唯一索引,以便全文索引利用*/
create unique clustered index un_ky1 on poofly(id)
/*创建全文目录*/
create FULLTEXT CATALOG FT1 AS DEFAULT
/*C创建全文索引*/
create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1
/*修改全文目录*/
alter FULLTEXT CATALOG FT1 REBUILD
/*删除全文目录FT(含有全文索引时候不能删除)*/
drop fulltext catalog ft
---------------------------------------------------
--使用contains关键字进行全文索引--1.前缀搜索
select name from tb where contains(name,'"china*"')
/*--注意这里的* 返回结果会是 chinax chinay chinaname china
--返回前缀是china的name
--如果不用“”隔开 那么系统会都城 contains(name,'china*') 与china* 匹配*/--2.使用派生词搜索
select name from tb where contains(name,'formsof(inflectional,"foot")')
/* 出来结果可能是 foot feet (所有动词不同形态 名词单复数形式)*/--3.词加权搜索
select value from tb where contains(value , 'ISABOUT(performance weight(.8))')
/*全值用0-1的一个数字表示 表示每个词的重要程度*/--4.临近词搜素
select * from tb where contains(document,'a near b')
/* 出来的结果是“a”单词与“b”单词临近的document
可以写成 contains(document,'a ~ b')
*/
--5.布尔逻辑搜素
select * from tb where contains(name,'"a" and "b"')
/*返回既包含A 又包含 B单词的行
当然 这里的AND 关键字还有换成 OR ,AND NOT 等
*/
--------------------------------------------------
--你还可以使用RREETEXT 进行模糊搜索
--任意输入文本 全文索引自动识别重要单词 然后构造一个查询
use test
go
select * from tb where freetext(wendang,'zhubajie chi xi gua !')
--============================================================
--对全文索引性能影响因素很多 包括硬件资源方面 还有SQL 自身性能 和MSFTESQL服务的效率等方面
--它的搜索性能有2方面 : 全文索引性能 和 全文查询性能
感觉下 贴
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-14 09:59:07
-------------------------------------
--> 生成测试数据: @tb
DECLARE @tb TABLE (ID INT,CONTENT VARCHAR(100))
INSERT INTO @tb
SELECT 1,'JAVA是面对对象的语言' UNION ALL
SELECT 2,'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,'ASP,PHP用来做网页都不错'--SQL查询如下:DECLARE @str varchar(100);
SET @str = 'ASP JAVA PHP FLEX';SELECT * FROM @tb AS A
ORDER BY
(SELECT COUNT(*)
FROM (
SELECT B.x.value('.','varchar(50)') AS s
FROM (SELECT CONVERT(xml,'<v>'+REPLACE(@str,' ','</v><v>')+'</v>') AS s) AS T
CROSS APPLY T.s.nodes('//v') AS B(x)) AS T
WHERE CHARINDEX(s,A.CONTENT) > 0) DESC/*
ID CONTENT
----------- ---------------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
5 ASP,PHP用来做网页都不错
2 PHP学起来比JAVA要容易点
1 JAVA是面对对象的语言(5 行受影响)
*/
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-14 09:59:07
-------------------------------------
--> 生成测试数据: @tb
DECLARE @tb TABLE (ID INT,CONTENT VARCHAR(100))
INSERT INTO @tb
SELECT 1,'JAVA是面对对象的语言' UNION ALL
SELECT 2,'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,'ASP,PHP用来做网页都不错'--SQL查询如下:DECLARE @str varchar(100);
SET @str = 'ASP JAVA PHP FLEX';SELECT * FROM @tb AS A
ORDER BY
(SELECT COUNT(*)
FROM (SELECT SUBSTRING(@str,number,CHARINDEX(' ',@str+' ',number)-number) AS s
FROM master.dbo.spt_values
WHERE type = 'p' AND SUBSTRING(' '+@str,number,1) = ' '
AND number <= LEN(@str)) AS T
WHERE CHARINDEX(s,A.CONTENT) > 0) DESC/*
ID CONTENT
----------- ------------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
5 ASP,PHP用来做网页都不错
2 PHP学起来比JAVA要容易点
1 JAVA是面对对象的语言(5 行受影响)
*/
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-14 09:59:47
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([ID] INT,[CONTENT] NVARCHAR(40))
INSERT [tb]
SELECT 1,N'JAVA是面对对象的语言' UNION ALL
SELECT 2,N'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,N'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,N'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,N'ASP,PHP用来做网页都不错'
GO
--SELECT * FROM [tb]--创建对照表数据
IF NOT OBJECT_ID('[关键字对照表]') IS NULL
DROP TABLE [关键字对照表]
GO
CREATE TABLE [关键字对照表]([ID] INT IDENTITY,[name] NVARCHAR(40))
INSERT [关键字对照表]
SELECT 'JAVA' UNION ALL
SELECT 'PHP' UNION ALL
SELECT 'ASP' UNION ALL
SELECT 'FLEX'
GO
-->SQL查询如下:
--创建获取关键字数量的自字义函数:
IF NOT OBJECT_ID('[fn_px]') IS NULL
DROP FUNCTION [fn_px]
GO
CREATE FUNCTION fn_px(@str NVARCHAR(100))
RETURNS INT
AS
BEGIN
RETURN(SELECT SUM(CASE WHEN CHARINDEX(NAME,@str)>0 THEN 1 ELSE 0 END) FROM [关键字对照表])
END
GO
--调用函数查询如下:
SELECT * FROM tb ORDER BY dbo.fn_px([CONTENT]) desc
--结果:
/*
ID CONTENT
----------- ----------------------------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
5 ASP,PHP用来做网页都不错
2 PHP学起来比JAVA要容易点
1 JAVA是面对对象的语言(5 行受影响)
*/
create table #(id int,content varchar(2000))
insert # values(1,'JAVA是面对对象的语言')
insert # values(2,'PHP学起来比JAVA要容易点')
insert # values(3,'ASP比PHP用起来简单,PHP比JAVA用起来简单')
insert # values(4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用')
insert # values(5,'ASP,PHP用来做网页都不错')
declare @findStr varchar(100)
declare @str varchar(100)
set @findStr='ASP JAVA PHP FLEX'
set @findStr=@findStr+' '
select *,cnt=0 into #2 from #
declare @pos1 int
declare @pos2 int
set @pos1=1
set @pos2=charindex(' ',@findStr,@pos1)
while @pos2>0
begin
set @str=substring(@findstr,@pos1,@pos2-@pos1)
update #2 set cnt=cnt+1 where charindex(@str,content)>0
set @pos1=@pos2+1
set @pos2=charindex(' ',@findStr,@pos1)
end
select * from #2 order by cnt desc
drop table #2,#
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-14 09:59:47
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([ID] INT,[CONTENT] NVARCHAR(40))
INSERT [tb]
SELECT 1,N'JAVA是面对对象的语言' UNION ALL
SELECT 2,N'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,N'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,N'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,N'ASP,PHP用来做网页都不错'
GO
--SELECT * FROM [tb]--创建对照表数据
IF NOT OBJECT_ID('[关键字对照表]') IS NULL
DROP TABLE [关键字对照表]
GO
CREATE TABLE [关键字对照表]([ID] INT IDENTITY,[name] NVARCHAR(40))
INSERT [关键字对照表]
SELECT 'JAVA' UNION ALL
SELECT 'PHP' UNION ALL
SELECT 'ASP' UNION ALL
SELECT 'FLEX'
GO
-->SQL查询如下:
--创建获取关键字数量的自字义函数:
IF NOT OBJECT_ID('[fn_px]') IS NULL
DROP FUNCTION [fn_px]
GO
CREATE FUNCTION fn_px(@str NVARCHAR(100))
RETURNS INT
AS
BEGIN
RETURN(SELECT SUM(CASE WHEN CHARINDEX(NAME,@str)>0 THEN 1 ELSE 0 END) FROM [关键字对照表])
END
GO
--调用函数查询如下:
SELECT * FROM tb ORDER BY dbo.fn_px([CONTENT]) DESC,ID
--结果:
/*
ID CONTENT
----------- ----------------------------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
2 PHP学起来比JAVA要容易点
5 ASP,PHP用来做网页都不错
1 JAVA是面对对象的语言(5 行受影响)
*/
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-14 09:59:07
-------------------------------------
--> 生成测试数据: @tb
DECLARE @tb TABLE (ID INT,CONTENT VARCHAR(100))
INSERT INTO @tb
SELECT 1,'JAVA是面对对象的语言' UNION ALL
SELECT 2,'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,'ASP,PHP用来做网页都不错' UNION ALL
SELECT 6,'liangck'--SQL查询如下:DECLARE @str varchar(100);
SET @str = 'ASP JAVA PHP FLEX';--将关键字转成行集表SELECT SUBSTRING(@str,number,CHARINDEX(' ',@str+' ',number)-number) AS s
INTO #tmp
FROM master.dbo.spt_values
WHERE type = 'p' AND SUBSTRING(' '+@str,number,1) = ' '
AND number <= LEN(@str)--查找,排序
SELECT * FROM @tb AS A
WHERE EXISTS(SELECT * FROM #tmp
WHERE CHARINDEX(s,A.CONTENT) > 0)
ORDER BY
(SELECT COUNT(*)
FROM #tmp
WHERE CHARINDEX(s,A.CONTENT) > 0) DESC,
ID; --如果关键字出现次数一样,按ID从小到大排序.--删除临时表
DROP TABLE #tmp;/*
ID CONTENT
----------- -----------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
5 ASP,PHP用来做网页都不错
2 PHP学起来比JAVA要容易点
1 JAVA是面对对象的语言(5 行受影响)*/
AND number <= LEN(@str)----->WHERE type = 'p' AND SUBSTRING(' '+@str,number,1) = ' '
AND number BETWEEN 1 AND LEN(@str)改成这样..不然处理空格上.有些不对.
你们有试过吧查询关键字换成‘123’,'hahah'这些不相关的关键字么??
我有。我告诉你。一样也是全都查出来