一个文章表,有一个标题字段title,按要求要对title进行关键字检索。一般关键字是中文的时候,直接使用下面的语句,情况正常
select * from xxx where title like '%用友%' 但是如果关键词是英文 如 bus,使用下面语句,某些情况下就不正常了
select * from xxx where title like '%king%' 这样如果标题 含有 kingdom,或者kingship 之类的单词也一样被搜索出来了。
客户要求,如果是英文的话,需要匹配的更精确一些,只有标题是 XXX kingdom xxx之类的信息才能配检索到。请问一下该怎么处理一下,好兼顾中文和英文的检索。
select * from xxx where title like '%用友%' 但是如果关键词是英文 如 bus,使用下面语句,某些情况下就不正常了
select * from xxx where title like '%king%' 这样如果标题 含有 kingdom,或者kingship 之类的单词也一样被搜索出来了。
客户要求,如果是英文的话,需要匹配的更精确一些,只有标题是 XXX kingdom xxx之类的信息才能配检索到。请问一下该怎么处理一下,好兼顾中文和英文的检索。
程序就是这样设置的,除非他输入kingdom那么匹配出来的肯定就是kingdom类似的,
如果只是输入king想找到kingdom,在存在kingship记录的情况下,这是不可能实现的.
这个没有办法精确 :)
假如文章标题是 用友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 是两个不同意思的词语。
模糊查询就是相似都查询出来,
而你数据的查询条件的精确度不够,
不能要求程序来帮你精确,
也就是存在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,
拿你是不是也要改你的查询啊?
这种方式不不可取.
没办法精确么,老板就这么要求,很麻烦,也不想做太复杂。毕竟这种情况出现的几率不大,而且文章数据量也比较大,太复杂的算法,会很影响效率。
select * from xxx where ' '+title+' ' like '% king %'
弱弱地说一句昨天别人骂我的话,
LZ不要见怪哈::P
人长脑袋是用来想问题的,
什么都不需要想,
那还长个脑袋做什么 ...
呵呵 :)
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
*/
2、检测是否全为英文(论坛中有现成的函数),如全为英文用1楼的办法,两边空格
你好,
你的方法 select * from xxx where ' '+title+' ' like '% king %'
这个可以匹配一部分英文的情况,但是
加入说英文旁边是中文的化
好比标题是: 我爱NBA,我爱打篮球
匹配关键词NBA,用select * from xxx where ' '+title+' ' like '% NBA%'
就查不到了,按需求要求是应该可以查的到的。
但是毕竟有其弱点,就像你举得中文例子:
假如有一个title是: 梁山吴用友好接待楼主!
那么你输入:用友,也是会被搜索出来的,貌似也不符合LZ需求了
也就是说你的title是中英文互存的,而且,你还要英文具体匹配,这样的话,就比较麻烦了。
客戶的需求也得是合理的需求吧,否则爱用不用
1.首先你要判断你输入的关键字是否全部为英文字符如果是英文字符的话,就将两边加2个空格select * from @tb where ' '+title+' ' like '% king %'否则就不要加select * from @tb where ' '+title+' ' like '%用友%'
可是现在一般涉及到国外厂商的新闻,如IBM,ORACLE之类的 新闻的标题一般都会有中文紧挨着的,
而且像IBM这种关键词,字数很少,又很容易出现长英文单词包含短单词的情况。
中文,不考虑playwarcraft举例的话,就直接like差不多少
英文,用charindex去截取所要查询字符所在的位置,然后对其前字符和其后字符再做判断。
不过老板要真这么要求,那实在是做不了啦。
declare @str varchar(800)
declare @sql varchar(8000)
set @sql = 'select * from tb where titile like ''%'+@str+'%'''
exec(@sql)
--你管客戶輸什麼,他輸的越詳細,查出來的越精確
比如一个title,你可以建一个栏位,内包含若干关键字title: 吴用友好的请楼主试试oracle的drawback
关键字: 吴用,楼主,oracle,drawback这样只要 where charindex(','+@input+',', ','+keyword+',')>0
declare @a varchar(100)
set @a='king'
if patindex('%[^a-zA-Z]%',@a)>0
print '中文' --换成中文搜索语句
else
print '英文' --换成英文搜索语句
--我认为基本可以满足楼主要求
匹配起来更精确。wgzaaa :
col like '%[^a-zA-Z]king[^a-zA-Z]%' or col like 'king[^a-zA-Z]%'
我想这个应该差不多就可以了,再特殊的情况那实在是不想考虑了。