MySQL 匹配和喜欢

标签 mysql match match-against

我以这种方式创建了一个全文索引:

CREATE FULLTEXT INDEX filter_index
ON posts (filter)

目前我的搜索代码是这样的:

SELECT * FROM posts
WHERE MATCH(filter) AGAINST (?)

查询执行正常,在我的表中有以下结构。

ID | name   | from           | filter
 1   John     Paris - France | John Paris France
 2   Carey    Paris - France | Carey Paris France
 3   Maria    France - Vion  | Maria France Vion
 4   Alfredo  US New York    | Alfredo US New York
 5   JohnD    Colombia       | JohnD Colombia

如果我查询以下内容:

SELECT * FROM posts
    WHERE MATCH(filter) AGAINST ('France Vion')

这会让我首先得到结果: John Paris France & Carey Paris France 之后是 Maria France Vion

这不应该有所不同吗?首先是 Maria France Vion,然后才是其他结果?

如何优化此操作?

最佳答案

试试这个

SELECT *, MATCH(filter) AGAINST('France Vion' IN BOOLEAN MODE) as relevance
FROM posts_locale 
WHERE MATCH(filter) AGAINST('France Vion' IN BOOLEAN MODE) 
ORDER BY relevance DESC

另外如果你想搜索两个不同的字段并给予优先级。类似于搜索 fromfilter 但给予 from filed

更高的优先级
SELECT *, 
MATCH(filter) AGAINST('France Vion' IN BOOLEAN MODE) as relevance,
MATCH(`from`) AGAINST('France Vion' IN BOOLEAN MODE) as relevance_from
FROM posts 
WHERE MATCH(`from`, filter) AGAINST('France Vion' IN BOOLEAN MODE) 
ORDER BY (relevance_from * 2) + relevance DESC

这里的第二个 (2) ORDER BY (relevance_from * 2) + relevance DESC 使优先级加倍。在某些情况下,这可能很高。您可以尝试 1.5 或更低版本

关于MySQL 匹配和喜欢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21548769/

相关文章:

mysql - 如何将 CONSTRAINT 从 PostgreSQL 转换为 MySQL?

MySQL DATETIME 到 TIMESTAMP 转换

regex - 检索与 Perl 中所有正则表达式完全匹配的模式

ruby - 匹配不包含特定单词的字符串

MySQL Match Against and Group by Multiple 术语

php - 使用对象作为数据库表定义?

php - 如何为数组中的每个元素调用相同的函数?

r - 加速匹配固定字符串 %in%/%like% 与 bool 输出

mysql - 使用 Mysql 的子查询(AGAINST 的参数不正确)

mysql - 带有带引号连字符的 bool 模式查询的 MySQL 中的意外行为