在 MATCH() AGAINST() 中查找匹配列的名称或别名
Posted
技术标签:
【中文标题】在 MATCH() AGAINST() 中查找匹配列的名称或别名【英文标题】:Find name or alias of matched column in MATCH() AGAINST() 【发布时间】:2019-10-19 14:26:28 【问题描述】:我正在使用MATCH() AGAINST()
在我的数据库中进行全文搜索。因为我想要来自多个表的数据,所以我创建了一个VIEW
并在MARIADB
中使用以下格式的查询,
SELECT
DAT1, DAT2, DAT3
FROM VIEW1
WHERE
MATCH (COL1) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) OR
MATCH (COL2) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) OR
MATCH (COL3) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE)
一切正常,但是我正在查询中寻找附加输出,这就是我在其中找到搜索结果的列名。
如何在查询输出中获取匹配字符串的COL1
、COL2
和COL3
的名称或别名?
【问题讨论】:
UNION
不是更好吗?
确实很有道理,我试试看。
【参考方案1】:
您可以在select
中使用case
表达式:
SELECT DAT1, DAT2, DAT3,
CONCAT_WS(',',
(CASE WHEN MATCH(COL1) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0 THEN 'col1' END),
(CASE WHEN MATCH(COL2) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0 THEN 'col2' END),
(CASE WHEN MATCH(COL2) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0 THEN 'col3' END)
) as cols
FROM VIEW1
WHERE MATCH (COL1) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0 OR
MATCH (COL2) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0 OR
MATCH (COL3) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) > 0;
【讨论】:
一个小疑问,如果我在 7 列中搜索,这是否会影响性能?如果是,我应该回到LIKE %mona%
吗?
@Mercurial 。 . .全文搜索应该比like
快。但是,由于使用了七种不同的索引,您可能需要对其进行测试。【参考方案2】:
( SELECT DAT1
FROM tbl1
WHERE MATCH (COL1) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) )
UNION ALL
( SELECT DAT2
FROM tbl2
WHERE MATCH (COL2) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) )
UNION ALL
( SELECT DAT3
FROM tbl3
WHERE MATCH (COL3) AGAINST ('lisa mona aachen' IN NATURAL LANGUAGE MODE) )
UNION ALL
比默认值 (UNION DISTINCT
) 快,但如果可能存在重复数据并且您希望对它们进行重复数据删除,请使用 DISTINCT
。
不需要VIEW
。或者,您可以将上面的 VIEW
设置为等待填充的文本字符串(通过 @variable?)。
【讨论】:
以上是关于在 MATCH() AGAINST() 中查找匹配列的名称或别名的主要内容,如果未能解决你的问题,请参考以下文章
MySQL MATCH() AGAINST() FULLTEXT Index - 结合短语匹配实现部分字符串匹配
MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)
MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)