PHP/mySQL中类似Google的搜索引擎

23
我们OCR了成千上万页的报纸文章。每一页的报纸、期号、日期、页码和OCR文本都已放入mySQL数据库中。
现在我们想用PHP构建类似Google的搜索引擎以查找给定查询的页面。它必须快速,任何搜索都不应超过一秒钟。
我们应该如何做呢?

3
谷歌与普通文本搜索引擎的不同之处在于,谷歌研究页面之间的关系。你如何将你的网页联系起来?链接?关键词/短语?如果你没有任何类型的联系,最好使用文本搜索。 - Adam Pierce
1
我们的数据库有50,000个项目,使用mySQL进行纯文本搜索大约需要20秒。我们OCR处理过的报纸页面是一个更大的数据集。我们需要更快速、类似Google的索引和检索方法,以在不到一秒的时间内搜索我们的报纸。 - lkessler
搜索引擎不使用 SQL 数据库,因为它们会使搜索变慢。您可以使用 Lucene 或编写自己的搜索引擎。PHP 不适合开发搜索引擎。 - alienCoder
3
我五年前提出了这个问题,它有26,000次浏览和17个点赞。所以现在,五年后,你决定认为它太笼统而将其暂停? - lkessler
这个问题应该再次公开讨论并深入探讨! - Miron
9个回答

15

你还可以尝试使用SphinxSearch。Craigslist使用sphinx,并且它可以连接到mysql和postgresql。


嗨,我创建了很多网页,我想在我的页面中搜索任何单词.. 所以,你们所有的答案对我都有用吗?谢谢。 - pcs

10

这里有一些有趣的搜索引擎供您参考。我不知道您所说的“类似谷歌”的意思,所以我会忽略这部分。

  • 看看 Lucene 引擎。原版性能很高,但是用 Java 编写。有一个 Lucene 的 PHP 移植版本(已经在其他地方提到过),但速度太慢。
  • 认真看看 Xapian 项目。速度很快。它是用 C++ 编写的,因此您很可能需要为目标服务器构建它,但它具有 PHP 绑定。

10
如果MySQL的全文搜索每次查询都需要20秒,那么你要么配置错误,要么运行在配置差的硬件上 - 有些大型网站成功地使用了老旧的MyISAM搜索。但是我的选择是Solr。它基于Lucene,因此您可以获得这个最好的产品的所有丰富性和性能,但具有RESTful API,因此非常易于通过PHP进行访问。甚至还有一篇dW文章介绍。

1
我同意。一路走SOLR没问题。我多次集成PHP和SOLR,这很值得花时间去做。 - Rafael Sanches
MySQL全文搜索需要20秒,这表明存在某些问题。即使在非常低端的系统上(单核心,512 MB内存),对于大于250,000行的完整文本,SQL和页面呈现时间总计应该大约为0.01到0.05秒,即使在每个关键字上执行多个LIKE语句的数据库上,也不应该超过1秒。听起来最有可能的是列没有被索引。对于小于250,000行的情况,在PHP中循环遍历所有匹配的结果以智能地对它们进行排名仍然应该在一秒钟以内完成。 - Iain Collins
嗨,我创建了很多网页,我想在我的页面中搜索任何单词。所以,你们所有的答案对我都有用吗?谢谢。 - pcs

4
你可以将所有文件放在Google文档中,然后将结果爬取到自己的网站上。
我的担忧是OCR准确性仍然存在问题,因此考虑搜索要求时,需要能够执行“模糊”搜索的能力。模糊意味着当OCR错误地识别单词“帽子”为“热”,搜索引擎将足够聪明,返回相似但不完全相同的结果。在Oracle中,有一个名为UTL_MATCH的函数,用于比较两个字符串之间的相似度:http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS352 这样的功能会很有用。

2

根据您的情况,您想要自己开发搜索引擎;一般搜索引擎的好的起点包括:

如果您想使用现成的解决方案:


哇,为什么要自己写呢?我真的看不出OP的情况有什么值得重新实现最近已经成为商品特性的东西。 - James Brady
2
原帖作者说:“我们现在想要构建”。 - Artelius

2

为什么不尝试使用类似Google Search Appliance或Google Enterprise的东西呢?它们会有相关成本,但可以避免重复发明轮子,并提供“类似谷歌”的搜索。


我们更愿意坚持使用PHP和MySQL,因为数据库具有交叉目的,并且需要与我们网站的其余部分集成。 - lkessler

1

1

你可能想要检查一下Sphider。根据我的经验,它非常快速,并且可以自动进行索引。它还是开源的,所以你可以拿代码并根据你的需求进行修改。


0

SQLite具有相当不错的全文搜索能力(查看SQLite FTS 3/4 - 它出人意料地好)

如果您想要一个简单的PHP DIY方法,使用许多由被索引术语的哈希拆分的小文件进行索引可以非常有效,并且如果您注意设计,搜索速度甚至在PHP中也可以非常快。 (这个想法是使仅在包含与哈希和记录ID匹配的术语的非常小的文件上进行搜索 - 如果您想节省硬盘空间,可以使用位数组切片来表示记录ID) ..但对于完整文本的每个单词进行索引可能会很慢..那部分应该真正用C来完成

对于“模糊”搜索,可以考虑使用metaphone哈希。

对于预构建的全文搜索工具,请查看以下内容: SQLite FTS 3/4(SQLite具有非常好的全文搜索能力!), Sphinx, kinoSearch (kinoSearch有点像Lucene,但后端是C,有一个漂亮易用的Perl包装器 - 还有cLucene,但我认为那仍然是预阿尔法版)

Java Lucene(或任何基于Java的东西)可能需要大量RAM来运行JVM - 因此如果您预算有限,则可能不太适合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接