如何在网站中实现searchfunction?

我想为网站实现searchfunction(假设它与SO相似)。 我不想使用谷歌search这样的东西。

我的问题是:

我如何实现这个?

有两种方法我知道:

  1. 当用户提供查询时,search应用程序中的所有数据库。
  2. 索引我所有的数据,并将其存储在其他地方,并从那里查询(如Google所做的)。

任何人都可以告诉我要走哪条路? 优缺点都有什么?

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

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

Apache Lucene是一个高性能,全function的文本search引擎库,完全用Java编写。 它几乎适用于任何需要全文search的应用程序,特别是跨平台的应用程序。

它在java和.net中可用。 它也在PHP中以zend框架模块的forms提供。

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

这取决于你的网站有多全面,你想做多less。

如果你正在运行一个小型网站,而没有更多的可能性来添加自定义search,让谷歌做的工作(也许添加一个网站地图 ),并使用谷歌自定义search 。

如果您运行一个中型网站与SQL引擎使用您的SQL引擎的searchfunction。

如果你运行一些比较笨重的软件栈,如J2EE或.Net,使用Lucene ,一个强大的search引擎或者它的.net clone lucene.Net

如果您想从您的应用程序中抽象出您的search结果,并且能够使用XML / HTTP和JSON API以语言中立的方式查询它,请查看solr 。 Solr在后台运行lucene,但增加了一个漂亮的网页界面。

你可能想看看Xapian和欧米茄的前端。 它本质上是一个可以build立searchfunction的工具包。

解决这个问题的最好方法将取决于你如何构build你的页面。

如果他们经常是由许多不同的logging组成(如我想象的堆栈溢出页面),索引方法可能会带来更好的结果,除非您在数据库方面有效地重构页面做了大量的工作。

索引方法的缺点是转换时间。 有解决方法(如谷歌的网站地图的东西),但他们也很复杂得到正确的。

如果使用数据库path,也应该意识到,如果现代search引擎系统有链接数据进行处理,它的function要好得多,因此find一个能够理解数据库中“页面”之间链接的系统将会产生积极的效果。

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

它具有全文search,排名,扩展和包含某些文件types等所有基本function,您也可以通过元标记在html页面中添加自己的元信息。

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

这与你的问题有点正交,但我强烈build议使用RESTfulsearch。 也就是说,为了执行从未执行的search,网站将查询发布到/search/。 要重新运行search,网站GETs / searches / {some id}

这里有一些很好的文档可以find,例如这里 。

(也就是说,我喜欢在可能的情况下进行索引,尽pipe这是一个优化,因此可能为时过早。)

如果您的应用程序使用Java EE堆栈并使用Hibernate ,则可以使用Compass Framework维护数据库的可search索引。 指南针框架在底层使用Lucene 。

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