我正在尝试基于关键字搜索实现搜索引擎。 谁能告诉我哪个是实现搜索关键词的最佳(最快)算法?
我需要的是:
我的关键字:
search, faster, profitable
他们的同义词:
search: grope, google, identify, search
faster: smart, quick, faster
profitable: gain, profit
现在,我应该搜索数据库中上述同义词的所有可能的排列,以识别最匹配的单词。
答案 0 :(得分:1)
最好的解决方案是使用现有的搜索引擎,例如Lucene或其替代方案(请参阅Which are the best alternatives to Lucene?)。
现在,如果你想自己实现它(这确实是一个很好的问题),你应该看一下Inverted Index的概念。这就是谷歌和其他搜索引擎所使用的。当然,它们还有很多额外的系统,但这是基本的。
倒排索引的想法是,对于每个关键字(和同义词),您存储包含关键字的文档的ID。然后很容易为一组关键字查找匹配的文档,因为您只需在倒排索引中计算其列表的交集(或者取决于您想要做什么的联合)。示例:
我们假设这是你的倒排索引:
smart: [42,35]
gain: [42]
profit: [55]
现在,如果你有一个“智能,增益”的查询,你的匹配文件就是[42,35]和[42]的交集(或联合)。
要处理同义词,您只需要扩展查询以包含初始查询中单词的所有同义词。根据您的示例,您的查询将变得“更快,更快,更好,更有利可图”。
一旦实现了这一点,一个很好的改进就是为关键字添加TFIDF权重。这基本上是一种比普通词(编程)更重要的方法(编程)。
另一种方法是浏览所有文档并找到包含您的文字(或其同义词)的文档。倒排索引会更快,因为您不必每次都浏览所有文档。耗时的操作是构建索引,只需要执行一次。