我想为网站实现搜索功能(假设它类似于SO)。我不想使用谷歌搜索这样的东西。
我的问题是:
我该如何实现?
我知道有两种方法:
谁能告诉我哪条路?有什么优点和缺点?
更好,有没有更好的方法来做到这一点?
答案 0 :(得分:34)
使用lucene,
http://lucene.apache.org/java/docs/
Apache Lucene是一个完全用Java编写的高性能,功能齐全的文本搜索引擎库。它是一种适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台搜索。
它在java和.net中可用。它也可以在php中以zend框架模块的形式提供。
Lucene做你想要的(搜索项目的索引),你必须跟踪lucene索引,但它比在性能方面做数据库搜索要好得多。 BTW,SO搜索由lucene提供支持。 :d
答案 1 :(得分:33)
这取决于您的网站的综合程度以及您想要自己做多少。
如果您正在运行小型网站,而无法再添加自定义搜索,请让Google执行此项工作(可能会添加sitemap)并使用google custom search。
如果使用sql引擎运行中型站点,请使用sql引擎的搜索功能。
如果您运行某些较重的软件堆栈,如J2EE或.Net,请使用Lucene,一个功能强大的强大搜索引擎或其.Net克隆lucene.Net
如果您想从应用程序中抽象搜索并能够使用XML / HTTP和JSON API以语言中立的方式查询,请查看solr。 Solr在后台运行lucene,但为它添加了一个不错的Web界面。
答案 2 :(得分:4)
答案 3 :(得分:1)
解决此问题的最佳方法取决于您构建网页的方式。
如果它们经常由许多不同的记录组成(正如我想象的那样堆栈溢出页面),索引方法可能会给出更好的结果,除非你在数据库端有效地重建页面需要做大量工作
索引方法的缺点是周转时间。有一些解决方法(比如谷歌的站点地图的东西),但它们也很复杂。
如果你使用数据库路径,也要注意现代搜索引擎系统如果有要处理的链接数据则功能要好得多,因此找到一个能够理解数据库中“页面”之间链接的系统将产生积极的影响。
答案 4 :(得分:1)
如果您使用的是Microsoft平台,则可以使用索引服务。这非常容易与IIS网站集成。
它具有全文搜索,排名,exlcude等所有基本功能,并包含某些文件类型,您还可以通过html页面中的元标记添加自己的元信息。
做谷歌,你会发现吨!
答案 5 :(得分:0)
这与您的问题有点正交,但我强烈建议使用RESTful搜索。也就是说,为了执行从未执行过的搜索,网站将查询发布到/ searching /。要重新搜索,网站会获取/搜索/ {some id}
有一些很好的文件可以找到,例如here。
(也就是说,我喜欢在可能的情况下进行索引,尽管这是一种优化,因此可能为时过早。)
答案 6 :(得分:-2)
如果您的应用程序使用Java EE堆栈而您正在使用Hibernate,则可以使用Compass Framework维护数据库的可搜索索引。指南针框架使用了Lucene。
唯一的问题是您无法复制搜索索引。因此,您需要使用集群数据库来保存索引表或使用已添加到Compass Framework 2.x的较新的基于网格的索引存储机制。