创建和使用HTML全文搜索索引(C ++)

时间:2010-06-18 22:14:40

标签: c++ html visual-c++ full-text-search

我需要为HTML页面集合创建搜索索引。

我根本没有实现搜索索引的经验,所以任何一般信息如何构建一个,存储什么信息,如何实现高级搜索,如“整个短语”,结果排名等。

我并不害怕自己构建它,尽管我很乐意重用现有的组件(或者使用一个开始使用原型)。我正在寻找一个可以从C ++访问的解决方案,最好不需要在运行时进行额外的安装。内容是静态的(因此聚合搜索信息是有意义的),但搜索可能必须累积来自多个此类存储库的结果。


我可以做一些有根据的猜测:为所有(相关)单词创建一个地图word ==> pages,可以通过promincence(h1&gt; h2&gt; ...&gt; <p>)和接近顶部。可以在此基础上构建高级搜索:搜索短语"homo sapiens"可以列出包含"homo""sapiens"的所有页面,然后扫描返回的所有页面以查找它们一起出现的位置。然而,有很多有问题的场景和未解决的问题,所以我正在寻找对大量现有工作的参考,这些工作以某种方式逃脱了我的谷歌。


[为赏金编辑]
我发现的最好的资源is this以及那里的链接。 我确实有一个实验系统的实施路线图,但是,我仍在寻找:

  • 有关索引创建和个别步骤的参考资料
  • 各个步骤的可用实施
  • 可重用的实现(具有上述环境限制)

4 个答案:

答案 0 :(得分:32)

答案 1 :(得分:3)

根据静态页面的大小和数量,您可能希望查看已存在的搜索解决方案。

“你如何实现对这个超过10万行表的全文搜索,跟上负载并保持相关性?Sphinx擅长这些谜语。”

我会为full text searching选择Sphinx引擎。许可证为GPL,但也提供commercial版本。它应该是独立运行的[2],但它也可以通过提取所需的功能嵌入到应用程序中(无论是indexing [1]searching {{3 },stemming等。)

应该通过解析输入HTML文件并使用像[3]之类的解析器将它们转换为plain-text来获取数据(我没有使用它,但是他们说它可以解析甚至格式错误的HTML)。如果您不受C/C++的约束,可以查看libxml2's HTMLparser

获取纯文本后,您可以将它们存储在MySQLPostgreSQL等数据库中。如果你想保持所有内容,你应该使用Beautiful Soup

请注意,Sphinxsqlite无法正常使用,但尝试添加支持(sqlite)。

答案 2 :(得分:2)

我会用一个小的sqlite数据库攻击它。您可以拥有“页面”,“术语”和“页面术语”的表格。 'Page'将包含id,text,title和url等列。 “Term”将包含一个包含单词的列以及主ID。 “页面术语”将具有页面ID和术语ID的外键,并且还可以存储权重,根据距离顶部的距离和出现次数(或任何您想要的)计算。

也许更有效的方法是只有两个表 - 'page'和以前一样,'page term'可以有页面ID,权重和术语单词的哈希值。

示例查询 - 您要搜索“foo”。您散列“foo”,然后查询具有该术语散列的所有页面术语行。按降序排序并显示前十名结果。

我认为这应该合理地快速查询,但显然取决于相关页面的数量和大小。 Sqlite并不难捆绑,不需要额外的安装。

答案 3 :(得分:2)

排名页面在这里真的很棘手。使用页面样本,您可以在编制排名时使用相当多的链接。另外,您需要检查单词的放置方式,并确保您的引擎不会受到“字典”页面的愚弄。

祝你好运!