数据库模糊搜索算法

lylinsir2008 2008-12-23 02:19:15
很简单的 困扰了我很久
比如输入关键字"武汉人民政府"
搜索结果中可以出来
"武汉市人民政府"
"武汉江汉区人民政府"
"武汉市洪山区人民政府"

如果输入关键字"武汉市人民政府"
搜索结果中可以出来
"武汉人民政府"
"武汉市江汉区人民政府"

也就是说只要
我的数据库字段里的值包含关键字 或者 关键字 包含我的数据库字段
结果都可以出来
麻烦哪位知道说一下 谢谢
...全文
770 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReyZhang 2009-01-13
  • 打赏
  • 举报
回复
up
csnjia 2009-01-13
  • 打赏
  • 举报
回复
路过,学习.
gengwanshanreally 2008-12-23
  • 打赏
  • 举报
回复
learn
火星求索 2008-12-23
  • 打赏
  • 举报
回复
全文引擎执行断字,此外,它还可以执行同义词库扩展、词干分析以及非索引字(干扰词)处理。
laidon 2008-12-23
  • 打赏
  • 举报
回复
分词
@str like '%武汉%' and @str like'%人民政府%'
火星求索 2008-12-23
  • 打赏
  • 举报
回复
全文索引就行,费劲
现成的解决方案就用呗

还要匹配分词
哪去百度做多好啊
walkghost 2008-12-23
  • 打赏
  • 举报
回复
分词啊。额滴个神丫。太巨大了。
supremeholy 2008-12-23
  • 打赏
  • 举报
回复
学习!
mark!
erik0930 2008-12-23
  • 打赏
  • 举报
回复
mark,学习
xwk789xwk 2008-12-23
  • 打赏
  • 举报
回复
路过,学习
bhtfg538 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 isline 的回复:]
为什么不用全文检索?
[/Quote]

全文索引 也是一个不错的选择
不过 很难维护...选择 自动维护的话 查询效率 要低
不过手动维护 要人每次都要去试试
没钱请DBA 数据大的时候 就闹火了 ,更新一次很花时间
huxuanhui 2008-12-23
  • 打赏
  • 举报
回复
路过 学习
jin225 2008-12-23
  • 打赏
  • 举报
回复
搜索那么好做的话 就不会只有一个google了
我做的搜索就随便用索引就行了
  • 打赏
  • 举报
回复
为什么不用全文检索?
飞飞虫2015 2008-12-23
  • 打赏
  • 举报
回复
帮顶
bhtfg538 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 winner2050 的回复:]
要用到分词。

一般根据空格分词就可以了,自己开发分词引擎,技术含量太高了。
[/Quote]

也没有 大哥 想的 那么 强大
先举个 关键字 用正则 匹配出来 特殊的 符合 比如 , 空格 ==之类的
然后 传递到 SQL SERVER 的 UDF 中
分词就实现了
然后根据一个 INNER JOIN 就能实现了
bhtfg538 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 greatverve 的回复:]
或许你用
@str like '%武汉%' adn @str like'%人民政府%'
能实现。
[/Quote]
没有 简单的问题
你 对 T-SQL 太小看了
很简单的算法
首先 用分词 技术 根据每个 汉字来分割,然后 插入一个 变量表 在 函数里面
只有一个 INNER JOIN 然后 ORDER BY ID desc 就把 匹配 最完整的 放前面了


T-SQL 是很精深的
bhtfg538 2008-12-23
  • 打赏
  • 举报
回复

CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))
INSERT tb SELECT '中国'
UNION ALL SELECT '中国人'
UNION ALL SELECT '中国人民'
UNION ALL SELECT '日本'
UNION ALL SELECT '日本人'
UNION ALL SELECT '我的心中有人姑娘'
UNION ALL SELECT '人民网'
UNION ALL SELECT '中国是个伟大的国家'
UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'

DECLARE @searchSTR VARCHAR(20)
SET @searchSTR='中国人'
SELECT ID,VALUE FROM tb a
INNER JOIN fn_SplitStringToROWS(@searchSTR) b
ON CHARINDEX(b.v,a.VALUE)>0
WHERE VALUE LIKE '%[中国人]%'
GROUP BY ID,VALUE
ORDER BY COUNT(DISTINCT v) DESC

DROP TABLE tb


--附函数
CREATE FUNCTION fn_SplitStringToROWS
(
@str VARCHAR(100)
)
RETURNS @t TABLE(v VARCHAR(2))
AS
BEGIN
DECLARE @i INT
SET @i=1
WHILE @i<=LEN(@str)4
BEGIN
INSERT @t SELECT SUBSTRING(@str,@i,1)
SET @i=@i+1
END
RETURN
END


/*


(所影响的行数为 9 行)

ID VALUE
----------- ----------------------------------------------------------------------------------------------------
9 我们都是中国人,都是炎黄子孙,都是龙人传人
2 中国人
3 中国人民
8 中国是个伟大的国家
1 中国
6 我的心中有人姑娘
7 人民网
5 日本人

(所影响的行数为 8 行)

*/

--如果要实现匹配度排序,那么可以去掉 WHERE ... LIKE那句,多余
--
--如果只想实现模糊的匹配,那么可以不需要连表,直接
--
--SELECT ID,VALUE FROM tb WHERE VALUE LIKE '%[中国人]%' 即可.
--
--
--
--
--
--按词匹配.

create function f_splitIDX(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(id int identity(1,1),v varchar(100))

begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end


CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))
INSERT tb SELECT '中国'
UNION ALL SELECT '中国人,中国'
UNION ALL SELECT '中国,中国人'
UNION ALL SELECT '中国人民'
UNION ALL SELECT '中国'
UNION ALL SELECT '日本'
UNION ALL SELECT '日本人'
UNION ALL SELECT '我的心中有人姑娘'
UNION ALL SELECT '人民网'
UNION ALL SELECT '中国是个伟大的国家'
UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'
DECLARE @searchSTR VARCHAR(20)
SET @searchSTR='中国人 中国'

SELECT a.ID,VALUE FROM tb a
INNER JOIN dbo.f_splitIDX(@searchSTR,' ') b
ON CHARINDEX(v,VALUE)>0
GROUP BY a.ID,Value
ORDER BY COUNT(DISTINCT v) DESC,MIN(b.id),a.id

DROP TABLE tb


忠无wei 2008-12-23
  • 打赏
  • 举报
回复
学习下
HolyPlace 2008-12-23
  • 打赏
  • 举报
回复
分词不错,又学习了。
加载更多回复(17)

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧