一个文章表,有一个标题字段title,按要求要对title进行关键字检索。一般关键字是中文的时候,直接使用下面的语句,情况正常
select * from xxx where title like  '%用友%' 但是如果关键词是英文 如 bus,使用下面语句,某些情况下就不正常了
select * from xxx where title like '%king%' 这样如果标题 含有 kingdom,或者kingship 之类的单词也一样被搜索出来了。
客户要求,如果是英文的话,需要匹配的更精确一些,只有标题是 XXX kingdom xxx之类的信息才能配检索到。请问一下该怎么处理一下,好兼顾中文和英文的检索。

解决方案 »

  1.   

    select * from xxx where title like '% king %' 
      

  2.   

      如果客户输入king 那么可以找出kingdom和kingship这个很正常啥,
      程序就是这样设置的,除非他输入kingdom那么匹配出来的肯定就是kingdom类似的,
      如果只是输入king想找到kingdom,在存在kingship记录的情况下,这是不可能实现的.
      这个没有办法精确 :)
      

  3.   

    好把,我举一个例子。
    假如文章标题是  用友2003年发布XXX产品
    我搜索关键词用友,
    select * from xxx where title like  '%用友%' 
    能正常搜索出来。假如文章标题是 the king of xxxx is xxx x xx
    搜索关键词 king 
    select * from xxx where title like  '%king%' 
    也能正常搜索出来。可如果标题是 the kingdom xxxx xxxx
    搜索关键词 king 
    select * from xxx where title like  '%king%' 
    也能检索出来。客户就要求,这种情况不应该出现,毕竟kingdom 和 king 是两个不同意思的词语。
      

  4.   

    什么是模糊查询.
    模糊查询就是相似都查询出来,
    而你数据的查询条件的精确度不够,
    不能要求程序来帮你精确,
    也就是存在kingdom,kingship的记录,
    如果你只是输入king,
    即使按照客户要求,也能够实现
    只要top 1就行了, kingdom >kingship的排序.
    declare @tb table(title nvarchar(20))
    insert into @tb
    select 'kingship'
    union all select 'kingdom'
    union all select 'bus'select top 1 * from @tb where title like '%king%' order by title
    /*
    title
    --------------------
    kingdom
    */
    但是如果哪天客户BT,说输入king的时候要匹配kingship,
    拿你是不是也要改你的查询啊?
    这种方式不不可取.
      

  5.   

    hery2002  
    没办法精确么,老板就这么要求,很麻烦,也不想做太复杂。毕竟这种情况出现的几率不大,而且文章数据量也比较大,太复杂的算法,会很影响效率。
      

  6.   

    就是精确匹配单词吧:这样试试
    select * from xxx where ' '+title+' ' like '% king %'
      

  7.   

    不要指望程序什么都实现了,
    弱弱地说一句昨天别人骂我的话,
    LZ不要见怪哈::P
    人长脑袋是用来想问题的,
    什么都不需要想,
    那还长个脑袋做什么 ...
    呵呵 :)
      

  8.   

    我的思路是,能否判断关键词是不是英文,如果是英文的化,用LIKE匹配的时候,左右的匹配字符不能为英文字符。不知道这个思路是否可行。
      

  9.   

    declare @tb table(title nvarchar(20))
    insert into @tb
    select 'maill kingship pp'
    union all select 'dd a kingdom ee'
    union all select 'king'
    union all select 'ss king ee'
    union all select 'aa king  ff'select * from @tb where ' '+title+' ' like '% king %'
    /*
    -------
    king
    ss king ee
    aa king  ff
    */
      

  10.   

    1、建全文索引用contains
    2、检测是否全为英文(论坛中有现成的函数),如全为英文用1楼的办法,两边空格
      

  11.   

     perfectaction 
    你好,
    你的方法 select * from xxx where ' '+title+' ' like '% king %'
    这个可以匹配一部分英文的情况,但是
    加入说英文旁边是中文的化
    好比标题是: 我爱NBA,我爱打篮球
    匹配关键词NBA,用select * from xxx where ' '+title+' ' like '% NBA%'
    就查不到了,按需求要求是应该可以查的到的。
      

  12.   

    如果是英语单词,可以在前后都加上空格来搜索,
    但是毕竟有其弱点,就像你举得中文例子:
    假如有一个title是: 梁山吴用友好接待楼主!
    那么你输入:用友,也是会被搜索出来的,貌似也不符合LZ需求了
      

  13.   


    也就是说你的title是中英文互存的,而且,你还要英文具体匹配,这样的话,就比较麻烦了。
      

  14.   

    就算是google,baidu也解决不了这样的问题的,所以建议LZ直接like '%%'
    客戶的需求也得是合理的需求吧,否则爱用不用
      

  15.   


    1.首先你要判断你输入的关键字是否全部为英文字符如果是英文字符的话,就将两边加2个空格select * from @tb where ' '+title+' ' like '% king %'否则就不要加select * from @tb where ' '+title+' ' like '%用友%'
      

  16.   

    是的,英文的情况比较复杂,标题如果纯粹都是英文,那关键词左右加空格来匹配基本能满足要求。
    可是现在一般涉及到国外厂商的新闻,如IBM,ORACLE之类的 新闻的标题一般都会有中文紧挨着的,
    而且像IBM这种关键词,字数很少,又很容易出现长英文单词包含短单词的情况。
      

  17.   

    只能尽可能的去匹配,
    中文,不考虑playwarcraft举例的话,就直接like差不多少
    英文,用charindex去截取所要查询字符所在的位置,然后对其前字符和其后字符再做判断。
      

  18.   

    playwarcraft 兄举的例子也是一种情况。
    不过老板要真这么要求,那实在是做不了啦。
      

  19.   

    考虑到没有空格 改为 col like '%[^a-zA-Z]king[^a-zA-Z]%' or col like 'king[^a-zA-Z]%'
      

  20.   

    --你開個欄位給客戶自己輸不就好了?
    declare @str varchar(800)
    declare @sql varchar(8000)
    set @sql = 'select * from tb where titile like ''%'+@str+'%'''
    exec(@sql)
    --你管客戶輸什麼,他輸的越詳細,查出來的越精確
     
      

  21.   

    如果变通一下,是不是考虑建关键字查询?
    比如一个title,你可以建一个栏位,内包含若干关键字title:  吴用友好的请楼主试试oracle的drawback
    关键字: 吴用,楼主,oracle,drawback这样只要 where charindex(','+@input+',', ','+keyword+',')>0
      

  22.   

    更正,不用动态语句,直接用if else 就行
    declare @a varchar(100)   
    set @a='king'    
    if patindex('%[^a-zA-Z]%',@a)>0     
      print '中文'  --换成中文搜索语句 
    else   
      print '英文'  --换成英文搜索语句
    --我认为基本可以满足楼主要求
      

  23.   

    playwarcraft 你说的这个建关键字查询? 我感觉和文章建立标签差不多,可能人工参与创建
    匹配起来更精确。wgzaaa :
    col like '%[^a-zA-Z]king[^a-zA-Z]%' or col like 'king[^a-zA-Z]%'
    我想这个应该差不多就可以了,再特殊的情况那实在是不想考虑了。
      

  24.   

    如果是英文字符的话,就将两边加2个空格 select * from @tb where ' '+title+' ' like '% king %' 否则就不要加 select * from @tb where ' '+title+' ' like '%用友%'