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

任何人都可以用简单的话解释如何使用 Sphinx这样的全文服务器?在纯sql中,可以使用这样的SQL查询搜索文本中的某些关键字:
select * from items where name like '%keyword%';

但是在各种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)

它可以用简单的话说明这些查询是如何工作的以及它们是如何生成的?

解决方法

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

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

这使得它超快.

现在你可以争辩说,即使是数据库也可以创建一个类似的结构,使搜索更加快速.但最大的区别是,Sphinx / Lucene / Solr索引就像一个单表数据库,不需要关系查询(JOIN)[从MysqL性能博客]的支持.请记住,索引通常只在于支持搜索,而不是数据的主要来源.因此,您的数据库可能处于“第三种正常形式”,但是索引将被完全解除归一化,并且主要仅包含要搜索的数据.

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

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

编辑:还可以查看cpp文件的源代码,如searchd.cpp等,用于真正的内部实现,我想你只是看到了PHP包装器.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03