数据库模糊搜索算法

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

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

也就是说只要
我的数据库字段里的值包含关键字 或者 关键字 包含我的数据库字段
结果都可以出来
麻烦哪位知道说一下 谢谢
...全文
740 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReyZhang 2009-01-13
  • 打赏
  • 举报
回复
up
csnjia 2009-01-13
  • 打赏
  • 举报
回复
路过,学习.
gengwanshanreally 2008-12-23
  • 打赏
  • 举报
回复
learn
晓风残月0110 2008-12-23
  • 打赏
  • 举报
回复
全文引擎执行断字,此外,它还可以执行同义词库扩展、词干分析以及非索引字(干扰词)处理。
laidon 2008-12-23
  • 打赏
  • 举报
回复
分词
@str like '%武汉%' and @str like'%人民政府%'
晓风残月0110 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)
掌握分布式mapreduce与raft算法与分布式数据库MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念Map(映射)和Reduce(归约),是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如leader人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Raft 算法比 Paxos 算法更加容易学习。Raft 算法还包括一个新的机制来允许集群成员的动态改变,它利用重叠的大多数来保证安全性。 一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。在过去的 10 年里,Paxos 算法统治着一致性算法这一领域:绝大多数的实现都是基于 Paxos 或者受其影响。同时 Paxos 也成为了教学领域里讲解一致性问题时的示例。 但是不幸的是,尽管有很多工作都在尝试降低它的复杂性,但是 Paxos 算法依然十分难以理解。并且,Paxos 自身的算法结构需要进行大幅的修改才能够应用到实际的系统中。这些都导致了工业界和学术界都对 Paxos 算法感到十分头疼。 和 Paxos 算法进行过努力之后,我们开始寻找一种新的一致性算法,可以为构建实际的系统和教学提供更好的基础。我们的做法是不寻常的,我们的首要目标是可理解性:我们是否可以在实际系统中定义一个一致性算法,并且能够比 Paxos 算法以一种更加容易的方式来学习。此外,我们希望该算法方便系统构建者的直觉的发展。不仅一个算法能够工作很重要,而且能够显而易见的知道为什么能工作也很重要。 Raft 一致性算法就是这些工作的结果。在设计 Raft 算法的时候,我们使用一些特别的技巧来提升它的可理解性,包括算法分解(Raft 主要被分成了leader人选举,日志复制和安全三个模块)和减少状态机的状态(相对于 Paxos,Raft 减少了非确定性和服务器互相处于非一致性的方式)。一份针对两所大学 43 个学生的研究表明 Raft 明显比 Paxos 算法更加容易理解。在这些学生同时学习了这两种算法之后,和 Paxos 比起来,其中 33 个学生能够回答有关于 Raft 的问题。 Raft 算法在许多方面和现有的一致性算法都很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是它也有一些独特的特性: 强leader:和其他一致性算法相比,Raft 使用一种更强的leader能力形式。比如,日志条目只从leader发送给其他的服务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。leader选举:Raft 算法使用一个随机计时器来选举leader。这种方式只是在任何一致性算法都必须实现的心跳机制上增加了一点机制。在解决冲突的时候会更加简单快捷。成员关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问

62,025

社区成员

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

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

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

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