像Sphinx这样的全文搜索服务器如何工作?

0x4*_*672 19 sql full-text-search sphinx search-engine thinking-sphinx

任何人都可以用简单的语言解释像Sphinx这样的全文服务器是如何工作的?在纯SQL中,可以使用这样的SQL查询来搜索文本中的某些关键字:

select * from items where name like '%keyword%';
Run Code Online (Sandbox Code Playgroud)

但是在各种Sphinx插件生成的配置文件中,我根本看不到任何类似的查询.它们包含如下所示的SQL语句,它们似乎将搜索划分为不同的ID组:

SELECT (items.id * 5 + 1) AS id, ... 
       WHERE items.id >= $start AND items.id <= $end 
       GROUP BY items.id
..
SELECT * FROM items WHERE items.id = (($id - 1) / 5)
Run Code Online (Sandbox Code Playgroud)

它可以用简单的词语解释这些查询是如何工作的以及它们是如何生成的?

Yav*_*var 17

倒置索引是您的问题的答案:http://en.wikipedia.org/wiki/Inverted_index

现在当你通过sphinx运行sql查询时,它从数据库中获取数据并构造反向索引,它在Sphinx中就像一个哈希表,其中键是32位整数,使用crc32(word)计算,值为具有该词的documentID列表.

这使它超级快.

现在你可以争辩说,即使是数据库也可以创建一个类似的结构,使搜索超高速.然而,最大的区别是Sphinx/Lucene/Solr索引就像单表数据库,不支持关系查询(JOIN)[来自​​MySQL性能博客].请记住,索引通常只支持搜索,而不是数据的主要来源.因此,您的数据库可能处于"第三范式",但索引将完全取消规范化,并且主要包含需要搜索的数据.

另一个可能的原因是数据库通常存在内部碎片,他们需要在巨大的请求上执行太多的半随机I/O任务.

这意味着,例如,考虑到数据库的索引体系结构,查询会导致索引进而导致数据.如果要恢复的数据广泛传播,结果将花费很长时间,这似乎是数据库中发生的事情.

编辑:另外请参阅cpp文件中的源代码,如searchd.cpp等真正的内部实现,我想你只是看到了PHP包装器.