- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在研究 django 的全文搜索引擎。它必须安装简单,快速索引,快速索引更新,索引时不阻塞,快速搜索。
在阅读了很多网页之后,我列出了一个简短的列表:Mysql MYISAM 全文、djapian/python-xapian 和 django-sphinx我没有选择 lucene,因为它看起来很复杂,也没有选择 haystack,因为它的功能比 djapian/django-spĥinx 少(比如字段加权)。
然后我做了一些基准测试,为了这样做,我在网上收集了许多免费书籍来生成一个包含 1 485 000 条记录(id、标题、正文)的数据库表,每条记录大约 600 字节长。从数据库中,我还生成了一个包含 100 000 个现有单词的列表,并将它们打乱以创建一个搜索列表。对于测试,我在我的笔记本电脑(4Go RAM,双核 2.0Ghz)上运行了 2 次:第一次,在服务器重新启动以清除所有缓存之后,第二次是为了测试缓存结果的好坏。 .以下是“自制”基准测试结果:
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 全文搜索引擎 vs sphinx 和 xapian?
最佳答案
我没有测试过 Xapian,但我去年做了一个比较全文解决方案的演示: http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql
Sphinx 的搜索速度最快。但是很难为增量输入的数据编制索引,因为将数据添加到索引的成本与从头开始创建整个索引的成本差不多。
所以有人维护两个 Sphinx 索引:一个大索引是存档数据,一个小索引是最近数据。他们定期(例如每周)将最近的索引合并到存档索引中(合并两个索引的成本更低),并截断小索引以为新的一周做准备。这对于论坛之类的东西非常有用,但对于 wiki 就没那么好了。
您还可以查看 Apache Solr .这是 Lucene 的包装器,它使 Lucene 的使用变得更加容易且功能更加强大。我在设计该演示文稿时并不知道 Solr。
华盛顿时报是一个将 Solr 与 Django 结合使用的项目示例:
关于mysql - 全文搜索 django : Mysql not so bad ?(对比 sphinx、xapian),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776793/
有没有办法对 Subversion 存储库执行全文搜索,包括所有历史记录? 例如,我编写了一个在某处使用过的功能,但后来不需要它,所以我对文件进行了 svn rm'd,但现在我需要再次找到它以将其用于
如何进行 MySQL 搜索,既匹配部分单词,又提供准确的相关性排序? SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS rel
我在 postgresql 中创建了一个用于全文搜索的索引。 CREATE INDEX pesquisa_idx ON chamado USING gin(to_tsvector('portugues
我已经设置了一个数据库并启用了全文搜索,当我使用以下内容搜索数据库时,数据库中有一些条目包含“测试”一词,还有一个条目包含“测试更多”: SELECT keywords, title FROM dat
我想知道是否可以进行 MATCH() AGAINST()(全文)搜索,使得不直接相邻的单词需要按特定顺序排列?在我的网站上,当用户在双引号之间键入单词时,搜索将仅显示具有特定顺序的这些单词的结果。例如
我有一个 80,000 行的数据库,当我测试一些 FULLTEXT 查询时,我遇到了一个意想不到的结果。我已从 MYSQL 中删除停用词并将最小字长设置为 3。 当我执行此查询时: SELECT `s
我刚刚在我的 MYSQL 数据库中发现了一堆流氓数据... 到达它的唯一方法是通过其中一列 - FILE_PATH,其中包含文件路径的斜杠剥离版本。我需要在这组文件中找到一些恶意文件——它们的文件名都
我正在为我的站点构建一个小的搜索功能。我正在接受用户的查询,提取关键字,然后针对提取的关键字运行全文 MySQL 搜索。 问题在于 MySQL 将词干视为文字。这是正在发生的过程: 用户搜索“棒球”之
这是一个关于使用(关系)数据库设计全文搜索的系统架构问题。我使用的具体软件是 Solr 和 PostgreSQL,仅供引用。 假设我们正在构建一个有两个用户 Andy 和 Betty 的论坛 -- P
当元素数组中的数组包含应与我的搜索匹配的文本时,我无法检索文档。 这里有两个示例文档: { _id: ..., 'foo': [ { 'name
我正在使用这个查询,但不幸的是它运行缓慢: SELECT *, (MATCH(`title`) AGAINST ('$word' IN BOOLEAN MODE) * 2 + MATC
我正在构建一个非常简单的产品目录,它将在 mysql 表中存储产品,我想尽快搜索产品(并尽可能相关)。产品数据库将非常大(大约 500.000 个产品),这就是为什么使用“like”而不使用索引的搜索
select count(distinct email_address) from users WHERE MATCH (email_address) AGAINST ('@r
我正在尝试在 mySQL 中进行简单的全文搜索,但在复数方面遇到一些问题。 我确实相信我符合50% 规则。 我不认为我使用了停用词。 我正在运行这样的查询: SELECT * FROM product
我在 innoDB 数据库中使用全文搜索时遇到了一个大问题。 首先,ns_pages 表有超过 2.6m 的记录,全文索引有 3 个键 block 。 该数据库在具有 128GB RAM 的 Dell
我有一个城市和州的数据库(大约 43,000 个)。我对其进行全文搜索,如下所示: select city, state, match(city, state_short, state) agains
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
如果我搜索单词hello,那么我没有匹配到,而我搜索单词hella,那么我得到了匹配。同样的情况也发生在“Non”这个词上。我在 Mac 上的 MAMP 和 sqlfiddle.com 上进行了测试,
所以我有一个简单的场景。我有一张 field 表(事件 field 等)。我的查询看起来像: SELECT * FROM venues WHERE venues.name % 'Philips Are
我有一个表,其中有视频数据,如“标题”、“描述”等。我正在尝试使用 MySQL 全文索引编写一个搜索引擎。 SQL 查询适用于某些单词,但不是每个单词。这是我的 SQL 查询; SELECT * FR
我是一名优秀的程序员,十分优秀!