如果你曾经在自己的 WordPress 网站搜索框中输入内容却找不到任何结果,即使你知道这篇文章确实存在,那么你已经体验过 WordPress 的默认搜索引擎了。它只读取文章标题和正文内容,而不会读取摘要、自定义字段、分类、评论、PDF 附件或产品简短描述。它不会优先考虑标题匹配,也不会优先考虑正文匹配。它不进行词干提取,不处理拼写错误,并且按日期而非相关性对搜索结果进行排名。对于只有五篇文章的博客来说,这或许还好。但对于拥有五百篇文章的网站、WooCommerce 商店或任何类型的知识库来说,默认搜索功能正是导致用户流失的隐形原因。
SearchWP 取代了整个搜索引擎。您只需安装一个插件,该插件就会构建一个可搜索的内容索引(涵盖您指定的任何文章类型、字段、分类和 PDF 文件),之后?s=您网站上的所有搜索都将由这个新索引提供支持。WordPress 默认的搜索功能在您的主题中仍然以相同的方式运行。您无需修改任何模板文件。搜索体验将得到显著提升。
本指南面向两类读者。如果您是网站所有者,一直对网站搜索功能感到不满,并希望了解 SearchWP 的实际改进之处,那么前半部分将逐步指导您完成第一个搜索引擎的设置。如果您是开发人员,正在为客户构建搜索体验,那么后半部分将涵盖钩子接口、WP-CLI 命令、算法内部原理以及自定义数据索引模式。
目录
[WP_Query 的替换](#WP_Query 的替换)
[核心 API:SWP() 和 Query 类](#核心 API:SWP() 和 Query 类)
[WP-CLI 命令](#WP-CLI 命令)
[REST API](#REST API)
SearchWP是什么?
SearchWP 是一款高级 WordPress 插件,可替代 WordPress 平台内置的搜索功能。它在数据库中维护着自己的可搜索索引,解析来自多个来源的内容(文章、页面、自定义文章类型、分类、自定义字段、评论、用户、PDF 文档、Office 文档、媒体元数据),并根据可配置的相关性而非日期对搜索结果进行排名。该插件自 2013 年推出以来,已售出超过两百万份付费许可证,由 SearchWP, LLC(一个持续发布更新的小团队)开发。
其思维模型是"引擎和属性"。首先,创建一个搜索引擎(大多数网站只需要默认的搜索引擎)。在该搜索引擎中,添加"来源",即您希望搜索的文章类型、分类或用户。为每个来源设置"属性"(标题、内容、别名、摘要、自定义字段等),并为每个属性赋予 0 到 100 的相关性权重。当用户搜索时,SearchWP 会根据查询对每个已索引的文档进行评分,乘以您设置的属性权重,并按相关性顺序返回排名靠前的结果。默认的 WordPress 搜索查询(SELECT FROM wp_posts WHERE post_title LIKE %s OR post_content LIKE %s)将被完全绕过。
最终,您将获得与用户对 Google 或 Algolia 的预期相符的搜索体验。搜索"不锈钢马克杯"即可找到描述中包含该词组的产品。搜索"John Smith"即可找到在"引述"自定义字段中提及 John Smith 的案例研究。搜索"运输政策"即可找到包含该词组的 PDF 附件。而这些功能在 WordPress 核心功能中都无法直接实现。
该插件还提供了一个操作界面,方便您持续改进搜索功能:统计页面会记录每次搜索查询(不包含任何个人身份信息),让您了解用户正在搜索什么以及他们没有找到什么。"无结果"报告会告诉您哪些查询返回了零个匹配项,这对于任何内容网站来说都是最需要改进的地方。
主要特点
- **每个属性的相关性均可自定义。**每个索引属性(标题、内容、别名、摘要、自定义字段)在每个搜索引擎中都有其自身的 0-100 权重。标题优先排名、内容优先排名、自定义字段优先排名,所有排名方式均可实现。
- 多个搜索引擎 并行运行。不同的搜索体验。"默认"搜索引擎负责常规
?s=搜索;"产品"搜索引擎仅对不同权重的 WooCommerce 产品进行排名;"文档"搜索引擎仅搜索您的知识库。 - **索引所有内容。**文章、页面、所有自定义文章类型、分类、自定义字段(包括 ACF)、用户数据、评论,以及(通过插件)PDF 和 Office 文档。
- **词干提取。**搜索"running"会匹配"run"、"runs"、"runner"。支持多种语言(适用于英语、法语、德语、西班牙语、意大利语、葡萄牙语、俄语、波兰语等)。
- **部分匹配。**搜索性能会优雅地降低。"iphon"在没有完全匹配结果时,会匹配"iphone"。
- **同义词。**定义等效术语组("phone, mobile, cellular, cell")。
- **停用词。**常用词("the"、"and"、"or")默认情况下会从查询和索引中删除,每个站点可进行配置。
- **自定义结果排序(专业版扩展)。**手动将特定文章置顶,以适应特定搜索查询。便于对热门搜索结果进行编辑控制。
- **重定向(专业版扩展)。**将搜索查询发送到特定 URL("联系"→ /contact/,不显示搜索结果页面)。
- **实时 Ajax 搜索(专业版扩展)。**将任何主题中实时输入的搜索下拉菜单替换为 SearchWP 的相关性排名搜索结果。
- **模态搜索(专业版扩展)。**全屏覆盖式搜索模态窗口。
- **WooCommerce 集成(专业版扩展)。**支持搜索产品标题、描述、简短描述、SKU、属性和变体。可直接替代 WooCommerce 自带的产品搜索功能。
- **源扩展。**使 WPForms 条目、Gravity Forms 条目、bbPress 主题和其他插件数据像原生 WP 内容一样可搜索。
- **支持 REST API 和 WP-CLI。**可通过编程方式进行索引、查询和诊断。
- **无需外部服务。**所有功能都在您自己的服务器上运行。无 SaaS 依赖,无需按搜索次数计费,也无需担心隐私问题。
工作原理(对用户而言)
理解 SearchWP 最简单的方法是将其与 WordPress 默认搜索进行比较。WordPress 默认搜索会查询LIKE '%phrase%'文章标题和内容列,并按日期排序查找结果。SearchWP 则构建了一个倒排索引(与 Lucene 和 Elasticsearch 使用的数据结构相同,保存在 WordPress 数据库中),将每个词元映射到它出现的每个文档,以及属性级别的频率。搜索时,SearchWP 会在索引中查找词元,根据相关性对文档进行评分,并返回得分最高的结果。默认的 WordPress 搜索钩子(例如 `
` 和 ` <code>pre_get_posts</code>` <code>posts_search</code>)会被静默替换。
主管理界面位于此处wp-admin → SearchWP → Algorithm。您可以在这里配置引擎及其资源:

请注意右侧的"索引状态"面板,其中显示索引器进度为 100%。这表示 SearchWP 已完成当前内容的索引构建。每次发布新文章时,索引器都会在后台运行以添加新文章。如果您更改了属性权重或来源,需要重新计算索引,可以使用手动"重建索引"按钮。
标题、内容、别名、摘要和作者的滑块是 SearchWP 的相关性调节器。默认情况下,标题的权重最高(因为标题匹配通常是文档与该主题相关的最强信号)。内容的权重较低(因为在长篇文章中靠后的单个提及信号较弱)。您可以拖动任何来源的这些滑块,下次查询将使用新的权重。
"搜索表单"选项卡用于构建要嵌入到页面上的实际搜索表单小部件:

您可以创建任意数量的表单,每个表单都关联一个特定的搜索引擎。使用简码或 Gutenberg 区块,您可以将表单放置在任何位置。"docs"搜索引擎可以为您的知识库侧边栏搜索框提供支持,而默认搜索引擎则支持全局标题搜索。
一旦有访客进行搜索,统计页面就成为最有价值的视图:

每次搜索都会被记录(匿名,不包含 IP 地址和个人身份信息)并进行汇总。"无结果搜索"列是最有价值的报告:它能准确告诉你访客期望你提供但你却没有的内容。添加这些内容,或者设置同义词/重定向到现有内容,就能弥补这一差距。
专业版扩展程序在"扩展程序"选项卡下进行管理,并可解锁更强大的功能:

每个扩展程序都是一个独立的插件文件,您需要将其安装在 SearchWP 核心之上,然后从此屏幕激活。WooCommerce Integration 会将 WooCommerce 的产品搜索引擎替换为 SearchWP。Metrics 是高级分析扩展程序(点击率、转化率)。Live Search 可使边输入边搜索的下拉菜单按相关性排序。Modal Search 会添加一个全屏搜索叠加层,您可以通过按钮触发该叠加层。
"工具"选项卡用于处理引擎配置的导入/导出,并提供用于调试的诊断信息:

引擎配置的 JSON 导出文件意味着您可以在测试环境中构建引擎,然后将 JSON 文件粘贴到生产环境中,引擎即可完全正常启动。"工具"菜单中的"诊断"选项卡可用于检查索引器是否运行正常、查看每个数据源的索引数量,以及在需要重新开始时重置索引。
安装和设置
SearchWP 是一个单独的插件压缩包。安装只需一分钟,首次构建索引可能需要更长时间,具体取决于您的内容量。
**步骤 1:安装插件。**在 WordPress 管理后台,依次点击"设置">"插件">"安装Plugins → Add New → Upload Plugin",选择searchwp.zip插件文件,点击"立即安装",然后点击"启用插件"。管理后台侧边栏将出现一个新的"SearchWP"菜单。
**步骤 2:激活您的许可证(可选)。**前往SearchWP → Settings → License Key并粘贴您的许可证密钥。即使没有许可证,该插件也能完全运行,密钥仅用于启用来自 searchwp.com 的自动更新。
**步骤 3:验证默认搜索引擎是否已设置。**前往SearchWP → Algorithm此处应填写设置路径。您应该看到一个名为"Default"的搜索引擎,其中已添加了两个搜索源:文章(5 个属性)和页面(5 个属性)。这是引导配置。SearchWP 已替换了 WordPress 的默认搜索;您无需进行任何其他操作即可获得基本改进。
**步骤 4:等待首次索引构建完成。**查看右侧的"索引状态"面板。它会显示一个进度条(例如"正在索引...已完成 36%),SearchWP 会处理每篇现有文章。对于只有少量文章的全新安装,这只需几秒钟。对于拥有 5 万篇文章的网站,则可能需要一个小时。索引器在后台 WP-Cron 任务中运行,因此不会阻塞任何操作。当进度条达到 100% 时,您的搜索将被完全替换。
**第五步:测试搜索。**打开网站前端,在搜索框中输入查询内容,然后按回车键。您应该已经看到比 WordPress 默认搜索结果更好的结果(标题属性的权重更高,索引范围也不仅仅局限于标题和内容)。
**步骤 6:进一步自定义。**现在您可以调整属性权重、添加更多数据源、添加自定义字段数据源以及安装扩展程序。下一节将详细介绍这些步骤。
安装完成。插件已经可以正常工作了。
逐步指南:配置你的第一个搜索引擎
让我举个具体的例子。Maya 运营着一个食谱博客,有 800 篇文章。每篇文章都是一个食谱,包含标题(食谱名称)、正文(步骤)、摘要(概要)以及几个 ACF 自定义字段:食材(名称+数量的重复字段)、菜系(选择字段)和准备时间(数字字段)。Maya 希望搜索结果不仅包含标题和正文,还能包含食材和菜系。
步骤 1:提升标题相关性。Maya 希望标题匹配结果占据主导地位。前往SearchWP → Algorithm"帖子"源,将"标题"滑块拖动到最右侧(相关性 300,可见最大值)。将"内容"向下拖动到 1。将"别名"拖动到 200,"摘要"拖动到 1,"作者"拖动到 300(这样,搜索作者姓名"Priya"就能找到 Priya 的帖子)。点击"保存"。
**步骤 2:添加自定义字段属性。**在"帖子"源下,点击"添加/移除属性"。点击"自定义字段"选项卡。添加字段ingredients(ACF 重复器)和字段cuisine。如果您想要所有自定义字段,请将它们设置为"任意元键",或者选择特定的字段。每个字段都会成为一个新属性,并拥有自己的相关性滑块。将相关性设置ingredients为 250(高度相关,因为 Maya 需要成分搜索功能正常工作),并将相关性设置cuisine为 150。
**步骤 3:配置停用词。**前往SearchWP → Settings"设置">"停用词">"设置 ...
**步骤 4:配置词干提取。**在"设置"页面中,"词干提取"开关应开启。这样才能确保"running"匹配"run"。只有在需要精确时态匹配的特殊情况下才应关闭此开关。
**步骤 5:重建索引。**更改属性权重或添加新属性后,单击"算法"页面右侧边栏的"重建索引"按钮。索引器将重新运行,搜索现在将使用新的权重。(只有在更改属性/来源/来源时才需要重建索引;单独更改权重不需要重建,因为它们在查询时生效。)
步骤 6:使用真实查询进行测试。Maya 在自己的搜索框中输入"garam masala"。之前她找不到任何结果,因为这个词组只出现在 ACF Repeater 中,而 WordPress 默认搜索会忽略它。现在她找到了 12 个食谱,排名依据是"garam masala"在配料栏中出现的次数。
步骤 7:设置常见无结果查询的重定向。Maya 检查SearchWP → Statistics后发现"instant pot"(电压力锅)是一个常见的无结果查询(她还没有编写专门关于电压力锅的内容)。她安装了 Redirects 扩展程序,并添加了以下重定向:"任何包含'instant pot'的查询 → /category/instant-pot/",这样访问者就会跳转到分类存档页面,而不是空白的结果页面。
步骤 8:添加实时搜索下拉菜单。Maya安装了实时搜索扩展程序,现在她网站页眉中的搜索框会随着访客的输入实时显示搜索结果。她选择了"极简"模板,以便下拉菜单与她的主题风格相匹配。
整个流程大概花了 30 分钟。现在的搜索体验比 WordPress 默认搜索好得多,而且 Maya 还建立了持续的反馈循环(统计 → 无结果报告 → 内容缺口 → 填补缺口),以不断改进。
实际应用案例
SearchWP 能够适应各种类型的网站,这一点令人惊讶。以下是我观察到的一些常见模式:
1. 一个文档网站。Vikram 运营着一个开发者文档网站,其中包含 2000 篇导入 Markdown 格式的文章。默认搜索功能无法返回有效结果,因为大多数查询都与代码相关("WP_Query meta_query")。他优化了 slug 和 content_meta 属性,并为"code_example"ACF 字段添加了自定义字段源,现在开发者只需一次搜索就能找到所需内容。
**2. Anika 经营一家小型电商网站,**在 WooCommerce 平台上销售手工陶瓷。她安装了 WooCommerce 集成扩展程序。现在,顾客可以按产品属性(例如"蓝色马克杯")或 SKU 进行搜索。由于顾客不再访问空白搜索结果页面,搜索转化率显著提升。
3. 一家法律服务公司。Raj运营着一个法律实践网站,提供案例研究、博客文章和 PDF 格式的案例判决。他安装了 Documents 扩展程序,并索引了这些案例 PDF 文件。现在,潜在客户搜索"ADA 无障碍设施"时,就能找到 Raj 的律所代理过类似案件的具体案例 PDF 文件。
**4. 一个非营利组织的知识库。**萨拉负责运营一个非营利组织的资源库:包含 400 篇文章、200 份 PDF 报告和 100 个视频文字稿。每种内容都属于不同的文章类型。她配置了三个搜索引擎:默认(搜索所有内容)、"研究"(仅搜索 PDF 和文章)以及"视频"(仅搜索视频文字稿)。每个搜索引擎都以独立搜索表单的形式显示在网站的相应版块中。
5. 一个房地产信息网站。Priya 运营着一个拥有 5000 条房源信息的房地产网站。每条房源信息都包含城市、卧室数量、价格范围和社区等字段。她大幅提升了城市和社区的 ACF 字段排名,因此即使"BHK"仅出现在结构化字段中,而非房源内容中,搜索"Bandra 2 BHK"也能返回正确的房源信息。
6. 一家销售 WordPress 模板的代理机构。Marcus 经营一家销售 WordPress 模板的代理机构。每个模板都是一个自定义文章类型 (CPT),包含名称、演示 URL、屏幕截图和详细描述。他使用 SearchWP 的相关性滑块使模板名称更加醒目,然后安装了 Modal Search,为他的网站添加了类似 Cmd-K 的搜索框。他的"查找模板"流程的转化率提高了 40%。
开发人员参考
这是篇幅较长的部分。如果您跳过了上面面向用户的前半部分,您应该已经了解pre_get_posts自定义文章类型、文章元数据和文章主题WP_Query是什么。以下所有内容都建立在这些基础之上。
WP_Query 的替换
SearchWP 并不像大多数插件那样扩展 WP_Query。相反,当 WordPress 检测到搜索请求时is_search(),SearchWP 会通过`get_search_query()`pre_get_posts和`get_search_query()` 进行拦截posts_pre_query,从而完全绕过 WordPress 默认的搜索 SQL。它会针对自己的数据库表(wp_swp_log`username`、wp_swp_index` wp_swp_statususername` wp_swp_tokens、`username`、`username`)运行自定义查询,生成一个按相关性评分排序的匹配文章 ID 列表,然后将这些 ID 注入回 WP_Query 的结果集中。主题的 search.php 文件仍然以相同的方式循环执行have_posts();只是循环中的 ID 来自不同的来源。
$wp_query->request您可以通过检查搜索页面来查看实际效果。启用 SearchWP 后,SQLSELECT ID FROM wp_posts WHERE ID IN (87, 142, 21, 309,...)语句类似于 `<searchWP_id>:<search ...
核心 API:SWP() 和 Query 类
bash
// Direct query using the SearchWP API (independent of WordPress search).
$query = new SearchWPQuery( 'garam masala', [
'engine' => 'default',
'per_page' => 10,
'page' => 1,
] );
$results = $query->get_results(); // array of WP_Post objects
$total = $query->get_found_posts();
$ids = $query->get_ids();
// Use this when you want SearchWP relevance for an Ajax endpoint or a REST route
// that should not go through the standard search.php template.
值得了解的过滤器钩子
该插件使用了一种不常见的钩子命名约定,其中包含反斜杠。这是因为 SearchWP 在内部使用 PHP 命名空间分隔符来对钩子进行命名空间划分:
bash
// Modify the search string before it hits the index.
add_filter( 'searchwpquerysearch_string', function( $string, $query ) {
// Strip out URL-like patterns from the query.
return preg_replace( '/https?://S+/', '', $string );
}, 10, 2 );
// Modify the final query args.
add_filter( 'searchwpqueryargs', function( $args, $query ) {
if ( $query->get_engine()->get_name() === 'default' ) {
$args['per_page'] = 12;
}
return $args;
}, 10, 2 );
// Control whether partial matching is allowed.
add_filter( 'searchwpquerypartial_matcheswildcard_before', '__return_true' );
// Control whether phrase searches are treated as exact phrases.
add_filter( 'searchwpquerylogicphrase', function( $default, $query ) {
return true; // always require exact phrase matches when quotes are used
}, 10, 2 );
// Customize stemmer behavior.
add_filter( 'searchwpstemmerlocale', function() {
return 'fr_FR'; // force French stemming even if site locale differs
} );
add_filter( 'searchwpstemmercustom', function( $stem, $word ) {
if ( $word === 'aficionado' ) {
return 'aficion';
}
return $stem;
}, 10, 2 );
// Set minimum token length to index.
add_filter( 'searchwptokensminimum_length', function() {
return 2; // index 2-letter tokens like "us" (default is usually 3)
} );
// Transform content before tokenization (e.g. strip code blocks).
add_filter( 'searchwptokensstring', function( $string ) {
return preg_replace( '/<pre[sS]*?</pre>/', '', $string );
} );
// Toggle the slot cache (mostly for debugging).
add_filter( 'searchwpsourcecheck_db', '__return_true' );
用于索引生命周期的操作钩子
bash
// Fires for diagnostic logging.
add_action( 'searchwpdebuglog', function( $message, $context ) {
// Forward to your own log aggregator.
error_log( "[searchwp/$context] $message" );
}, 10, 2 );
// Fires when an engine setting changes.
add_action( 'searchwpsettingsupdatestemming', function( $value ) {
// Run side effects after a setting changes.
do_action( 'my_search_settings_changed', 'stemming', $value );
} );
自定义来源
在 SearchWP 中,"来源"是指描述可索引内容类型的类。默认情况下,文章、页面、自定义文章类型、分类和用户的来源会自动注册。要添加新来源(例如,用于存储在自定义数据库表中的数据,或来自其他插件的自定义文章类型,该类型应作为其自身的来源进行搜索):
bash
add_action( 'searchwpsources', function( $sources ) {
$sources[] = new MyCustomSource();
return $sources;
} );
class MyCustomSource extends SearchWPSource {
public $name = 'my_glossary';
public function attributes() {
return [
'term' => [ 'label' => 'Term' ],
'definition' => [ 'label' => 'Definition' ],
'category' => [ 'label' => 'Category' ],
];
}
public function options() {
return [
'label' => 'Glossary',
'class' => self::class,
'rules' => [],
];
}
//... implement query() and other Source methods
}
Source 抽象类在插件代码中有详细的文档说明;复制其中一个捆绑的源(includes/Sources/Post.php)作为起始模板。
自定义字段和元索引
自定义字段属性是扩展 SearchWP 引擎最常见的原因。您可以通过用户界面(算法 → 添加/移除属性 → 自定义字段选项卡)或通过编程方式添加自定义字段:
bash
add_filter( 'searchwpsourceattributemeta_key', function( $value, $args ) {
// For a custom field that stores a serialized array, flatten to text.
if ( $args['key'] === 'product_features' && is_array( $value ) ) {
return implode( ' ', array_map( function( $item ) {
return is_array( $item )? implode( ' ', $item ) : $item;
}, $value ) );
}
return $value;
}, 10, 2 );
对于高级自定义字段用户,可以通过挂钩元数据提取,将 Repeater 和 Flexible Content 子字段索引为单个属性:
bash
add_filter( 'searchwpsourceattributemeta_value', function( $value, $args ) {
if ( $args['key']!== 'ingredients' ) {
return $value;
}
// ACF Repeater stores sub-fields with keys like ingredients_0_name.
$post_id = $args['post_id'];
$rows = get_field( 'ingredients', $post_id );
if (! is_array( $rows ) ) return $value;
return implode( ' ', array_column( $rows, 'name' ) );
}, 10, 2 );
WP-CLI 命令
SearchWP 提供了三个 CLI 命令。这些命令对于暂存部署和大型内容导入非常有用:
bash
# Index any unindexed posts.
wp searchwp index
# Force a full reindex (destroys current index, rebuilds from scratch).
wp searchwp reindex
# Print diagnostic info about the index, sources, attributes, and counts.
wp searchwp diagnostics
# Multisite support: target a specific site.
wp searchwp reindex --url=https://network-site.com
典型的部署流程:
bash
# After deploying code that adds a new custom field source:
wp searchwp diagnostics # confirm SearchWP sees the new source
wp searchwp reindex --url=$SITE_URL # rebuild index with new attribute
REST API
SearchWP 本身并不在核心代码中注册 REST 路由。Pro Metrics 扩展添加了一个/wp-json/searchwp/v1/命名空间,其中包含用于统计信息和指标的端点。对于从解耦前端进行程序化搜索,最简洁的方法是编写一个小型自定义 REST 端点,该端点封装了 SearchWP Query 类:
bash
add_action( 'rest_api_init', function() {
register_rest_route( 'my-app/v1', '/search', [
'methods' => 'GET',
'callback' => function( $request ) {
$query = new SearchWPQuery( $request['q'], [
'engine' => $request['engine']?? 'default',
'per_page' => 10,
'page' => $request['page']?? 1,
] );
return [
'results' => array_map( function( $post ) {
return [
'id' => $post->ID,
'title' => get_the_title( $post ),
'url' => get_permalink( $post ),
'excerpt' => get_the_excerpt( $post ),
];
}, $query->get_results() ),
'total' => $query->get_found_posts(),
];
},
'permission_callback' => '__return_true',
] );
} );
索引器行为和排队
SearchWP 的索引器作为 WordPress 后台进程运行(采用特定WP_Background_Process模式)。当您保存文章时,索引器会将该文章加入增量索引队列。WP-Cron 任务会在几秒钟内获取该文章。
你可以接入索引生命周期来添加自定义副作用:
bash
add_action( 'searchwpindexerfinished', function() {
// Index just finished a full run. Good place to bust a downstream cache.
wp_cache_flush_group( 'my_search_cache' );
} );
add_filter( 'searchwpindexerpostmeta_count', function( $count, $post_id ) {
// Limit how many meta values get tokenized per post (for very heavy meta).
return min( $count, 100 );
}, 10, 2 );
模板和搜索结果模板
SearchWP 不会覆盖您主题的 search.php 文件。标准的 WordPress 循环仍然驱动前端显示。该插件仅替换底层查询语句。
如果您使用 Live Search Pro 扩展程序,它会附带一些模板,您可以在主题中覆盖这些模板:
bash
wp-content/themes/your-theme/searchwp-live-search/results.php
wp-content/themes/your-theme/searchwp-live-search/result.php
这是标准的 WC 风格模板层次结构:复制插件捆绑的模板,在你的主题中进行修改,插件会自动获取覆盖值。
数据库表
SearchWP 创建多个以特定前缀wp_swp_(或您自定义的数据库前缀)开头的表:
wp_swp_index-- 主倒排索引。每行对应一个词元-文档对。wp_swp_tokens-- 令牌表(每个唯一的令牌都有一个 ID)。wp_swp_status-- 每篇文章的索引状态。wp_swp_log-- 搜索统计日志。
如果需要"彻底清除并重建",wp searchwp reindex请截断并重新填充所有这些表。TRUNCATE如果 WP-CLI 不可用,您也可以在 SQL 中手动操作,然后访问相关页面SearchWP → Algorithm,索引器将在下次 cron 运行时重建。
与其他插件的兼容性钩子
如果您编写了一个想要与 SearchWP 集成的插件:
bash
// Detect SearchWP is active.
if ( class_exists( 'SearchWP' ) ) {
// Hook into the search flow.
}
// Detect a specific extension is active.
if ( class_exists( 'SearchWPExtensionsWooCommercePlugin' ) ) {
// SearchWP's WooCommerce integration is loaded.
}
常见模式:您的插件定义了一个自定义文章类型 (CPT),您在 `<plugin_name>` 注册了一个 SearchWP 源searchwpsources,并通过 `<plugin_name>` 发送了一个算法 UI 建议searchwpengine_settingsdefaultsources。
性能、兼容性和注意事项
SearchWP 比 WordPress 默认的精简搜索功能依赖性更高,但它的扩展性却出奇地好。该插件已在拥有数十万篇文章的网站上投入使用。
性能考量:
- 最大的成本在于初始索引构建。对于包含 10,000 篇文章的全新安装,预计需要 15-30 分钟。索引器使用 WP-Cron,因此不会阻塞请求,但会给 wp-cron.php 产生流量。
- 初始构建完成后,后续的索引更新非常少。每次
save_post更新只会触发该文章的少量增量更新。 - 对于超过几百篇文章的规模,搜索查询本身比 WordPress 默认的 LIKE 查询速度更快。倒排索引查找的时间复杂度为 O(log n),其中 n 是唯一标记的数量,而 LIKE 扫描的时间复杂度为 O(n)(针对所有文章)。
- 缓存插件(例如WP Rocket)与 SearchWP 配合良好。由于查询速度快,且在相同输入下结果一致,因此搜索结果页面可以正常缓存。
- 如果数据量达到数百万
wp_postmeta行,自定义字段属性索引在初始构建时可能会很慢。建议有选择地索引某些元键。
兼容性注意事项:
- SearchWP 需要 PHP 7.3+ 和 WordPress 5.3+。
pre_get_posts该插件通过`<search_query_name>` 和 `<search_query_name> ` 替换 WordPress 的默认搜索查询posts_pre_query。如果您的主题也使用了钩子来修改搜索查询,则两者可能会冲突。对于与搜索相关的更改,pre_get_posts请使用 SearchWP 特有的过滤器(`<search_query_name>searchwpqueryargs`),而不是 `<search_query_name>` 。pre_get_posts- 支持多站点,但每个站点都需要自己的 SearchWP 索引。没有全网索引。
- 该插件本身并不直接集成非 MySQL 数据库。如果您通过移植层在 PostgreSQL 上运行 WordPress,则可能会遇到问题。
- 基于区块的搜索(Gutenberg 搜索区块)可以与 SearchWP 配合使用,因为它最终会发出一个
?s=SearchWP 拦截的请求。
常见陷阱:
- **添加新来源后忘记重建索引。**添加新来源(例如自定义文章类型)需要
wp searchwp reindex点击"重建索引"。否则,新来源在索引中将为空,对其进行搜索将返回零结果。 - 相关性是按搜索引擎单独设置的,而非全局设置。 "文章"来源的"标题"滑块仅在使用"默认"搜索引擎搜索时生效。如果您还有一个包含文章的"产品"搜索引擎,则该搜索引擎中文章的标题相关性是单独的设置。
- **默认最小查询长度为 3。**除非更改最小标记长度过滤器,否则使用 1-2 个字符的查询(例如"BB")将不会返回任何结果。
- **停用词功能支持语言识别,但默认使用英语。**如果您的网站使用非英语语言,请设置词干提取器语言环境过滤器并添加特定语言的停用词。该插件不会自动检测非英语网站。
- **"自定义结果排序"扩展程序会覆盖相关性设置。**如果您将帖子 X 固定在查询"Y"的第一位,则无论算法得分如何,它始终会显示在第一位。请确保这是您想要的结果。
- **PDF 索引需要 SearchWP Documents 扩展。**如果没有该扩展,文件附件会被列出,但其内容不会被标记化。
定价和许可
SearchWP 由 SearchWP, LLC 公司销售,采用按站点年度授权模式,分为三个级别:标准版(1 个站点)、专业版(3 个站点 + 大部分扩展程序)、代理版(无限站点 + 所有扩展程序)。专业版和代理版包含高价值扩展程序(WooCommerce、实时搜索、模态搜索、重定向、自定义结果排序、WPForms/Gravity Forms/bbPress 的数据源集成)。
该插件采用 GPL 许可(WordPress 许可协议要求如此)。SearchWP 出售的许可为支持和更新许可,而非使用许可。安装后,您可以在任意数量的网站上使用它;该许可仅限制您获得支持回复和访问官方更新渠道。
由于采用了 GPL 协议,同一个插件文件可以合法地重新分发。插件功能相同,无需 SearchWP 频道进行更新。
对于以搜索为核心业务功能的网站(例如电商网站、大型内容网站、文档网站),在完成原型设计后,官方授权值得考虑。SearchWP 的支持团队响应迅速,并频繁发布更新。
常问问题
问:使用 SearchWP 需要编写任何代码吗?
不。默认搜索引擎开箱即用,会自动替换 WordPress 的搜索功能。所有配置都通过管理后台完成。只有当您想要使用自定义数据源、自定义字段处理或与独立前端集成来扩展 SearchWP 时,才需要编写代码。
问:SearchWP 会降低我的网站速度吗?
恰恰相反。对于文章数量超过几百篇的网站,SearchWP 的倒排索引查找速度比默认的 LIKE 查询更快。虽然初始索引构建需要时间,但后续的搜索查询速度更快。
问:SearchWP 是否支持 WooCommerce?
是的,可以通过 WooCommerce Integration 扩展程序实现。它会将 WooCommerce 自带的产品搜索引擎替换为 SearchWP,支持产品属性、SKU、变体、简短描述和标签。如果您销售产品,并且曾经听到客户抱怨"我找不到任何想要的东西",那么请先安装此扩展程序。
问:SearchWP 可以索引 PDF 文件吗?
是的,可以通过 Documents 扩展程序实现。它使用开源的 PDF 解析器从 PDF 附件中提取文本,并将这些文本与文章内容一起建立索引。它也支持 Word、Excel 和 PowerPoint 文档。
问:SearchWP 是否支持WPForms、Gravity Forms 或其他表单输入数据?
是的。WPForms 和 Gravity Forms 的源扩展程序会将表单条目索引为可搜索的内容。如果您有一个基于表单提交内容的目录或知识库,这将非常有用。
问:我可以在一个网站上设置多个搜索表单吗?
是的。创建所需数量的搜索引擎(例如"默认"、"产品"、"文档"),然后为每个引擎创建一个搜索表单SearchWP → Search Forms。通过短代码或代码块嵌入每个表单。
问:SearchWP 是否与 Elementor、Beaver Builder 或其他页面构建器兼容?
是的。SearchWP 的搜索表单小部件可以与大多数主流建站工具集成。实时搜索和模态搜索下拉菜单无需任何配置即可在建站工具创建的页面中使用。
问:如果我停用 SearchWP,我的数据会丢失吗?
搜索体验将恢复为 WordPress 默认搜索(您的主题将继续正常运行)。SearchWP 索引表将保留在数据库中,直到您明确卸载该插件(卸载后索引表将被清除)。您文章中的字段数据不会被修改。
问:SearchWP 与 Algolia 或 Elasticsearch 有何不同?
Algolia 是一款托管式 SaaS 搜索引擎,拥有业内最佳的查询延迟,但按搜索次数收费,且您的数据存储在 Algolia 的服务器上。Elasticsearch 是一款自托管的分布式搜索服务器,功能强大,但需要独立的底层架构。SearchWP 完全运行在您现有服务器上的 WordPress 内部,无需外部服务,也不按搜索次数计费。其缺点是可以轻松扩展到"数万篇文章",但无法扩展到"数千万篇文章"(这正是您需要 Elasticsearch 的情况)。
问:SearchWP 是否支持多语言网站(WPML、Polylang)?
是的。文章的每种语言版本都会被单独索引。搜索结果会根据当前语言上下文进行调整。如果您的网站默认语言不是英语,请设置词干提取器语言环境过滤器。
总结
SearchWP 是一款低调却至关重要的插件。安装后,搜索体验显著提升,几周之内,你就会查看统计页面,惊叹自己之前是如何在没有它的情况下运营内容网站的。它的改进并不花哨:没有界面大改,没有新增前端小部件,也没有重新设计搜索页面。它只是提供了更优质的搜索结果、更快的查询速度,以及一个基于访客实际搜索内容的反馈机制,帮助你优化网站内容。
对于新手来说,步骤很简单。安装插件,等待索引器完成,你的搜索效果就已经比 WordPress 默认的搜索效果好得多。如果需要,可以调整相关性滑块;如果需要支持 PDF 或 WooCommerce,可以安装扩展程序。就是这样。
对于开发者而言,这款插件设计精良。其钩子接口丰富且一致(所有过滤器均以 `.` 开头searchwp)。核心 APISearchWPQuery简洁明了,允许您独立于 WordPress 运行相关性排名搜索WP_Query。WP-CLI 命令负责处理繁琐的持续集成工作(wp searchwp reindex在您的部署脚本中)。自定义数据源允许您索引来自任何插件、自定义表或外部系统的数据。
SearchWP 不适用的情况:如果你的网站文章少于 200 篇,且仅按标题搜索,那么 WordPress 默认的搜索功能就足够了。如果你的网站有 5000 万篇文档,且延迟要求低于 100 毫秒,那么你需要 Elasticsearch 或 Algolia。对于其他所有情况,尤其是文章数量在 500 到 50 万之间的网站,SearchWP 是一个实用且不错的默认选择。
把它放到测试网站上,指向你的真实内容,不出一个下午,你就能获得一种搜索体验,让"我找不到任何内容"的反馈消失。
有用的外部参考资料: