69

我想为网站实现搜索功能(假设它类似于 SO)。我不想使用谷歌搜索类似的东西。

我的问题是:

我该如何实施?

我知道有两种方法:

  1. 当用户提出查询时,搜索应用程序中的所有数据库。
  2. 索引我拥有的所有数据并将其存储在其他地方并从那里查询(就像谷歌所做的那样)。

谁能告诉我该走哪条路?优缺点都有什么?

更好的是,有没有更好的方法来做到这一点?

4

7 回答 7

39

使用 lucene, http:
//lucene.apache.org/java/docs/

Apache Lucene 是一个完全用 Java 编写的高性能、全功能的文本搜索引擎库。它是一种适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台的应用程序。

它在 java 和 .net 中可用。它也以 zend 框架模块的形式在 php 中可用。

Lucene 做你想做的事(搜索项目的索引),你必须跟踪一个 lucene 索引,但它在性能方面比进行数据库搜索要好得多。顺便说一句,SO 搜索由 lucene 提供支持。:D

于 2008-08-29T10:09:40.830 回答
36

这取决于您的网站有多全面以及您想自己做多少。

如果您正在运行一个小型网站而没有进一步添加自定义搜索的可能性,请让 google 完成工作(也许添加站点地图)并使用google 自定义搜索

如果您使用 sql 引擎运行中型站点,请使用 sql 引擎的搜索功能。

如果您运行一些较重的软件堆栈,例如 J2EE 或 .Net,请使用Lucene,一个强大的搜索引擎或其 .Net 克隆lucene.Net

如果您想从应用程序中抽象出搜索并能够使用 XML/HTTP 和 JSON API 以语言中立的方式查询它,请查看solr。Solr 在后台运行 lucene,但添加了一个不错的 Web 界面。

于 2008-08-29T17:42:18.437 回答
4

您可能想看看xapianomega前端。它本质上是一个工具包,您可以在其上构建搜索功能。

于 2008-08-29T10:11:51.200 回答
1

解决此问题的最佳方法取决于您构建页面的方式。

如果它们经常由许多不同的记录组成(就像我想象的堆栈溢出页面那样),那么索引方法可能会提供更好的结果,除非您投入大量工作来有效地重建数据库端的页面。

索引方法的缺点是周转时间。有一些变通方法(比如谷歌的站点地图的东西),但它们也很复杂。

如果您使用数据库路径,还请注意,如果现代搜索引擎系统有要处理的链接数据,它们的功能会更好,因此找到一个可以理解数据库中“页面”之间链接的系统将产生积极影响。

于 2008-08-29T10:16:50.627 回答
1

如果您在 Microsoft 平台上,则可以使用索引服务。这很容易与 IIS 网站集成。

它具有全文搜索、排名、排除和包含某些文件类型等所有基本功能,您还可以通过 html 页面中的元标记添加自己的元信息。

做一个谷歌,你会发现吨!

于 2008-08-29T17:30:59.743 回答
0

这与您的问题有些正交,但我强烈推荐 RESTful 搜索的想法。也就是说,为了执行从未执行过的搜索,网站将查询发布到 /searches/。要重新运行搜索,网站 GETs /searches/{some id}

可以找到一些关于此的好文档,例如这里

(也就是说,我喜欢尽可能地建立索引,尽管它是一种优化,因此可能为时过早。)

于 2008-08-29T14:59:47.047 回答
-2

如果您的应用程序使用 Java EE 堆栈并且您正在使用Hibernate,则可以使用Compass 框架维护数据库的可搜索索引。Compass 框架在底层使用了Lucene

唯一的问题是您无法复制搜索索引。因此,您需要使用集群数据库来保存索引表或使用已添加到 Compass Framework 2.x 中的更新的基于网格的索引存储机制。

于 2008-08-29T17:23:23.940 回答