这里的丐版 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, 带来的一些好处和坏处, 不同场景下的一些抉择)
这篇文章详细介绍了在 NestJS 后端使用 MongoDB 社区版实现中文全文搜索的过程。作者通过分词、数据回写等方法弥补了社区版 MongoDB 在中文搜索方面的不足,体现了较强的动手能力和解决问题的能力。
文章结构清晰,从环境搭建到具体实现都有较为详细的说明,其中 Docker 配置部分和 NestJS 项目初始化步骤尤其详尽,对读者理解整个过程很有帮助。尤其是作者在分词逻辑、数据回写等核心环节的处理上展现了较好的工程实践能力,并且提供了相关的代码示例,方便读者参考和复现。
如果要提出改进建议的话,可以考虑以下几点:
Docker 配置部分:文中前后出现了两段几乎相同的 Docker Compose 配置内容,建议整合为一个完整的配置示例,避免重复。
分词逻辑与性能优化:在中文全文搜索的实际应用中,可能会遇到海量数据下的性能问题。可以补充一些关于如何优化分词速度、索引存储效率等方面的内容。
多语言支持:虽然本文聚焦于中文,但可以扩展讨论一下如果需要支持多种语言时的解决方案和注意事项。
与 ElasticSearch 的对比分析:文章中提到的一些对比内容可以更深入一些。比如在不同场景下(如实时性要求、查询复杂度等),MongoDB 和 ElasticSearch 各自的优势在哪里。
实际应用案例:可以增加一些实际应用场景的介绍,比如搜索结果排序策略、模糊匹配处理方法等,这样可以让读者更好地理解整个系统的完整性和灵活性。
总体来看,这篇文章内容扎实,逻辑清晰,展现了作者对技术问题的深入思考和解决方案的能力。建议继续分享更多关于中文全文搜索的实际应用经验和优化技巧,相信会对更多开发者有所帮助。
这篇博客介绍了如何在社区版的MongoDB中实现全文搜索,并提供了具体的环境配置和代码示例。作者使用nestjs作为后端框架,mongoose作为ORM,以及docker部署MongoDB。
博客中的闪光点在于作者提到了社区版的MongoDB不支持中文引擎,因此需要自己实现中文分词来实现全文搜索功能。作者推荐了@node-rs/jieba作为中文分词工具,并提供了相关的代码示例。
这篇博客的核心理念是在社区版的MongoDB中实现全文搜索功能。我认为这是一个很有实用价值的技术,特别是对于需要处理中文文本的应用程序来说。通过自己实现中文分词,可以更好地支持中文搜索,提高用户体验。
作者在博客中提供了详细的环境配置和代码示例,这对读者来说非常有帮助。同时,作者还提到了一些其他的考虑因素,如值对象、分词算法、同数据源回写等,这些都是对读者来说很有价值的信息。
然而,我认为这篇博客还有一些改进的空间。首先,博客中的代码示例可以更详细一些,包括具体的函数和方法的实现。这样可以帮助读者更好地理解和应用这些代码。其次,博客可以提供更多关于全文搜索的实际应用场景和案例,以便读者更好地理解其实际价值。
总的来说,这篇博客介绍了如何在社区版的MongoDB中实现全文搜索功能,并提供了详细的环境配置和代码示例。这是一个很有实用价值的技术,特别是对于处理中文文本的应用程序来说。我希望作者能进一步完善代码示例,并提供更多实际应用场景和案例,以帮助读者更好地理解和应用这些技术。