zsdnishishui的博客

唯有创造才是“真”

中文全文搜索、多数据源

1.中文全文搜索

许多数据库都有全文搜索的功能,比如mysql、postgresql、mongodb(不支持中文分词)

比较专业的全文搜索,则是es,但是有一定的运维成本和学习成本

要理解全文检索,有两个概念比较关键:倒排索引、中文分词

倒排索引:可以先理解什么叫正排索引,通过文章id,去获取文章内容。倒排索引就是根据文章内容(关键字)获取文章id。可以参考维基百科

中文分词:英文分词是按照空格分词,但是中文就比较麻烦,许多数据库都要安装中文分词插件。推荐结巴分词。

mysql自带中文的全文检索,所以使用语法比较简单。

postgresql没有中文的全文检索,安装插件又比较麻烦,所以可以采用应用层分词的方案。

关于 PostgreSQL 全文检索的实战 – 中文分词、查询、索引、权重、排序

2.多数据源

其成熟的方案有:baomidou(轻量),sharding-jdbc(比较重)

个人比较倾向于baomidou.可以实现多个从库的自动负载

踩的坑:

高版本的mysql,需要设定useSSL=false/true

不建议默认走从库,特别是读写分离的时候。

spring:
  datasource:
    dynamic:
      # 设置默认的数据源或者数据源组,默认值即为master
      primary: master
      # 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      strict: false
      datasource:
        master:
          driver-class-name: org.postgresql.Driver
          password: 123456
          url: jdbc:postgresql://192.168.56.101:5432/postgres
          username: postgres
        slave_1:
          url: jdbc:mysql://192.168.56.101:3306/file_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          driver-class-name: org.postgresql.Driver
          password: 123456
          url: jdbc:postgresql://192.168.56.101:5432/postgres
          username: postgres
      # 自定义负载均衡策略。slave组下有;多个个数据源,当用户使用 slave 切换数据源时会使用负载均衡算法。系统自带了两个负载均衡算法 LoadBalanceDynamicDataSourceStrategy 轮询,是默认的。 RandomDynamicDataSourceStrategy 随机的。
      strategy: com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy

目录