0
点赞
收藏
分享

微信扫一扫

mysql使用全文索引+ngram全文解析器进行全文检索

表结构:表名  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)
);
  • typeissueanswer字段创建全文索引 
    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)可能更适合处理长词和特定领域的术语。这里只是记录一下使用方法.........

举报

相关推荐

0 条评论