mysql全文检索的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql全文检索的问题相关的知识,希望对你有一定的参考价值。

数据表是MyIsam,数据绝对的高于50%的概率,关键字是英文,name、describe都设置了fulltext索引; select * from abc match(`name`,`describe`) against($key)执行就报Can't find FULLTEXT index matching the column list 这个错,明白的烦劳指点一下,或者有其他方法也可以,就是实现产品名称、内容里面搜索,帮的上的回来追加分

参考技术A 这个简单
alter table `tmp` add fulltext(`column_1`,`column_2`....); /***添加**/
//查询
select * from `tmp` where match(`column_1`,`column_2`) against('$key')本回答被提问者和网友采纳
参考技术B 应该对name和describe两个字段建立联合的全文索引,不要单独建立。 参考技术C 很不幸的告诉你,mysql的全文检索是不支持中文的。有一些可以替代的方法。可以使用第三方的mysql插件。如果不想用第三方插件,你可以专门建立一个检索用的字段,然后,里面存中文分词后的ascii编码或json_encode后的编码等。检索的时候,先编码,再用全文检索。

重音敏感全文搜索(MySQL)

【中文标题】重音敏感全文搜索(MySQL)【英文标题】:Accent sensitive FULL TEXT search (MySQL) 【发布时间】:2019-03-21 09:04:42 【问题描述】:

希望我只是只见树木不见森林,但我的全文搜索行为非常奇怪,我自己无法解决这个问题。 (我试图寻找解决方案,但到目前为止没有运气,因此非常感谢任何帮助。)

所以我的问题是:如果我搜索“tök”(在匈牙利语中意为“南瓜”),该列表还包含带有“tok”的结果(意为“案子”)。如果我搜索南瓜,我显然不想要手机壳之类的东西。

我的系统是 MySQL 每个表都在 InnoDB, utf8_general_ci

这是(简化的)查询:

SELECT id_item,item_title,tag_name, MATCH (item_title) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS title_relevance, MATCH (tag_name) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS tag_relevance 
FROM item_translations 
WHERE NULL IS NULL 
AND (   MATCH (tile_item_title) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) OR MATCH (tag_name) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) ) 
AND id_language=1 
ORDER BY title_relevance DESC, tag_relevance DESC 
LIMIT 0,40

PS:关键字并不总是匈牙利语,因为这个网站是多语言的,所以我需要一个相对灵活的解决方案,它可以处理大多数重音字母(如果可能的话)

【问题讨论】:

【参考方案1】:

字符串比较中的相等性由排序规则指定。 general 会将每个字母视为其(拉丁)基本字符。您需要指定支持您想要区分的重音和变音符号的排序规则。

排序规则包括语言细节。例如。对于西班牙语,n < ñ < o(而 n = ñ 基本上适用于所有其他语言),对于瑞典语,您有 Y = Ü,对于德语(和大多数排序规则)有 ß = ss,对于匈牙利语(和许多其他排序规则),您有o < ö

因此,对于匈牙利网站,您可能需要选择 utf8_hungarian_ci,如果您的软件可本地化为特定语言(和受众),您可能需要调整该列的排序规则或让管理员选择一个。不幸的是,对于全文搜索(与 =order by 等其他字符串比较相比),您无法在查询中动态指定排序规则,因此您需要选择一个排序规则。

在一般的多语言网站上,大多数用户可能希望搜索适合非常一般的英语/俄语/中文模式,如果他们在输入 tok 时找到 tök 也不会感到惊讶。他们甚至可能会因为没有得到这些而感到恼火,尤其是如果他们的键盘上没有ö 并且实际上想买一个南瓜(并且知道它的匈牙利语)。大多数搜索引擎实际上会尽量不要太窄,并希望在输入cafe时找到café,并且通常会在输入coffee时找到cafécaffécafée.

尽管如此,没有一种语言可以以不同的方式处理每种口音和变音符号。如果你真的想区分每一个特殊字符,你可能想试试utf8_bin(虽然我不确定我是否会称它为最灵活)。重要的是要注意它区分大小写,但由于全文搜索始终不区分大小写,所以这无关紧要。如果您在此列上进行其他字符串比较(例如like),这可能会出现问题。此外,您将失去特定于语言的行为,例如Y = Üß = ss(除非你自己实现)。

【讨论】:

谢谢@Solarflare,这非常有帮助!

以上是关于mysql全文检索的问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL全文检索性能测试及问题总结

mysql中文全文检索从入门到放弃

MySQL内置全文检索

springboot微服务Lucence实现Mysql全文检索

asp.net 中如何实现Mysql 全文检索

PHP+MYSQL实现全文检索及全文检索工具