在 MariaDB 中搜索子字符串或单词

Posted

技术标签:

【中文标题】在 MariaDB 中搜索子字符串或单词【英文标题】:Searching a substring or word in MariaDB 【发布时间】:2018-01-08 01:05:24 【问题描述】:

我尝试在 MariaDB 上进行全文搜索,但遇到了一个我无法处理的问题。

我的表格生成为;

CREATE TABLE test (email TEXT, FULLTEXT(email)) ENGINE=InnoDB;

然后插入一些数据;

MariaDB [frauctive]> select * from test;
+---------------------------------+
| email                           |
+---------------------------------+
| david@hotmail.com               |
| michael@gmail.com               |
| christian@gmail.com             |
| david01@hotmail.com             |
| davidblatt@hotmail.com          |
| beckhamdavidbeckham@hotmail.com |
+---------------------------------+

当我对函数使用匹配时,我无法检索到我想要获得的相似度分数;

MariaDB [frauctive]> SELECT email, MATCH(email) AGAINST('*david*' IN         BOOLEAN MODE) AS relevance 
->   FROM test ORDER BY relevance DESC;
+---------------------------------+--------------------+
| email                           | relevance          |
+---------------------------------+--------------------+
| david@hotmail.com               | 0.0906190574169159 |
| david01@hotmail.com             | 0.0906190574169159 |
| davidblatt@hotmail.com          | 0.0906190574169159 |
| michael@gmail.com               |                  0 |
| christian@gmail.com             |                  0 |
| beckhamdavidbeckham@hotmail.com |                  0 |
+---------------------------------+--------------------+

尽管“beckhamdavidbeckham@hotmail.com”条目包含“大卫”模式,但得分返回 0。

你能帮我解决这个问题吗?

【问题讨论】:

全文索引不适用于*david*。您将不得不使用不使用全文索引的LIKE '%david%' 实际上它起作用了。我试过 'david', 'david*', '%david%' 但他们没有处理结果。 【参考方案1】:

关于 * 通配符:

通配符,表示零个或多个字符。它只能出现在词尾。

来源: https://mariadb.com/kb/en/mariadb/fulltext-index-overview/

请尝试:

MariaDB [frauctive]> SELECT email, MATCH(email) AGAINST('david*' IN         BOOLEAN MODE) AS relevance 
->   FROM test ORDER BY relevance DESC;

或者

MariaDB [frauctive]> SELECT email, MATCH(email) AGAINST('david' IN         BOOLEAN MODE) AS relevance 
->   FROM test ORDER BY relevance DESC;

【讨论】:

以上是关于在 MariaDB 中搜索子字符串或单词的主要内容,如果未能解决你的问题,请参考以下文章

在字符串数组中搜索子字符串的最有效方法

使用 objectify 在实体中搜索子字符串

EWS 搜索子字符串的约会正文

如何在数组键中搜索子字符串?

无法从 Ansible 变量中搜索子字符串

在列表中的元素中搜索子字符串并删除该元素