mysql 5.7.25 使用全文检索功能

有时项目中需要用到全文检索功能,如果全文检索数量相对较小,并且不希望单独搭建elasticsearch这样的专用索引工具,就可以考虑使用mysql自带的全文检索功能。mysql 5.7.25自带的全文检索功能,有一定的方便性。

在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
本文使用的MySQL 版本是5.7.25,InnoDB数据库引擎。

1. 创建带有全文索引的表

CREATE TABLE `tbl_article_content` (
  `id` bigint(40) NOT NULL AUTO_INCREMENT,
  `article_title` varchar(60) COMMENT '标题',
  `article_summary` varchar(120) COMMENT '摘要',
  `article_content` text NOT NULL COMMENT '内容',
  `article_id` bigint(40) NOT NULL COMMENT '对应文章ID',
  `create_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `artid` (`article_id`) USING BTREE,
  FULLTEXT KEY `article_content` (`article_content`) /*!50100 WITH PARSER `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

/*!50100   */ 它表示5.01.00 版本或者更高的版本,才执行.

 WITH PARSER `ngram`是指定分词引擎。

2. 添加全文索引

如果在创建表的时候未添加全文索引,可以在建表之后进行添加。

create fulltext index article_content on tbl_article_content(article_content) WITH PARSER ngram;

3. 添加测试数据

INSERT INTO `tbl_article_content` VALUES ('2', '文章标题', '文章摘要', '文章内容', '2', '2022-02-05 13:47:55', '2022-02-05 13:47:59');

4. 执行查询

mysql> select * FROM tbl_article_content222 WHERE MATCH(article_content) AGAINST('内容');
+----+---------------+-----------------+-----------------+------------+---------------------+---------------------+
| id | article_title | article_summary | article_content | article_id | create_date         | modified_date       |
+----+---------------+-----------------+-----------------+------------+---------------------+---------------------+
|  2 | 文章标题      | 文章摘要        | 文章内容        |          2 | 2022-02-05 13:47:55 | 2022-02-05 13:47:59 |
+----+---------------+-----------------+-----------------+------------+---------------------+---------------------+
1 row in set

全文查询的关键字为MATCH和AGAINST。

5. 语法

MATCH (col1,col2,...) AGAINST (expr [search_modifier])
search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }

       例如:SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('词1 词2 词3 ... 词m');
    
      即:MATCH 相当于要匹配的列,而 AGAINST 就是要找的内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一种 Python 的 ORM(对象关系映射)库,它提供了一种抽象层,可以用 Python 对象的方式来操作数据库。而 MySQL 全文检索(Full-Text Search)是一种用于处理自然语言的搜索技术,它可以在 MySQL 中进行配置和使用。 在 SQLAlchemy 中,我们可以使用 MySQL全文检索来进行高效的文本搜索。具体步骤如下: 1. 首先,我们需要在 MySQL 中创建一个支持全文检索的表。例如: ```sql CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), description TEXT, FULLTEXT(name, description) ) ENGINE=InnoDB; ``` 这个表包括了 id、name 和 description 三个字段,其中 name 和 description 两个字段被指定为全文检索字段。 2. 然后,在 SQLAlchemy 中定义一个对应的模型类。例如: ```python from sqlalchemy import Column, Integer, String, Text from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Product(Base): __tablename__ = 'products' id = Column(Integer, primary_key=True) name = Column(String(255)) description = Column(Text) ``` 这个模型类对应了 MySQL 中的 products 表,并且使用 SQLAlchemy 提供的 Column 类型来定义了 id、name 和 description 三个字段。 3. 接下来,我们可以使用 SQLAlchemy 提供的 fulltext 模块来执行全文检索。例如: ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy_searchable import make_searchable Base = declarative_base() engine = create_engine('mysql+pymysql://user:password@host:port/dbname?charset=utf8mb4') Session = sessionmaker(bind=engine) make_searchable() class Product(Base): __tablename__ = 'products' id = Column(Integer, primary_key=True) name = Column(String(255)) description = Column(Text) @classmethod def search(cls, query): session = Session() return session.query(cls).search(query).all() ``` 这里我们使用了 SQLAlchemy-Searchable 扩展,它提供了一个 make_searchable() 函数来启用全文检索功能。然后我们在模型类中定义了一个 search() 方法,它接受一个查询字符串并返回符合条件的结果。 4. 最后,我们可以使用 search() 方法来进行全文检索。例如: ```python products = Product.search('foo bar') for product in products: print(product.name, product.description) ``` 这个例子中,我们执行了一个名为 'foo bar' 的全文检索,并遍历了检索结果中的每个产品,然后打印出了产品的名称和描述。 总的来说,使用 SQLAlchemy 和 MySQL 全文检索可以帮助我们在 Python 中高效地进行文本搜索,从而提高了应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值