php - 从所有自定义字段搜索非常慢。我需要过滤搜索自定义帖子类型

标签 php mysql database wordpress

我正在我的 WP 和搜索字段中进行自定义搜索,任何键入的单词都将在自定义字段、标题和发布内容中查找。

事实证明,我的数据库有超过 100 万行自定义字段,并且希望将搜索限制为仅针对某种类型的帖子。 我已经在循环中执行此操作来显示结果,但我希望此过滤器是在协商后进行的,因为该页面需要 20 秒以上才能显示结果。

有人可以帮助我吗?下面是我正在使用的代码。

    // SEARCH FROM ALL CUSTOM FIELDS
    $post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
    ALTER TABLE wp_posts ADD INDEX (postmeta)
    SELECT DISTINCT post_id FROM {$wpdb->postmeta}
    WHERE meta_value LIKE '%s'
    ", $keyword ) );

    // SEARCH FOR TITLE AND CONTENT
    $post_ids_post = $wpdb->get_col( $wpdb->prepare( "
    ALTER TABLE wp_post s ADD INDEX (posts);
    SELECT DISTINCT ID FROM {$wpdb->posts}
    WHERE post_title LIKE '%s'
    OR post_content LIKE '%s'
    ", $keyword, $keyword ) );
    $post_ids = array_merge( $post_ids_meta, $post_ids_post );

最佳答案

更新:

试试这个。它尚未经过测试,但我确信如果您检查并修复它一点点它就会起作用:

// SEARCH IN title, content and meta_value
$post_ids = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT ID FROM {$wpdb->posts} AS p,
    LEFT JOIN {$wpdb->postmeta} AS m,
    ON m.post_id = p.ID
    WHERE p.post_type = '%s'
    AND (
    post_title LIKE '%%s%'
    OR m.meta_value LIKE '%%s%'
    OR post_content LIKE '%%s%')
", $post_type, $keyword, $keyword, $keyword) );

注意:

  • 假设您已输入 $post_type$keyword。例如:$post_type = "fairs";
  • 我在 %s 之前和之后添加了 %,以确保它是宽卡搜索。
  • 在本例中,我使用 DISTINCT,因为联合表有重复的 ID。对于您之前在第一次查询时的错误假设,即不需要它,我深表歉意。
  • 无法保证速度,因为您正在对未编入索引的 post_content 进行宽卡搜索。
  • 您应该确保对meta_value 字段建立索引以获得更快的速度。如果您元数据中不要存储太多文本。

祝你好运!

原文:

首先,让我们澄清一下:

  1. 删除这两行,因为它没有帮助(由于重复调用,它会使情况变得更糟):

    更改表 wp_posts 添加索引(postmeta)

还有

ALTER TABLE wp_posts ADD INDEX (posts);
  • ID 已经明确。所以它不会帮助你这样做:SELECT DISTINCT ID
  • 最终查询应如下所示:

    // SEARCH FROM ALL CUSTOM FIELDS
    $post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
    SELECT post_id FROM {$wpdb->postmeta}
    WHERE meta_value LIKE '%s'
    ", $keyword ) );
    
    // SEARCH FOR TITLE AND CONTENT
    $post_ids_post = $wpdb->get_col( $wpdb->prepare( "
    SELECT ID FROM {$wpdb->posts}
    WHERE post_title LIKE '%s'
    OR post_content LIKE '%s' // Remove this will boost performance by 90% because post_content is not indexed
    ", $keyword, $keyword ) );
    $post_ids = array_merge( $post_ids_meta, $post_ids_post );
    

    我建议是使用这个插件:https://wordpress.org/plugins/search-everything/

    关于php - 从所有自定义字段搜索非常慢。我需要过滤搜索自定义帖子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29464232/

    相关文章:

    php - FreeNAS 9.10 上的 Prestashop 1.7 无法通过浏览器连接到数据库服务器

    php - 这是获取和删除文件第一行的最有效方法吗?

    mysql - CodeName One 是否支持使用 RESTful 数据库接口(interface)的 MYSQL BLOB?

    mysql - 如何在mysql上处理大数据查询并具有更好的性能

    database - 给定一个查询,您如何知道要添加哪些索引?

    PHP/MYSQL : Value 0 if record isn't yet in database

    mysql - 是否可以使用一个 sql 查询遍历分层表直到 NULL

    mysql - 字符串形式的系统日期

    mysql - MYSQL中自动递增的列

    PHPIniDir 在 Windows 7 下损坏了吗?