题
我想为一个网站实现搜索功能(假设它与SO类似)。我不想用谷歌搜索类似的东西。
我的问题是:
我该如何实施?
我知道有两种方法:
- 当用户提出查询时,搜索应用程序中的所有数据库。
- 索引我拥有的所有数据并将其存储在其他地方并从那里查询(就像谷歌所做的那样)。
谁能告诉我该走哪条路?优缺点都有什么?
更好,有没有更好的方法来做到这一点?
解决方案
使用Lucene,
http://lucene.apache.org/java/docs/
Apache Lucene 是一个完全用 Java 编写的高性能、功能齐全的文本搜索引擎库。该技术几乎适用于任何需要全文搜索的应用程序,尤其是跨平台的应用程序。
它可以在 java 和 .net 中使用。它也以 zend 框架模块的形式在 php 中提供。
Lucene 会做你想要的事情(对搜索项建立索引),你必须跟踪 lucene 索引,但就性能而言,它比数据库搜索要好得多。顺便说一句,SO 搜索由 lucene 提供支持。:D
其他提示
这取决于您的网站的综合程度以及您想自己做的程度。
如果你正在运行一个 小网站 如果没有进一步添加自定义搜索的可能性,让谷歌来做这项工作(也许添加一个 站点地图)并使用 谷歌自定义搜索.
如果你运行一个 中等站点 使用 sql 引擎 使用 sql 引擎的搜索功能。
如果你运行一些 更重的软件堆栈 像 J2EE 或 .Net 使用 卢塞恩, ,一个伟大而强大的搜索引擎或其 .Net 克隆 lucene.Net
如果你想 从您的应用程序中抽象您的搜索 并能够使用 XML/HTTP 和 JSON API 以语言中立的方式查询它,看看 索尔. 。Solr 在后台运行 lucene,但为其添加了一个漂亮的 Web 界面。
解决此问题的最佳方法取决于您构建页面的方式。
如果它们经常由许多不同的记录组成(正如我想象的堆栈溢出页面一样),那么索引方法可能会给出更好的结果,除非您投入大量工作来有效地重建数据库端的页面。
索引方法的缺点是周转时间。有一些解决方法(比如谷歌的站点地图之类的东西),但它们也很复杂。
如果您使用数据库路径,还要注意,现代搜索引擎系统如果有链接数据要处理,则功能会更好,因此找到一个可以理解数据库中“页面”之间链接的系统将产生积极的效果。
如果您使用的是 Microsoft 平台,则可以使用索引服务。这可以非常轻松地与 IIS 网站集成。
它具有全文搜索、排名、排除和包含某些文件类型等所有基本功能,您还可以通过 html 页面中的元标记添加自己的元信息。
谷歌一下,你会发现很多!
这与您的问题有些正交,但我强烈推荐 RESTful 搜索的想法。也就是说,要执行从未执行过的搜索,网站会将查询发布到 /searches/。要重新运行搜索,网站 GETs /searches/{some id}
有一些关于此的好文档,例如 这里.
(也就是说,我喜欢尽可能建立索引,尽管这是一种优化,因此可能为时过早。)