【问题标题】:Mariadb fulltext match two columnsMariadb全文匹配两列
【发布时间】:2017-09-02 18:50:20
【问题描述】:

我的查询语法有问题:

SELECT `users`.`name`, `posts`.*
FROM `posts` 
LEFT JOIN `users` ON `posts`.`user_id` = `users`.`id`
WHERE MATCH (title,body) AGAINST('search')

MATCH 只使用一个,没有两个...请告诉我如何解决它...

【问题讨论】:

  • AGAINSTa?你想要它是“OR”还是“AND”?
  • sorry AGAINST .. 我需要在列标题和正文两列中搜索
  • 可以,但是两列是否应该与'search'匹配?还是一个就足够了?
  • 两者......
  • 选择 users.name, posts.* 从 posts 左加入 users posts.user_id = users.id 哪里 MATCH posts.title) 反对(布尔模式下+'%divo%')或匹配(posts.body)反对(布尔模式下+'%divo%')

标签: mysql mariadb mariasql


【解决方案1】:

要检查"search" 是否在两者 titlebody 中,我推荐这种不明显的组合。 (我忽略了users 与问题无关。)

SELECT  p1.*
    FROM  posts AS p1
    WHERE  MATCH(p1.title) AGAINST("search" IN BOOLEAN MODE)
      AND  EXISTS (
        SELECT  *
            FROM  posts AS p2
            WHERE  MATCH(p2.body) AGAINST("search" IN BOOLEAN MODE) 
                  ) 

当使用FULLTEXT 时,我认为优化器不知道如何有效地应用 FULLTEXT 两次,所以这是一种偷偷摸摸的方法。

我首先选择了title,假设它的单词更少,因此不需要继续进行其他测试。

可能“索引合并相交”会为此起作用:

SELECT  *
    FROM  posts
    WHERE  MATCH(title) AGAINST("search" IN BOOLEAN MODE)
      AND  MATCH(body)  AGAINST("search" IN BOOLEAN MODE) 

both 情况下,您需要 both

FULLTEXT(title),
FULLTEXT(body)

包含两列的单个 ft 索引没有用处。

如果您需要进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

您是否拥有ENGINE=MyISAMENGINE=InnoDB 可能很重要;这两种实现方式完全不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2011-02-05
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2011-09-12
    相关资源
    最近更新 更多