5

我正在研究 django 的全文搜索引擎。它必须安装简单,快速索引,快速索引更新,索引时不阻塞,快速搜索。

在阅读了许多网页之后,我列出了简短的列表:Mysql MYISAM fulltext、djapian/python-xapian 和 django-sphinx 我没有选择 lucene,因为它看起来很复杂,也没有选择 haystack,因为它的功能比 djapian/django-spĥinx 少(像字段加权)。

然后我做了一些基准测试,为此,我在网上收集了许多免费书籍,生成了一个包含 1 485 000 条记录(id、title、body)的数据库表,每条记录大约 600 字节长。从数据库中,我还生成了一个包含 100 000 个现有单词的列表,并将它们打乱以创建一个搜索列表。对于测试,我在我的笔记本电脑上运行了 2 次(4Go RAM,双核 2.0Ghz):第一次,在服务器重新启动以清除所有缓存后,第二次在之后完成,以测试缓存结果有多好. 以下是“自制”基准测试结果:

1485000 records with Title (150 bytes) and body (450 bytes)

Mysql 5.0.75/Ubuntu 9.04 Fulltext :
==========================================================================

Full indexing : 7m14.146s

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:11.553524
next run : 0:00:00.168508

Mysql 5.5.4 m3/Ubuntu 9.04 Fulltext :
==========================================================================

Full indexing : 6m08.154s

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:09.553524
next run : 0:00:20.316903

1 thread, 100000 searchs with single word randomly taken from database : 
First run : 9m09s
next run : 5m38s

1 thread, 10000 random strings (random strings should not be found in database) :
just after the 100000 search test : 0:00:15.007353

1 thread, boolean search : 1000 x (+word1 +word2) 
First run : 0:00:21.205404
next run : 0:00:00.145098

Djapian Fulltext : 
==========================================================================

Full indexing : 84m7.601s

1 thread, 1000 searchs with single word randomly taken from database with prefetch : 
First run : 0:02:28.085680
next run : 0:00:14.300236

python-xapian Fulltext :
==========================================================================

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:26.402084
next run : 0:00:00.695092

django-sphinx Fulltext :
==========================================================================

Full indexing : 1m25.957s

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:30.073001
next run : 0:00:05.203294

1 thread, 100000 searchs with single word randomly taken from database : 
First run : 12m48s
next run : 9m45s

1 thread, 10000 random strings (random strings should not be found in database) :
just after the 100000 search test : 0:00:23.535319

1 thread, boolean search : 1000 x (word1 word2) 
First run : 0:00:20.856486
next run : 0:00:03.005416

如您所见,Mysql 对于全文搜索来说并没有那么糟糕。此外,它的查询缓存非常高效。

Mysql 对我来说似乎是一个不错的选择,因为无需安装任何东西(我只需要编写一个小脚本来将 Innodb 生产表同步到 MyISAM 搜索表),而且我真的不需要像词干提取等高级搜索功能......

这是一个问题:您如何看待 Mysql 全文搜索引擎与 sphinx 和 xapian?

4

3 回答 3

4

我还没有测试过 Xapian,但我去年做了一个比较全文解决方案的演示: http ://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

Sphinx 是搜索速度最快的。但是很难为增量输入的数据建立索引,因为将数据添加到索引与从头开始创建整个索引一样昂贵。

所以有些人维护了两个 Sphinx 索引:一个是存档数据的大索引,一个是最近数据的小索引。他们定期(例如每周)将最近的索引合并到归档索引中(合并两个索引成本更低),并截断小索引以准备新的一周。这对于论坛之类的东西非常有用,但对于 wiki 则没有那么好。

您还可以查看Apache Solr。这是 Lucene 的包装器,它使 Lucene 的使用变得更加容易,而且功能也更加丰富。当我设计那个演示文稿时,我不知道 Solr。

华盛顿时报是一个使用 Solr 和 Django 的项目示例:

于 2010-05-05T21:52:14.210 回答
2

如果您可以使用 MyISAM 的全文,那就太好了。将它内置到数据库中当然很方便,因此您可以轻松且相对有效地执行与其他表的连接的搜索。布尔模式搜索很棒。

缺点是它在匹配单词方面非常初级。显然没有词干,也没有对连字符/撇号进行特殊处理,并且默认的最小字长和停止列表过于残酷。(当软件认为“howbeit”是一个常用词时,请担心!)

最糟糕的是:当然它是讨厌的旧 MyISAM 独有的,所以它不会很好地放在你的 InnoDB 表中。(您使用的是InnoDB,对吗?)

于 2010-05-05T22:07:32.240 回答
1

您还可以考虑SphinxQL,它结合了 MySQL 全文功能的易用性和 Sphinx 的强大和灵活性。

安装说明在这里

于 2010-05-06T12:42:12.017 回答