我正在建设一个Django网站,我正在寻找一个搜索引擎。

一些候选人:

Lucene/Lucene with Compass/Solr 斯芬克斯 Postgresql内置全文搜索 MySQl内置全文搜索

选择标准:

结果相关性和排名 搜索和索引速度 易于使用,易于与Django集成 资源需求——站点将托管在VPS上,所以理想情况下搜索引擎不需要大量的RAM和CPU 可伸缩性 额外的功能,如“你的意思是?”,相关搜索等

任何使用过上述搜索引擎或其他不在列表中的引擎的人——我很想听听你的意见。

编辑:至于索引需求,由于用户不断地向站点输入数据,这些数据将需要不断地进行索引。它不必是实时的,但理想情况下,新数据在索引中显示的延迟不超过15 - 30分钟


当前回答

我们刚刚从Elasticsearch切换到Postgres Full Text。因为我们已经使用了Postgres,所以我们现在省去了保持索引更新的麻烦。 但这只影响全文搜索。然而,在某些用例中,Elasicsearch明显更好。也许是面或类似的东西。

其他回答

SearchTools-Avi说:“MySQL文本搜索,它甚至不能索引三个字母或更少的单词。”

从MySQL 5.0开始,MySQL全文的最小字长是可调的。谷歌'mysql全文最小长度'简单的指令。

也就是说,MySQL全文文本有局限性:首先,一旦你达到一百万左右的记录,它就会变得很慢,……

我不了解Sphinx,但是对于Lucene和数据库全文搜索,我认为Lucene的性能是无与伦比的。只要你正确地设置了Lucene索引,无论你要搜索多少条记录,你都应该能够在10毫秒内完成几乎所有的搜索。

最大的障碍来了:就我个人而言,我认为在你的项目中集成Lucene并不容易。当然,设置它并不难,这样你就可以做一些基本的搜索,但如果你想充分利用它,获得最佳性能,那么你绝对需要一本关于Lucene的好书。

至于CPU和内存的需求,在Lucene中执行搜索并不会给CPU带来太多的任务,尽管索引你的数据是,尽管你不经常这样做(可能一天一次或两次),所以这不是一个很大的障碍。

它不能回答你所有的问题,但简而言之,如果你有大量的数据要搜索,并且你想要出色的性能,那么我认为Lucene绝对是一条出路。如果你没有那么多的数据要搜索,那么你也可以使用数据库全文搜索。在我的书中,设置MySQL全文搜索绝对更容易。

这是我对这个老问题的看法。我强烈推荐你看看ElasticSearch。

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式的、支持多租户的全文搜索引擎,具有RESTful web界面和无模式的JSON文档。Elasticsearch是用Java开发的,在Apache许可证的条款下作为开源发布。

相对于其他FTS(全文搜索)引擎的优势是:

rest式接口 更好的可伸缩性 大型社区 由Lucene构建 开发人员 丰富的文档 有很多开放源码库可用(包括Django)

我们在我们的项目中使用这个搜索引擎,并且非常满意。

我们刚刚从Elasticsearch切换到Postgres Full Text。因为我们已经使用了Postgres,所以我们现在省去了保持索引更新的麻烦。 但这只影响全文搜索。然而,在某些用例中,Elasicsearch明显更好。也许是面或类似的东西。

我很惊讶没有更多关于Solr的信息。Solr与Sphinx非常相似,但具有更高级的功能(我没有使用过Sphinx,只是阅读过它)。

下面链接的答案详细介绍了一些关于Sphinx的事情,这也适用于Solr。 全文搜索引擎的比较- Lucene, Sphinx, Postgresql, MySQL?

Solr还提供了以下附加特性:

Supports replication Multiple cores (think of these as separate databases with their own configuration and own indexes) Boolean searches Highlighting of keywords (fairly easy to do in application code if you have regex-fu; however, why not let a specialized tool do a better job for you) Update index via XML or delimited file Communicate with the search server via HTTP (it can even return Json, Native PHP/Ruby/Python) PDF, Word document indexing Dynamic fields Facets Aggregate fields Stop words, synonyms, etc. More Like this... Index directly from the database with custom queries Auto-suggest Cache Autowarming Fast indexing (compare to MySQL full-text search indexing times) -- Lucene uses a binary inverted index format. Boosting (custom rules for increasing relevance of a particular keyword or phrase, etc.) Fielded searches (if a search user knows the field he/she wants to search, they narrow down their search by typing the field, then the value, and ONLY that field is searched rather than everything -- much better user experience)

顺便说一下,还有很多功能;但是,我只列出了在生产中实际使用的特性。顺便说一句,MySQL支持上述列表中的#1、#3和#11(有限)。对于您正在寻找的特性,关系数据库并不能满足您的需求。我会马上消除这些。

另外,Solr(实际上是Lucene)是一个文档数据库(例如NoSQL),因此任何其他文档数据库的许多优点都可以通过Solr实现。换句话说,您可以将它用于不仅仅是搜索(即性能)。要有创意:)