尝试改进WP搜索,有人可以检查我的SQL查询吗?

时间:2013-09-25 作者:Jarrod

我被难住了。我已经做了大量的工作来过滤在WP搜索中得到的帖子,然后在从DB中得到这些帖子后对它们进行排序。我现在的主要问题是获得与标记匹配的结果。我只是直接运行SQL查询并检查输出,而不是通过WP反复运行它。

首先是WP生成的搜索查询(我添加了过滤器,并扩展了重要部分):

SELECT SQL_CALC_FOUND_ROWS  
wp_3_posts.ID FROM wp_3_posts  
LEFT JOIN wp_3_term_relationships AS trel ON (wp_3_posts.ID = trel.object_id)
LEFT JOIN wp_3_term_taxonomy AS ttax ON (  ( ttax.taxonomy = \'post_tag\' )  
AND trel.term_taxonomy_id = ttax.term_taxonomy_id) 
LEFT JOIN wp_3_terms AS tter ON (ttax.term_id = tter.term_id)  
WHERE 1=1  
AND 
(
 (
  (
   (
    (wp_3_posts.post_title LIKE \'%neck%\') 
    OR
    (wp_3_posts.post_content LIKE \'%neck%\')
   ) 
   AND 
   (
    (wp_3_posts.post_title LIKE \'%pain%\') 
    OR
    (wp_3_posts.post_content LIKE \'%pain%\')
   )
  ) 
  OR 
  (
   (
    (tter.name LIKE \'%neck%\')
    AND
    (tter.name LIKE \'%pain%\')
   )
   OR
    (tter.name LIKE \'%neck pain%\')
  )  
  OR 
  (
   (
    (wp_3_posts.post_excerpt LIKE \'%neck%\') 
    AND
    (wp_3_posts.post_excerpt LIKE \'%pain%\')
   ) 
   OR
   (wp_3_posts.post_excerpt LIKE \'%neck pain%\')
  ) 
 )
)  
AND (wp_3_posts.post_password = \'\')  
AND wp_3_posts.post_type IN (\'post\', \'page\', \'attachment\', \'syndicated\') 
AND (wp_3_posts.post_status = \'publish\')  
ORDER BY wp_3_posts.post_date DESC LIMIT 0, 7
第一部分通过连接获取必要的表,这似乎很好。我正在运行的搜索是“颈部疼痛”,标题、内容或摘录中包含这些词的任何帖子都会按预期显示出来。我有一个贴子贴着“颈部”、“疼痛”和“颈部疼痛”。该帖子ID不会随此查询返回。让我抓狂的是,如果我删除这个查询中查看post\\u内容和post\\u标题的部分,我的标记文章就会显示出来。具体而言,如果我删除此项:

(((wp_3_posts.post_title LIKE \'%neck%\') 
OR (wp_3_posts.post_content LIKE \'%neck%\')) 
AND ((wp_3_posts.post_title LIKE \'%pain%\') 
OR (wp_3_posts.post_content LIKE \'%pain%\'))) 
OR 
这将我的查询保留为

SELECT SQL_CALC_FOUND_ROWS  
wp_3_posts.ID FROM wp_3_posts  
LEFT JOIN wp_3_term_relationships AS trel ON (wp_3_posts.ID = trel.object_id)
LEFT JOIN wp_3_term_taxonomy AS ttax ON (  ( ttax.taxonomy = \'post_tag\' )  
AND trel.term_taxonomy_id = ttax.term_taxonomy_id) 
LEFT JOIN wp_3_terms AS tter ON (ttax.term_id = tter.term_id)  
WHERE 1=1  
AND 
(
 ( 
  (
   (
    (tter.name LIKE \'%neck%\')
    AND
    (tter.name LIKE \'%pain%\')
   )
   OR
    (tter.name LIKE \'%neck pain%\')
  )  
  OR 
  (
   (
    (wp_3_posts.post_excerpt LIKE \'%neck%\') 
    AND
    (wp_3_posts.post_excerpt LIKE \'%pain%\')
   ) 
   OR
   (wp_3_posts.post_excerpt LIKE \'%neck pain%\')
  ) 
 )
)  
AND (wp_3_posts.post_password = \'\')  
AND wp_3_posts.post_type IN (\'post\', \'page\', \'attachment\', \'syndicated\') 
AND (wp_3_posts.post_status = \'publish\')  
ORDER BY wp_3_posts.post_date DESC LIMIT 0, 7
也许这里有一些我对SQL不太了解的地方,我对它有点在行。任何智慧都将不胜感激,谢谢!

1 个回复
SO网友:Jarrod

答案是。。。我是个白痴!(有点)

我的问题很好。这并没有达到我预期的效果,因为我的上限是7个,按日期组织时,我预期的帖子超过了7个。我感到困惑,因为最终的结果是搜索页面上的帖子使用匹配标记进行组织,比帖子内容中的匹配词更具相关性,但这种组织只在SQL查询之后发生。

特别感谢@dechler让我动了动脑筋,让我意识到他的尝试会奏效,因为他要搜索的帖子少了。

结束

相关推荐

带有Prepare()的WPDB SQL查询返回变量,而不是DB值

我已经试着让它发挥作用有一段时间了,而我似乎无法靠自己取得任何进展。它似乎可以作为一个普通的SQL查询正常工作,但不在WP框架内使用prepare(). 基本上,我试图在SQL查询中插入一个PHP变量,但函数不是返回我选择的值,而是返回变量的值。我搜索过其他有相同问题的人,但大多数人都在处理LIKE和%通配符的问题。我想不出我的问题是什么。我使用的是bbPress变量,它是论坛id。任何帮助都将不胜感激。global $wpdb; $countquery = $wpdb->get_var(