2011-05-13 63 views
2

我试图实现基于关键字搜索的搜索引擎。 任何人都可以告诉我哪个是最好(最快)的算法来实现关键词的搜索吗?PHP使用关键字的MYSQL搜索引擎

我需要的是:

我的关键字:

search, faster, profitable 

它们的同义词:

search: grope, google, identify, search 
faster: smart, quick, faster 
profitable: gain, profit 

现在我应该寻找上述同义词的所有可能的排列在一个数据库来识别大多数匹配词。

+1

不要为此使用MySQL。用户像lucene或elasticsearch。 – blockhead 2011-05-13 05:14:39

+0

听起来像你已经得到你的解决方案......你经历列表中单词的每个排列,并得到一个'SELECT ... WHERE ... LIKE $ permutation'。它应该只需要几秒钟的时间与你的给定清单。 – bdares 2011-05-13 08:06:24

回答

1

最好的解决方案是使用现有的搜索引擎,如Lucene或其替代方案之一(请参阅Which are the best alternatives to Lucene?)。

现在,如果你想自己实现它(这确实是一个很好的和现有的问题),你应该看看Inverted Index的概念。这就是谷歌和其他搜索引擎使用的。当然,他们有很多额外的系统,但这是最基本的。

倒排索引的思想是,对于每个关键字(和同义词),存储包含关键字的文档的标识。因此,为一组关键字查找匹配文档非常容易,因为您只需在倒排索引中计算其列表的交集(或联合取决于您想要执行的操作)。例如:

让我们假设你倒排索引:

smart: [42,35] 
gain: [42] 
profit: [55] 

现在,如果你有一个查询“智能,获得”,你的配套文件的交集(或联合)[42,35]和[42]。

要处理同义词,您只需要扩展查询以包括初始查询中单词的所有同义词。根据你的例子,你的查询将变得“更快,更快,更有收益,更有利可图”。

一旦你实现了,一个很好的改进是将TFIDF加权到你的关键字。这基本上是一种比常见词(编程)更重的罕见词(编程)的方法。

另一种方法是只浏览所有文档并找到包含您的单词(或其同义词)的文档。倒排索引会更快,因为您不必每次都浏览所有文档。耗时的操作是建立索引,只需要完成一次。