› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
Jiangoogle
V2EX  ›  MySQL

MySQL 全文搜索,如何才能连同中文标点一起搜?

  •  
  •   Jiangoogle · Nov 19, 2022 via Android · 3645 views
    This topic created in 1406 days ago, the information mentioned may be changed or developed.
    mysql5.7, Myisam

    想模拟出和 like "%你好,我是%" 一样的效果

    现在用的是 match () against('"你好,我是" in boolean mode)

    同时把 ft_stopword_file 已经设成了 '',并已经重启服务,repair table xx quick 重建索引

    但仍然一加标点就搜不到,请问如何解决?
    8 replies  •  2022-11-20 17:43:24 +08:00
    ih8es9OIzne0959p
        1
    ih8es9OIzne0959p  
       Nov 19, 2022 via Android
    我猜,转译 ascll 码
    ih8es9OIzne0959p
        2
    ih8es9OIzne0959p  
       Nov 19, 2022 via Android
    百度上的 1 、查询带有中文标点符号,使用 COLLATE Chinese_PRC_CS_AS_WS ,注意在%%中间输入就要是中文符号。

    select * from TASK where info COLLATE Chinese_PRC_CS_AS_WS like '%,%'
    ih8es9OIzne0959p
        3
    ih8es9OIzne0959p  
       Nov 19, 2022 via Android
    @ajaxgoldfish 大意了,没看题,各位请无视我
    brader
        4
    brader  
       Nov 19, 2022
    刚测试了一下,是可以达到你这个效果的。你再试试。

    CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255),
    body TEXT,
    FULLTEXT ( title , body ) WITH PARSER NGRAM
    ) ENGINE=INNODB CHARACTER SET UTF8MB4;

    INSERT INTO posts(title,body)
    VALUES('MySQL 全文搜索','MySQL 提供了具有许多好的功能的内置全文搜索'),
    ('MySQL 教程','学习 MySQL 快速,简单和有趣');

    SELECT * FROM posts WHERE MATCH (title , body) AGAINST ("快速,简单" IN BOOLEAN MODE);
    brader
        5
    brader  
       Nov 19, 2022
    注意使用 show variables like "%ft%" 和 show variables like "%ngram_token_size%",查看你设置的分词粒度
    brader
        6
    brader  
       Nov 19, 2022
    对了,如果上面那个搜索语句找不到,而你仅仅需要查包含这样的简单场景,还是使用 SELECT * FROM posts WHERE MATCH (title , body) AGAINST ("速," IN natural language MODE); 会好点,分词粒度看你需要,可以设置为 2 ,甚至是 1
    Jiangoogle
        7
    Jiangoogle  
    OP
       Nov 19, 2022
    @brader 不行啊,可能是因为你用的是 InnoDB ?
    我的环境是:mysql5.7.20 ,MyISAM ,
    配置是:ft_stopword_file = '',ngram_token_size = 2

    CREATE TABLE `tmp` (`book_name` char(32) NOT NULL, FULLTEXT KEY `book_name` (`book_name`) WITH PARSER `ngram`) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

    insert into tmp values('你好,我的');

    mysql> select book_name from tmp where match(book_name) against('"你好,"' in boolean mode) ;
    +-----------------+
    | book_name |
    +-----------------+
    | 你好,我的 |
    +-----------------+
    1 row in set (0.00 sec)

    mysql> select book_name from tmp where match(book_name) against('"你好,我的"' in boolean mode);
    Empty set (0.00 sec)

    mysql> select book_name from tmp where match(book_name) against('"你好"' in boolean mode);
    +-----------------+
    | book_name |
    +-----------------+
    | 你好,我的 |
    +-----------------+
    1 row in set (0.00 sec)

    就上边这三种情况,不知道为什么
    Jiangoogle
        8
    Jiangoogle  
    OP
       Nov 20, 2022 via Android
    继续求助
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1133 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:44 · PVG 01:44 · LAX 10:44 · JFK 13:44
    ♥ Do have faith in what you're doing.