【发布时间】:2011-04-18 11:58:20
【问题描述】:
如何做到这一点,当您搜索“外星人 vs 捕食者”时,您还会得到带有“S”字符串“外星人 vs 捕食者”的结果
例如http://www.torrentz.com/search?q=alien+vs+predator
他们是如何实现的?
这是高级搜索引擎的东西吗?
【问题讨论】:
标签: php mysql search search-engine
如何做到这一点,当您搜索“外星人 vs 捕食者”时,您还会得到带有“S”字符串“外星人 vs 捕食者”的结果
例如http://www.torrentz.com/search?q=alien+vs+predator
他们是如何实现的?
这是高级搜索引擎的东西吗?
【问题讨论】:
标签: php mysql search search-engine
您可以尝试使用 soundex() 作为字符串的模糊匹配。如果您将 soundex 与标题一起保存,然后使用 LIKE 'XXX%' 将该索引与子字符串进行比较,您应该会有一个不错的匹配。子串计数越高,它们匹配的越接近。
参见文档:http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_soundex
【讨论】:
当词被索引时,它们被根形式索引。例如对于“外星人”,“外星人”、“外星人”、“外星人”都存储为“外星人”。
当词被搜索时,搜索引擎也只搜索词根形式“外星人”。
这通常被称为波特词干算法。你可以在这里下载你喜欢的语言的实现 - http://tartarus.org/~martin/PorterStemmer/
【讨论】:
通常,当设置搜索引擎来搜索文本时,会构建一个类似于以下内容的查询:
SELECT * FROM TBLMOVIES WHERE NAME LIKE '%ALIEN%'
这意味着子字符串ALIEN 可以出现在NAME 字段中的任何位置,因此您将得到像ALIENS 这样的字符串。
【讨论】:
检查复数是词干的一种形式。词干提取是搜索引擎和其他文本匹配的常见功能。请参阅维基百科页面:http://en.wikipedia.org/wiki/Stemming,了解执行词干提取的大量算法。
【讨论】:
这被称为Word Stemming。当文本被索引时,单词被“提取”到它们的“根”。所以打架变成了战斗,滑雪变成了滑雪,跑步变成了跑步,等等。用户在搜索时输入的文本也是如此,所以当搜索词与索引中的值进行比较时,它们就会匹配。
Lucene 项目支持这一点。我不会认为它是高级功能。尤其是 Google 设定的期望。
【讨论】:
这是搜索引擎的一项基本功能,而不仅仅是一个将您的查询与一组预定义结果相匹配的程序。
如果你有时间,this 是一本很好的读物,所有关于不同的算法,以及它们是如何实现的。
【讨论】: