本帖最后由 wyj92 于 2013-11-13 15:14:41 编辑

解决方案 »

  1.   


    关键字库:JAVA、PHP、asp、aspx、FLEX ID        CONTENT 1         JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间 2         PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家 3         ASP比PHP用起来简单,PHP比JAVA用起来简单 4         FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用 5         ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页
    一、如果当前查看的是 5  存在在关键字中的 有 asp、php、aspx (我们取出现次数最多的前两个关键字)  结果:asp(2次)、php(3次)二、此时利用 5  匹配出的关键(asp、php) 在其他剩余4条数据中检索 出现次数 和 一 最接近的数据  结果: 3 (asp-1次、php-2次)
      

  2.   


    其实你这个,如果用程序来做,可能更好,比如,你要查询某个字符串中,出现了asp的个数,这个在sql server中不方便来比较,只能是通过一个循环,来查,效率不是很好
      

  3.   


    其实你这个,如果用程序来做,可能更好,比如,你要查询某个字符串中,出现了asp的个数,这个在sql server中不方便来比较,只能是通过一个循环,来查,效率不是很好这个应该只能  在文章中查找存在的关键字  ,   那如何在数据库中检索  查找出来的关键字 并按每个关键字出现的次数 排序 
      

  4.   

    需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:
    --1.函数
    if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
       drop function dbo.f_searchSTR
    gocreate function dbo.f_searchSTR
    (
    @s varchar(max),     --要分拆的字符串
    @search varchar(30)    --分隔字符

    returns int
    as
    begin   
      declare @len int
      declare @i int;  
      
      set @i = 0;  while CHARINDEX(@search,@s) >0
      begin
        set @i = @i + 1
        
        set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
      end
      
      return @i  
    end
    go  然后是查询:
     
     create table key_word(word nvarchar(30))
     
     insert into key_word
     select 'JAVA' union all
     select 'PHP' union all
     select 'asp' union all
     select 'aspx' union all
     select 'FLEX'
     go
     drop table tb
    go
     
    create table tb(id int,content nvarchar(max))
     
     
    insert into tb
    select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
    union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
    union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
    union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
    union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
    goselect id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id = 5
    group by id,content,kw.word
    /*
    id content                                                                                 word 次数
    5 ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页 asp     3
    5 ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页 aspx 1
    5 ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页 FLEX 0
    5 ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页 JAVA 0
    5 ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页 PHP     3
    */
          
      

  5.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
      

  6.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    在其他文章中查找接近的   关键字:asp 、aspx  至少存在一次  如: asp - 1次 、aspx - 0次  这种文章 就不能被查出来  
      

  7.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id <> 5
    group by id,content,kw.word
    ),tt
    as
    (
    select top 1 id
    from t
    where (word = 'asp' and 次数<=4) or
          (word = 'aspx' and 次数<=6)
    order by 次数 desc
    )select *
    from tb
    where id in (select id from tt)
      

  8.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id <> 5
    group by id,content,kw.word
    ),tt
    as
    (
    select top 1 id
    from t
    where (word = 'asp' and 次数<=4) or
          (word = 'aspx' and 次数<=6)
    order by 次数 desc
    )select *
    from tb
    where id in (select id from tt)
    有了权重是不是能更简单的查找数据,但是对权重的计算  不知道怎么弄  这个关键:是根据某一条文章  在数据匹配出来的  是动态的  应该不能写死再匹配出来的关键字及其次数  在查找的另一篇文章中  每一个关键字至少出现一次  然后降序 取第一条数据  
    ------------------------------- 需求就是这样  (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)
      

  9.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id <> 5
    group by id,content,kw.word
    ),tt
    as
    (
    select top 1 id
    from t
    where (word = 'asp' and 次数<=4) or
          (word = 'aspx' and 次数<=6)
    order by 次数 desc
    )select *
    from tb
    where id in (select id from tt)
    有了权重是不是能更简单的查找数据,但是对权重的计算  不知道怎么弄  这个关键:是根据某一条文章  在数据匹配出来的  是动态的  应该不能写死再匹配出来的关键字及其次数  在查找的另一篇文章中  每一个关键字至少出现一次  然后降序 取第一条数据  
    ------------------------------- 需求就是这样  (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢
      

  10.   


    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id <> 5
    group by id,content,kw.word
    ),tt
    as
    (
    select top 1 id
    from t
    where (word = 'asp' and 次数<=4) or
          (word = 'aspx' and 次数<=6)
    order by 次数 desc
    )select *
    from tb
    where id in (select id from tt)
    有了权重是不是能更简单的查找数据,但是对权重的计算  不知道怎么弄  这个关键:是根据某一条文章  在数据匹配出来的  是动态的  应该不能写死再匹配出来的关键字及其次数  在查找的另一篇文章中  每一个关键字至少出现一次  然后降序 取第一条数据  
    ------------------------------- 需求就是这样  (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢
    例如:
    在文章一中有 关键字: asp - 4次 、aspx - 6次再剩余的文章中 如何找到最接近 这个 关键字结果的  数据?
    但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where id <> 5
    group by id,content,kw.word
    ),tt
    as
    (
    select top 1 id
    from t
    where (word = 'asp' and 次数<=4) or
          (word = 'aspx' and 次数<=6)
    order by 次数 desc
    )select *
    from tb
    where id in (select id from tt)
    有了权重是不是能更简单的查找数据,但是对权重的计算  不知道怎么弄  这个关键:是根据某一条文章  在数据匹配出来的  是动态的  应该不能写死再匹配出来的关键字及其次数  在查找的另一篇文章中  每一个关键字至少出现一次  然后降序 取第一条数据  
    ------------------------------- 需求就是这样  (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢
    ------------------------------------------------------------------------------------啊 - - 坑爹 小变了下需求 
    某一篇文章一中匹配出的关键字: asp - 6次 、aspx - 8次、php - 9次 (记录出现次数最多的关键字 -  asp10次  )在其它数据中查找与其相同的文章:首先查找出:asp、aspx、php  这几个关键字至少每一个出现过一次的文章 然后再筛选:用记录的 asp次数(6)  和 其它文章 的关键字 asp的次数(5)  计算两个关键字的相差度   最后筛选出 相差最小的文章 --------------------------------结果:/*
    合格结果--------------------
    id    content                                                                                    word    次数
    5    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页    asp        5
    5    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页    aspx        1
    5    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页    php        1
    不合格结果--------------------
    id    content                                                                                    word    次数
    6    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP     asp        8
    6    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 ,aspx是动态网页PHP、PHP    aspx        2
    6    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 ,aspx是动态网页PHP、PHP    php        3
    不合格结果--------------------
    id    content                                                                                    word    次数
    7    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页    asp        3
    7    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页    aspx        1
    7    ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页    php        1
    */
      

  11.   


    我这个还可以弄吗?是这样吗: create table key_word(word nvarchar(30))
     
     insert into key_word
     select 'JAVA' union all
     select 'PHP' union all
     select 'asp' union all
     select 'aspx' union all
     select 'FLEX'
     go
     drop table tb
    go
     
    create table tb(id int,content nvarchar(max))
     
     
    insert into tb
    select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
    union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    go
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where kw.word in ('asp','aspx','php')
    group by id,content,kw.word
    ),tt
    as
    (
    select --max(次数) over(PARTITION by id) as max_count,
           min(次数) over(partition by id) as min_count,
           
           id,content,word,次数
    from t
    )select id,content
    from
    (
    select *,
           
           --asp的出现次数为6次
           ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
    from tt
    where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
    )t
    where rownum = 1   
          and word = 'asp'   
    /*
    id content
    5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
    */      
      

  12.   


    我这个还可以弄吗?是这样吗: create table key_word(word nvarchar(30))
     
     insert into key_word
     select 'JAVA' union all
     select 'PHP' union all
     select 'asp' union all
     select 'aspx' union all
     select 'FLEX'
     go
     drop table tb
    go
     
    create table tb(id int,content nvarchar(max))
     
     
    insert into tb
    select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
    union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    go
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where kw.word in ('asp','aspx','php')
    group by id,content,kw.word
    ),tt
    as
    (
    select --max(次数) over(PARTITION by id) as max_count,
           min(次数) over(partition by id) as min_count,
           
           id,content,word,次数
    from t
    )select id,content
    from
    (
    select *,
           
           --asp的出现次数为6次
           ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
    from tt
    where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
    )t
    where rownum = 1   
          and word = 'asp'   
    /*
    id content
    5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
    */      sql2000  的写啊?   
      

  13.   


    我这个还可以弄吗?是这样吗: create table key_word(word nvarchar(30))
     
     insert into key_word
     select 'JAVA' union all
     select 'PHP' union all
     select 'asp' union all
     select 'aspx' union all
     select 'FLEX'
     go
     drop table tb
    go
     
    create table tb(id int,content nvarchar(max))
     
     
    insert into tb
    select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
    union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    go
    ;with t
    as
    (
    select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
    from tb
    cross join key_word kw
    where kw.word in ('asp','aspx','php')
    group by id,content,kw.word
    ),tt
    as
    (
    select --max(次数) over(PARTITION by id) as max_count,
           min(次数) over(partition by id) as min_count,
           
           id,content,word,次数
    from t
    )select id,content
    from
    (
    select *,
           
           --asp的出现次数为6次
           ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
    from tt
    where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
    )t
    where rownum = 1   
          and word = 'asp'   
    /*
    id content
    5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
    */      sql2000  的写啊?   改成适合2000的了,用了临时表: create table key_word(word nvarchar(30))
     
     insert into key_word
     select 'JAVA' union all
     select 'PHP' union all
     select 'asp' union all
     select 'aspx' union all
     select 'FLEX'
     go
     drop table tb
    go
     
    create table tb(id int,content nvarchar(max))
     
     
    insert into tb
    select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
    union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
    go
    If OBJECT_ID('tempdb..#t') is not null
       drop table #tIf OBJECT_ID('tempdb..#tt') is not null
       drop table #tt
       select id,
           content,
           kw.word,
           dbo.f_searchSTR(tb.content,kw.word) 次数
           into #t
    from tb
    inner join key_word kw
            on 1=1
    where kw.word in ('asp','aspx','php')
    group by id,content,kw.wordselect t.id,content,word,次数,min_count
           into #tt
    from #t t
    inner join
    (
      select id,min(次数) min_count
      from #t
      group by id
    )tt
     on t.ID = tt.IDselect top 1 *
    from #tt
    where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
          and word = 'asp' 
    order by abs(次数 - 6 ) 
     
    /*
    id content
    5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
    */      
      

  14.   

    @yupeigu   如果要增加一个字数接近的条件   需要加点什么啊?
      

  15.   


    什么叫字数接近呢?
    某一篇 文章一 中匹配出的关键字: asp - 6次 、aspx - 8次、php - 9次 (记录出现次数最多的关键字 -  asp10次  文章字数 - 68个字)在其它数据中查找与其相同的文章:首先查找出:asp、aspx、php  这几个关键字至少每一个出现过一次的文章 然后再筛选:1、用记录的 asp次数(6)  和 其它文章 的关键字 asp的次数(5)  计算两个关键字的相差度   2、用记录的 文章一的字数(68)  和 其它文章 的字数  计算两个相差度 最后筛选出 关键字次数相差最小和文章字数相差最小的文章 --------------------------------
    id       context
    5  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
    6   ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP
    7  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页8  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页是动态网页结果
    id       context               文章字数
    8  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页是动态网页      63