这里的丐版 mongodb 即社区版 mongodb, 社区版本的 mongodb 全文搜索不支持中文引擎, 戏说丐版, 对比企业或者 Altas Search 如同乞丐, 想要实现需要亲力亲为, 自己做中文分词

环境

后端为 nestjs, orm 为 mongoose, 数据库为 mongodb, github 仓库地址

mongodb

方便开发及测试, 使用 docker 本地部署, 相关 yml 内容如下

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - 27017:27017
    volumes:
      # 数据文件
      - ./volumes/mongodb/db:/data/db
      # 备份文件
      - ./volumes/mongodb/backup:/data/backup
      # logs 文件
      - ./volumes/mongodb/logs:/data/logs
      # 配置文件
      - ./volumes/mongodb/conf:/etc/mongod.conf
      # init script
      - ./volumes/mongodb/scripts:/docker-entrypoint-initdb.d/
    # command: ["--replSet", "rs0"]
    # rs.initiate({"_id": "rs0", "members":[{"_id": 0, "host": "192.168.10.121:27017"}]});
    environment:
      - TZ=Asia/Shanghai
    networks:
      - dev
networks:
  dev:
    name: local-dev
services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - 27017:27017
    volumes:
      # 数据文件
      - ./volumes/mongodb/db:/data/db
      # 备份文件
      - ./volumes/mongodb/backup:/data/backup
      # logs 文件
      - ./volumes/mongodb/logs:/data/logs
      # 配置文件
      - ./volumes/mongodb/conf:/etc/mongod.conf
      # init script
      - ./volumes/mongodb/scripts:/docker-entrypoint-initdb.d/
    command: mongod --replSet rs0
    healthcheck:
      test: |
        mongosh --eval "try { rs.status().ok } catch (e) { rs.initiate({ _id: 'rs0', members: [{ _id: 0, host: 'localhost:27017' }] }).ok }"
      start_period: 0s
      interval: 500ms
      timeout: 5s
      retries: 5
    # rs.initiate({"_id": "rs0", "members":[{"_id": 0, "host": "192.168.10.121:27017"}]});
    environment:
      - TZ=Asia/Shanghai
    networks:
      - dev
networks:
  dev:
    name: local-dev
docker compose -f docker-compose.yml pull
docker compose -f docker-compose.yml up -d

nestjs

# pnpm add -g @nestjs/cli
# npm i -g @nestjs/cli
nest new fulltext-search
cd fulltext-search
pnpm i
  • 仓库 init
  • tsconfig.json 配置严格模式
  • monorepo -> app, sub-mongo-change
  • lib -> db
  • mongoose
  • e2e 测试
  • ts-mongo 迁移脚本 数据处理及填充
  • @node-rs/jieba 分词
  • sub-mongo-change 监听回写
  • 简单测试查询
  • 多实体检测
  • 一些其他考虑 (值对象, 分词算法, 同数据源回写, 对比 es, 带来的一些好处和坏处, 不同场景下的一些抉择)