我需要为HTML页面集合创建搜索索引。
我根本没有实现搜索索引的经验,所以任何一般信息如何构建一个,存储什么信息,如何实现高级搜索,如“整个短语”,结果排名等。
我并不害怕自己构建它,尽管我很乐意重用现有的组件(或者使用一个开始使用原型)。我正在寻找一个可以从C ++访问的解决方案,最好不需要在运行时进行额外的安装。内容是静态的(因此聚合搜索信息是有意义的),但搜索可能必须累积来自多个此类存储库的结果。
我可以做一些有根据的猜测:为所有(相关)单词创建一个地图word ==> pages
,可以通过promincence(h1&gt; h2&gt; ...&gt; <p>
)和接近顶部。可以在此基础上构建高级搜索:搜索短语"homo sapiens"
可以列出包含"homo"
和"sapiens"
的所有页面,然后扫描返回的所有页面以查找它们一起出现的位置。然而,有很多有问题的场景和未解决的问题,所以我正在寻找对大量现有工作的参考,这些工作以某种方式逃脱了我的谷歌。
[为赏金编辑]
我发现的最好的资源is this以及那里的链接。
我确实有一个实验系统的实施路线图,但是,我仍在寻找:
答案 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。
获取纯文本后,您可以将它们存储在MySQL
或PostgreSQL
等数据库中。如果你想保持所有内容,你应该使用Beautiful Soup。
请注意,Sphinx
与sqlite
无法正常使用,但尝试添加支持(sqlite)。
答案 2 :(得分:2)
我会用一个小的sqlite数据库攻击它。您可以拥有“页面”,“术语”和“页面术语”的表格。 'Page'将包含id,text,title和url等列。 “Term”将包含一个包含单词的列以及主ID。 “页面术语”将具有页面ID和术语ID的外键,并且还可以存储权重,根据距离顶部的距离和出现次数(或任何您想要的)计算。
也许更有效的方法是只有两个表 - 'page'和以前一样,'page term'可以有页面ID,权重和术语单词的哈希值。
示例查询 - 您要搜索“foo”。您散列“foo”,然后查询具有该术语散列的所有页面术语行。按降序排序并显示前十名结果。
我认为这应该合理地快速查询,但显然取决于相关页面的数量和大小。 Sqlite并不难捆绑,不需要额外的安装。
答案 3 :(得分:2)
排名页面在这里真的很棘手。使用大页面样本,您可以在编制排名时使用相当多的链接。另外,您需要检查单词的放置方式,并确保您的引擎不会受到“字典”页面的愚弄。
祝你好运!