搜索多种内容类型

Posted

技术标签:

【中文标题】搜索多种内容类型【英文标题】:Searching Multiple Content Types 【发布时间】:2012-08-13 04:51:57 【问题描述】:

这是我一直在努力解决的一个问题的概括。我的情况是我有一个 WordPress 网站,其中包含多种“帖子类型”(例如文章、博客文章、产品等)。按照现在的惯例,我想在不同的类别中显示每种帖子类型的搜索结果。

我遇到的问题是构建搜索。我应该为每种帖子类型运行一个单独的数据库查询,还是应该运行一个大查询并通过 php 将所有内容分开?我倾向于倾向于后者,但我遇到的问题是分页。我可能不必在查询中设置任何LIMIT,因为如果我有来自一种帖子类型的多个匹配项,则搜索不会返回来自其他帖子类型的任何结果。

那么,从性能和一般最佳实践的角度来看,最好是在没有LIMIT 子句的情况下使用一个大查询,还是为每次搜索运行多个查询?

注意:这类似于我不久前在 WordPress Stack Exchange 网站上询问过的a question。我当时接受了多查询解决方案,但我仍然对此不太确定。

【问题讨论】:

为什么不是多查询解决方案?从用户的角度来看更好:我不想在只搜索一种数据时支付大搜索的成本。从代码的角度来看它更好,因为独立地发展这样的搜索更容易。它更清洁、更轻。 如果用户愿意,我肯定会允许用户将搜索范围缩小到特定的内容类型,在这种情况下,我肯定会在数据库中进行过滤。在这个问题中,我关注的是用户没有指定内容类型的情况。我不确定运行通过 PHP 过滤的大型搜索或几个较小的搜索是否会花费更多。这有意义吗? 【参考方案1】:

根据我的经验,通常最好让数据库做尽可能少的工作,而让 PHP 来做大部分繁重的工作。它通常更快。

所以,我会尝试做两个非常简单的查询(每个表一个),然后将它们与 PHP 代码合并/排序。

如果您的数据集非常大,或者您的网络主机很垃圾,那么您的 PHP 脚本可能会耗尽内存……然后,只有这样,开始寻找正确的方法是个好主意在 mysql 中执行此操作(我怀疑临时表可能是正确的查看位置)。

但是,如果您遇到 PHP 的性能限制,那么我怀疑您在 MySQL 中所做的任何事情实际上都会变得更慢,您必须更改数据库结构才能获得良好的性能。一种方法是保留现有的表结构,但有第三个表包含所有表中的重复数据 - 仅用于搜索,以及一些用于保持所有内容同步的代码。

例如,我们有一个表格,其中包含网站用户上传的每个 pdf 文档,另一个表格包含 任何文档中的每个单词,以及多对多链接介于两者之间的表格。

每当上传新的 pdf 文件时,我们都会找到其中的每个单词,并将记录插入到链接表中。这样,我们实际上不必在 PDF 文档中进行搜索,我们只搜索经过结构化以允许快速搜索的索引表。

【讨论】:

感谢您富有洞察力的回答。我对你提到的 2 个简单查询的性质有点好奇。每个人的目的是什么? 好吧,我会在每个表上都有一个基本查询,例如select * from wp_posts where post_title like '%foo%' or post_content like '%foo%',然后将它们连接到一个结果数组中,并进行任何其他后处理(例如:对于你需要的 wordpress到strip_tags() 然后再次验证搜索 - 如果搜索词是 html 或 CSS 语法,而不是实际的帖子内容)。 很好地呼吁通过strip_tags() 运行结果并重新检查,但听起来很耗费资源。好的,所以我可能最终会运行 2 个或 3 个查询。我在想wp_posts 表为 1,wp_terms 表为 1,wp_postmeta 表可能为 1。你觉得这听起来对吗? 是的,听起来不错。我想你会发现它不是资源密集型的......整个搜索很可能需要不到十分之一秒(注意:在谷歌上搜索“bob”需要 0.33 秒,所以用户已经习惯了)。如果性能/服务器负载确实是一个问题,那么您应该调查更改。 谢谢。我会先试一试。【参考方案2】:

对于这种类型的搜索,我愿意使用Solr 之类的解决方案进行索引。您可以使用此类解决方案做很多事情,并且它们在数学上与以通用方式搜索的用户类型非常匹配。

【讨论】:

看起来确实很健壮。我不确定我是否能够将它安装在我的共享主机环境中。感谢您的建议。

以上是关于搜索多种内容类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring-MVC 控制器中支持多种内容类型

具有多种记录类型的 Swift CKQuery

使用回形针和Rails验证多种内容类型

使用 cakePHP 的多种 slug 类型

搜索内部内容字段

使用 MPMediaPropertyPredicate 搜索多种类型