数据库模糊搜索概念


13

我对此进行了思考,并且一直在尝试提出有关如何模糊搜索数据库的解决方案,例如,如果用户键入了拼写错误。这个逻辑背后有什么明显的问题吗?它会工作吗,并且以前做过吗?

我们希望搜索的表:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

因此,我们存储原始文本正文以进行物理显示。其他两列用于通过以下方式预先计算的搜索:

声音

正文被分解成单词,然后翻译成其soundex版本。IE,生成的正文可能类似于:

H252 B54 C23 E33... etc

因此,有人可能会输入“恐龙”,而本文的正文为“恐龙”,则两者均等于B26。然后,我们对搜索词的soundex值运行一个LIKE。

字符编码

给定一个将char映射到质数的字符映射,即IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

如果用户打算键入“ hello”,但是他们切换了两个或多个字符(例如“ hlelo”),则他们求值的数字相同。将原始内容分解为单词,对每个单词进行素编码,然后存储在数据库中,从而得到一个类似于以下内容的字段:

330 6825 330 1050... etc

然后,我们可以像在此值上搜索以匹配错误类型。

好处

  • 错字保护免受
  • 防止拼音错误的拼写
  • 更多非英语母语人士
  • 可以使用任何语言(soundex可以在其中使用)

评论和想法?一种多层搜索。您当然可以通过权重返回值来使其更好(例如,文字文本匹配更有价值),但这是否是解决拼写错误和非英语使用者进行搜索的好方法?


看看这与Trigram Search的比较会很有趣。
丰富

我希望为wordpress拥有类似的功能……
Kit Menke

使用素数作为哈希函数是否可以使不包含相同方法的单词冲突成为不可能?似乎应该有一个长词,其中包含许多低值字母,而散列的值与短词中包含一些高值字母的字母相同,但我不知道很多数字理论,所以它可能已经被一种或另一种方式证明了……
glenatron 2011年

1
@Glen Afaik将素数相乘总是生成一个唯一的数字。字谜会碰撞,但是会引起很多问题,这就是快速找到字谜的关键。
汤姆(Tom)

@Glen:有关唯一性,请参见唯一因式分解定理。
史蒂文·埃弗斯

Answers:


2

还有许多其他搜索算法。史密斯·沃特曼Smith-Waterman)是最适合人类文字的语言之一,而BLAST(到目前为止)是搜索DNA序列的最佳语言。当显示带有各种拼写错误的文本(例如)hlephelp,您正在寻找最小的编辑距离

对于要在SQL Server 2005(及更高版本)的CLR中实现许多这些功能的库,请查看源伪造项目SimMetrics。有关SimMetrics的博客文章http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

之所以开发Soundex,是因为区域性语音变体之间的主要差异几乎完全在元音中,这就是为什么将元音扔掉的原因。它不善于处理转置字母。


2

Apache Solr支持同义词和拼写更正-尽管仍然有些粗糙。

可以使用Ngrams实现模糊搜索,

Porter Stemmer:http : //tartarus.org/~martin/PorterStemmer/

和一个语言数据库,例如http://wordnet.princeton.edu/

...但是像Xapian和Solr这样的项目可以为您处理很多事情。

如果您确实想构建自己的词搜索项解析/搜索引擎,我建议您将生成的标记或术语放入旨在执行语言搜索的现有数据库中。


1

我对地址做了类似的事情,可以检查将一个字符串转换为另一个字符串需要进行多少更改,并返回介于0和1之间的数值,以了解两者之间的匹配程度。

它的效果很好,因为它将为N / North,St / Street,EastMain / MainEast等项返回高价值。这个想法来自此CodeProject链接


您为地址匹配编写的代码是开源的吗?
件事

@Thismatters我无权访问该代码,但是答案中的链接应为其提供逻辑。基本上,您只想看看将一根弦变成另一根弦需要进行多少更改,并且更改越少,更改就越紧密
Rachel

0

如果您要匹配名称,人物或地点,则同义词列表可以更好地工作。

Soundex将与“ Dick == Richard”,“ Kit == Christopher”或“ Ms。== Mrs”不匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.