Sphinx 搜索/Sphinx 的不同之处
Sphinx 与你习惯的 MySQL 查询略有不同。所以不要指望立刻就能理解它。
Sphinx 从 MySQL 数据库中的表中检索数据,并对其进行称为索引的过程。索引创建了一个文件,该文件可以被 Sphinx 轻松搜索。例如,如果你尝试在 Microsoft Word 中搜索一个文档,它将逐个单词地在文档文本中搜索。在非常大的文档中,搜索速度可能会明显变慢。另一方面,Sphinx 在任何搜索发生之前都会进行索引。这将创建一个索引,可以高效地搜索,而不是逐个单词地搜索整个文档。一个很好的例子是百科全书的索引。如果我想找到一些关于猫的信息,我可以像 Microsoft Word 一样,阅读百科全书的每一页,寻找 "cat" 这个词的出现。或者,我可以查阅最后的索引,在 "cat" 下,发现第 104、195 和 653 页。方便多了。
你需要记住的是,SPHINX 只能搜索索引中的内容!这意味着每当你想要搜索最新的结果时,你必须更新索引。所以,如果你正在撰写一篇关于猫的文章,并且对文章表进行了索引,然后又写了一篇关于鸡的文章,并进行搜索,它会找到你的猫的文章,但它会把鸡的文章当作不存在一样对待。
如果你要从本节中记住一件事,那就是SPHINX 只能搜索索引中的内容!
如果你使用 PHP 与 MySQL,这对你来说会容易得多。否则,你可能应该考虑学习 PHP 和 MySQL(或者任何语言和 MySQL)。Tigzag 和 W3Schools 上有很棒的教程。
你需要记住关于 Sphinx 的关键一点是,它通常不会检索数据。它主要检索文档 ID,所以你可能想知道Sphinx 到底有什么用呢?搜索。Sphinx 执行密集的任务,即搜索特定的记录。然后,你可以通过 MySQL 完成简单的部分,即检索该文档。例如,如果 Sphinx 从索引中提取出文档 ID 1、5 和 7,你需要在 MySQL 中执行一个查询来检索记录(可能具有 1、5 和 7 的 ID)。你可能会认为这很愚蠢,但与搜索单词相比,MySQL 搜索文档 ID 消耗的资源非常少。
以下是一个例子。假设 Sphinx 提取了 ID 为 1、5、7 的文档。你会执行
SELECT * FROM documents WHERE id IN (1,5,7)
你正在告诉 MySQL 从文档表(或结果所在的任何表)中选择所有列,其中 ID(或你对 ID 字段的命名)是 1、5 或 7 之一。然后,你可以在 PHP 中使用 mysql_fetch_array 来查看数据并对它执行任何操作。
一旦你学会了如何使用 Sphinx 对结果进行排序,你就可以通过以下方法保留排序结果
- 将结果的顺序存储在一个数组中(只需存储匹配项的 ID 属性)
- 对数组执行 IMPLODE 操作,使用 $result = implode(", ", $array),其中 $array 是你的结果数组,result 将存储用逗号空格分隔的结果 ID 的字符串。
SELECT * FROM documents WHERE id IN ($result) ORDER BY FIELD(id,$result)
在这里,我们正在告诉 MySQL 按我们在 $result 中指定的顺序,按照 ID 字段对结果进行排序。
这似乎有很多工作要做,但你很快就会习惯的,最终你会编写函数来为你处理所有这些。别担心,这绝对是值得的!!!