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包装器.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...