表结构:表名 gamedb 主键 id 问题类型 type 问题 issue 答案 answer
需求
现在有个游戏资料库储存在mysql中,客户端进行搜索,需要对三个字段进行匹配,得到三个字段的相关性,选出三个字段中相关性最大的值进行排序,以此获取相关性最高的数据。如以上表,用户搜索的问题是 “如何获得更多游戏积分?”,然后我需要在(type,issue,answer)三个字段里面进行匹配,找到和这个问题相关性最高的数据。
思路
使用MySQL全文检索进行关键词搜索并按相关性得分排序的查询语句。本人mysql版本5.7.24
mysql全文检索,对mysql版本有什么要求?
ngram全文分析器
实际案例
-
创建表
CREATE TABLE gamedb (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(255),
issue VARCHAR(255),
answer VARCHAR(255)
);
-
为type、issue和answer字段创建全文索引
CREATE FULLTEXT INDEX gamedb_index_type ON gamedb(type); CREATE FULLTEXT INDEX gamedb_index_issue ON gamedb(issue); CREATE FULLTEXT INDEX gamedb_index_answer ON gamedb(answer);
检测这三个字段
SELECT *,
(MATCH(type) AGAINST('我喜欢扩展包包')) AS score_type,
(MATCH(issue) AGAINST('我喜欢扩展包包')) AS score_issue,
(MATCH(answer) AGAINST('我喜欢扩展包包')) AS score_answer
FROM gamedb
WHERE MATCH(type) AGAINST('我喜欢扩展包包') OR
MATCH(issue) AGAINST('我喜欢扩展包包') OR
MATCH(answer) AGAINST('我喜欢扩展包包');
缺点
n-gram分词是一种基于统计的分词方法,它将文本按照n个连续的词为单位进行切分。虽然n-gram分词在很多应用中表现良好,但也存在一些缺点:
最后没有采纳这种方法,由于ngram分词不怎么灵活,不同的分词大小可能会在分词结果和性能方面有所差异。较小的n值(如2-gram)可能更适合处理短语和常见词语,而较大的n值(如4-gram)可能更适合处理长词和特定领域的术语。这里只是记录一下使用方法.........