【问题标题】:PHP MYSQL search engine using keywordsPHP MYSQL 搜索引擎使用关键字
【发布时间】:2011-08-24 15:40:39
【问题描述】:

我正在尝试实现基于关键字搜索的搜索引擎。 谁能告诉我实现关键字搜索的最佳(最快)算法是什么?

我需要的是:

我的关键词:

search, faster, profitable

它们的同义词:

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

现在我应该在数据库中搜索上述同义词的所有可能排列,以确定最匹配的单词。

【问题讨论】:

  • 不要为此使用 MySQL。使用诸如 lucene 或 elasticsearch 之类的东西。
  • 在我看来您已经找到了解决方案...您检查了列表中单词的每一个排列,并获得了SELECT ... WHERE ... LIKE $permutation。您给定的列表应该只需要几秒钟。

标签: performance algorithm search


【解决方案1】:

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

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

倒排索引的想法是,对于每个关键字(和同义词),您存储包含该关键字的文档的 ID。然后很容易为一组关键字查找匹配的文档,因为您只需计算倒排索引中它们列表的交集(或根据您想做的事情的并集)。示例:

假设这是你的倒排索引:

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

现在,如果您有一个查询“smart, gain”,您的匹配文档是 [42, 35] 和 [42] 的交集(或并集)。

要处理同义词,您只需扩展查询以包含初始查询中单词的所有同义词。根据您的示例,您的查询将变为“更快、更快、增益、利润、盈利”。

一旦您实现了这一点,一个不错的改进就是为您的关键字添加TFIDF 权重。这基本上是一种比常用词(the)更重视稀有词(编程)的方法。

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

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 2011-09-21
    • 1970-01-01
    • 2021-06-30
    • 2013-09-03
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多