wordpress使用mysql的FULL TEXT全文索引提升搜索速度

wordpress默认的搜索使用的是like方式进行搜索.
mysql like这种搜索方式会全表扫描而且不走索引.
mysql like方式进行搜索在数据少的时候速度很快,
然而当数据量达到百万甚至千万的时候数据库进行搜索可能直接卡死无响应.
这里我们需要使用FULL TEXT全文索引改造wordpress搜索

1.为post_title和post_content设置FULL TEXT全文索引

登录mysql找到wp_posts表,执行下面SQL语句增加FULL TEXT全文索引
ALTER TABLE `wp_posts` ADD FULLTEXT fidx_title_content( `post_title`, `post_content`) WITH PARSER ngram;

2.为posts_search添加自定义函数

以下内容需要添加到主题的functions.php文件内

add_filter('posts_search', '_my_posts_search_function', 12, 2);
function _my_posts_search_function($sql, $query)
{
    global $wpdb;
    $keyword = $query->get('s');
    if (!$keyword || $sql == '') {
        return $sql;
    }

    $keyword_wildcard = "{$keyword}*";
    $mode = "";
    if (strlen($keyword) <= 3) {
        $mode = " IN BOOLEAN MODE";
    }
    $sql = " AND MATCH ({$wpdb->posts}.post_title, {$wpdb->posts}.post_content) AGAINST ('%s'{$mode}) ";
    return $wpdb->prepare($sql, $keyword_wildcard);
}

3.为posts_fields添加自定义字段和添加posts_orderby自定义排序

这里是为了使用相关性排序而修改,如果用不到无需理会.
具体修改内容,请查看末尾参考文章1
add_filter('posts_fields', '_my_posts_fields_function', 12, 2);
add_filter('posts_orderby', '_my_posts_orderby_function', 12, 2);

4.wordpress使用支持FULL TEXT全文索引的插件

由于自己手动修改太麻烦,我直接选用了别人写好的FULL TEXT搜索插件,简单省事.
https://wordpress.org/plugins/better-search/ 这个支持PHP5.6
https://wordpress.org/plugins/relevanssi/

参考文章:
https://gist.github.com/jesgs/422889b187bc67cdaab912b0ad74c9e9
https://gist.github.com/dingo-d/7ec3a8e53cbab1d832682bee07703f20
https://wordpress.org/support/topic/problem-with-the-pre_get_posts-action/

发表评论