Skip to content

增强搜索与摘要生成:提高站内检索命中率

对应代码:app/repository/base/BaseStandardRepository.js 中的 _buildEnhancedSearchCondition_generateSearchVariants_processResult(含搜索摘要生成)。

TL;DR

  • 搜索关键词会先被清洗、拆词、生成格式/拼写/缩写变体,再交给数据库特定的匹配逻辑
  • 默认使用增强搜索,子类可重写 _buildDatabaseSpecificSearchConditions 适配不同数据库
  • 在返回分页结果时,若传入 searchkey,会尝试生成命中摘要写入 docs

实战示例

js
class CommentRepository extends BaseStandardRepository {
  constructor(ctx) {
    super(ctx, 'Comment');
  }

  _getDefaultSearchKeys() {
    return ['content', 'authorName'];
  }

  async search(payload = {}, options = {}) {
    const searchKeys = this._getDefaultSearchKeys();
    const searchCondition = this._buildSearchCondition(payload.searchkey, searchKeys, { debug: options.debug });
    const filters = this._mergeQueryConditions(options.filters, searchCondition);
    const params = this._standardizeParams(payload, { filters });
    const result = await this.adapter.find(params);
    return this._processResult(result, payload, options);
  }
}

机制解读

  • 关键词预处理_preprocessSearchKey 会清理特殊字符并合并多余空格,得到基础搜索词。
  • 变体生成_generateSearchVariants 会创建 words/phrases/combinations,覆盖 kebab/snake/camel、大小写、缩写、常见拼写、数字文本化等。
  • 数据库特定条件:由子类 _buildDatabaseSpecificSearchConditions 实现,针对 MongoDB/MariaDB 构造正则/LIKE 或全文索引条件。
  • 摘要生成_processResult 若检测到 _searchContextpayload.searchkey,会调用 _generateSearchSnippets(在 EnhancedDataTransformer 中)为文档添加高亮或片段。
  • 调试日志:开发模式或 options.debug 时,_logSearchDebugInfo 会输出关键词、变体、搜索字段与最终条件,便于调整权重。

内链参考

最后更新于: