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

一些候选人:

  • Lucene/带指南针的Lucene/Solr

  • 斯芬克斯

  • Postgresql内置全文搜索

  • MySQl内置全文搜索

Select 标准:

  • 结果相关性和排名
  • 搜索和索引速度
  • 易于使用,易于与Django集成
  • 资源要求-网站将托管在VPS上,因此理想情况下搜索引擎不需要太多RAM和CPU
  • 可扩展性
  • 额外的功能,比如"你的意思是什么?",相关搜索等

任何有过以上搜索引擎经验的人,或者其他不在列表中的引擎——我很想听听你的意见.

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

推荐答案

很高兴看到有人插话谈论Lucene,因为我对此一无所知.

斯芬克斯,另一方面,我很清楚,所以让我们看看我是否能帮上忙.

  • 结果相关性排名是默认值.您可以根据需要设置自己的排序,并为特定字段赋予更高的权重.
  • 索引速度非常快,因为它直接与数据库对话.任何缓慢都将来自复杂的SQL查询、未索引的外键和其他此类问题.我也从来没有注意到任何搜索的缓慢.
  • 我是Rails的人,所以我不知道用Django实现有多容易.不过Sphinx源代码附带了一个Python API.
  • 搜索服务守护进程(searchd)的内存使用率非常低,您也可以对indexer进程使用的how much memory个内存设置限制.
  • 我对可伸缩性的了解更为粗略,但将索引文件复制到多台机器并运行多个searchd守护进程非常简单.不过,我从其他人那里得到的总体印象是,它在高负载下非常好,所以跨多台机器扩展它并不是需要处理的事情.
  • 没有对"你的意思是什么"等的支持——尽管这些可以用其他工具轻松完成.Sphinx确实使用字典来词干,所以"driving"和"drive"(例如)在搜索中被认为是相同的.
  • Sphinx不允许对字段数据进行部分索引更新.常用的方法是保持一个包含最近所有更改的增量索引,并在每次更改后重新索引(这些新结果会在一两秒钟内出现).由于数据量较小,这可能需要几秒钟的时间.不过,您仍然需要定期对主数据集重新编制索引(尽管频率取决于数据的波动性——每天?每小时?).不过,快速的索引速度让这一切都非常轻松.

我不知道这对你的情况有多适用,但是Evan Weaver compared a few of the common Rails search options(Sphinx、Ferret(Ruby的Lucene端口)和Solr)运行了一些基准测试.我想可能有用.

我还没有深入研究过MySQL的全文搜索,但我知道它在速度和功能方面都无法与Sphinx、Lucene或Solr相媲美.

Mysql相关问答推荐

在SQL中,为什么:=即使条件为False,也会在case声明中执行?我如何修复这个问题?

一次又一次地删除事件行

无法删除或更新父行:外键约束无法删除表

为分组记录MySQL取取值为TRUE的单行

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

计算同一个表中的两列,然后将两者都算作总数

如何将数据导入MySQL中的master/replica struct

完全匹配 IN 子句中的所有值

MySQL:根据条件查找某些用户的行位置

最后一个字母 '%n' 的 mysql SELECT 字符串不起作用

在 Spring Data jpa 中的 @Query 中无法识别本机查询

创建表时我的 SQL 语句有什么问题

在分组结果 MySQL 5.7 版中获取最多的重复值

查找同时玩过这两种游戏的玩家

使用带有 ELSEIF 和 ELSE 的 3 列更新问题

MySQLi count(*) 总是返回 1

如何在mysql select查询中获取两个日期之间的日期列表

从mysql中的大表中快速 Select 随机行

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

在 MySQL Workbench 中导出超过 1000 条记录的查询结果