/**
 * @module        core/wiki/searcher
 * @description   Wiki BM25F 全文检索（field-weighted Best Matching 25）
 *
 * @layer         core
 *
 * 实现选择：
 *   - **不**用 lunr.js / minisearch / fuse.js —— 多一个 50KB 依赖不值得
 *   - **不**做词干提取（stemming）—— SPS 是技术文档库，词形变化少；stemming
 *     反而把 "Pipeline" 和 "PipelineService" 合并成同一 token，丢辨别力
 *   - **不**做向量 embedding —— v0 BM25 够用；v1 视召回率决定
 *
 * BM25F 通过 field tiling 实现：title 3x / tags 2x / tldr 2x / body 1x
 * 加权方式 = 该 field 内 token 重复 n 次（等价于 BM25F 的 boosting）。
 *
 * 中文支持：ASCII 按词切；中文按字切（朴素 unigram）。够用且无外部依赖。
 *
 * 数据规模：项目 wiki 一般 < 1000 page，~MB 级 corpus。in-memory 索引
 * 占用几 MB，构建 < 100ms，查询 < 10ms。不需要持久化（每次进程启动重建）。
 */
import type { Page, PageType } from './types.js';
export interface BM25Options {
    /** 词频饱和参数；标准值 1.2-2.0 */
    k1?: number;
    /** 长度归一化；0=关 / 0.75=标准 / 1=最大归一 */
    b?: number;
    /** 各字段权重 */
    fieldWeights?: {
        title?: number;
        tags?: number;
        tldr?: number;
        body?: number;
    };
}
export declare function tokenize(text: string): string[];
export interface IndexedDoc {
    readonly pageId: string;
    readonly title: string;
    readonly tags: readonly string[];
    /** 第一段（## TL;DR 之后到下个 ## 之前）；用作字段权重 + 返回值预览 */
    readonly tldr: string;
    /** Body 剩余部分（除 TL;DR 之外） */
    readonly body: string;
    readonly type: PageType;
}
/**
 * 从 Page 对象抽 IndexedDoc。
 * TL;DR 提取规则：找 `## TL;DR\n...\n##` 之间的内容；找不到取 body 前 200 字符。
 */
export declare function pageToIndexed(page: Page): IndexedDoc;
export declare function extractTLDR(body: string): string;
export interface SearchResult {
    readonly pageId: string;
    readonly score: number;
}
export declare class WikiSearcher {
    readonly docs: readonly IndexedDoc[];
    private readonly opts;
    private readonly postings;
    private readonly docLengths;
    private readonly avgDocLength;
    constructor(docs: readonly IndexedDoc[], opts?: BM25Options);
    /**
     * 全字段加权的 token stream。同一个 token 在 title 出现一次 = title weight 个副本。
     */
    private tokenizeDoc;
    search(query: string, limit?: number): SearchResult[];
    /** 按 tag 集合过滤（OR 语义）—— 用于 reader.ts 的 skill-match layer */
    searchByTags(tags: readonly string[], limit?: number): SearchResult[];
    /** 按 type 列出（不打分；reader.ts 排序用） */
    byType(type: PageType): IndexedDoc[];
}
//# sourceMappingURL=searcher.d.ts.map