如何在网站中实现搜索功能?[关闭]


69

我想为网站实现搜索功能(假设它类似于SO)。我不想使用Google搜索类似的内容。

我的问题是:

我该如何实施?

我知道两种方法:

  1. 用户进行查询时,搜索应用程序中的所有数据库。
  2. 为我拥有的所有数据建立索引,并将其存储在其他位置,然后从那里查询(例如Google所做的事情)。

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

更好,有更好的方法吗?


1
惊讶地看到这个受欢迎的问题结束了。现在是2020年,我认为这个问题值得重新讨论。大多数答案都建议使用Lucene,但我建议您查看Typesense:github.com/typesense/typesense。它是一个轻巧且易于使用的搜索引擎。对于像日志这样的海量数据集,有ElasticSearch:elastic.co
ErJab

Answers:


39

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

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

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

Lucene完成了您想要的工作(为搜索到的项目建立索引),您必须跟踪Lucene索引,但是就性能而言,它比进行数据库搜索要好得多。顺便说一句,SO搜索由Lucene提供支持。:D


如果您正在考虑Lucene,那么您应该真正考虑一下Solr项目。将其视为Lucene服务
sclarson

35

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

如果您经营的是一个小型网站,没有进一步添加自定义搜索的可能性,请让google完成工作(也许添加站点地图),然后使用google自定义搜索

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

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

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


3
我对此有疑问。我可以对Intranet网站实施Google自定义搜索吗?如果这样做,会使我的公司面临风险吗?我宁愿不写自己的逻辑。
Richie 2014年

谷歌自定义搜索已被杀死顺便说一句。我认为Microsoft可以使用Bing。
demaniak '18年


1

解决此问题的最佳方法取决于您如何构造页面。

如果它们经常由许多不同的记录组成(如我想象的堆栈溢出页面),那么除非您进行大量工作来有效地重建数据库侧的页面,否则索引方法可能会产生更好的结果。

索引方法的缺点是周转时间。有一些变通办法(例如Google的站点地图之类的东西),但变通也很复杂。

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


1

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

它具有所有基本功能,例如全文搜索,排名,排除并包括某些文件类型,您还可以通过html页面中的meta标签添加自己的meta信息。

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


0

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

与此相关的一些很好的文档,例如在这里

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


-2

如果您的应用程序使用Java EE堆栈,而您正在使用Hibernate,则可以使用Compass Framework维护数据库的可搜索索引。Compass Framework在后台使用Lucene

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.