gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:46:50 25 4
gpt4 key购买 nike

谁能用简单的话解释一下像 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 中它就像一个哈希表,其中键是使用 crc32(word) 计算的 32 位整数,值是包含该单词的 documentID 列表。

这使它 super 快。

现在您可以争辩说,即使是数据库也可以创建类似的结构来使搜索变得超快。然而,最大的不同是 Sphinx/Lucene/Solr 索引就像一个单表数据库,不支持任何关系查询 (JOIN) [来自 MySQL 性能博客]。请记住,索引通常仅用于支持搜索,而不是数据的主要来源。因此,您的数据库可能处于“第三范式”,但索引将完全被反规范化,并且主要包含需要搜索的数据。

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

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

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

关于sql - 像 Sphinx 这样的全文搜索服务器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10295280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com