全部產品
Search
文件中心

AnalyticDB:Nova BM25常用查詢情境

更新時間:Aug 13, 2026

本文檔涵蓋 Nova BM25 的常見查詢情境,協助您根據業務需求快速找到適合的查詢寫法。

前提說明

本文的所有樣本基於以下索引定義。如果您尚未建立 BM25 索引,請參考以下 SQL 建立樣本索引。關於索引建立的詳細說明,請參見Nova BM25索引和詞典管理

CREATE INDEX docs_bm25_idx ON docs
USING nova_bm25 (body, title, category, rating, publish_at)
WITH (
    text_fields = '{
      "body": {"tokenizer": {"type": "jieba"}},
      "title": {"tokenizer": {"type": "jieba"}},
      "category": {"tokenizer": {"type": "keyword"}}
    }',
    numeric_fields = '{"rating": {}}',
    datetime_fields = '{"publish_at": {}}'
);

查詢結果排序時建議顯式使用 ORDER BY bm25.score(docs) DESC,並保留 LIMIT 以控制返回結果數量。

基礎查詢

自然文字查詢(按 BM25 排序)

當您需要對自然語言文本進行相關性排序檢索時,使用以下查詢寫法。bm25.match(text) 預設等價於 operator => 'or',即任意分詞命中即返回。更多函數參數說明,請參見Nova BM25 Function API參考

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.match('資料庫檢索排序')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

所有分詞結果命中(AND 匹配)

當您需要確保查詢文本的所有分詞結果都被命中時,使用以下查詢寫法。將 operator 設定為 'and' 可實現 AND 匹配,也可以使用 &&& 操作符簡寫。

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.match('資料庫檢索', operator => 'and')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

也可以使用操作符簡寫:

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body &&& '資料庫檢索'
ORDER BY bm25.score(docs) DESC
LIMIT 20;

中文短語查詢

當您需要精確匹配連續的中文短語時,使用以下查詢寫法。bm25.phrase 要求分詞結果按原始順序連續出現。

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.phrase('全文檢索索引')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

進階查詢

日誌和 JSON 內容查詢

當您需要對日誌、JSON 或 HTML 等非結構化常值內容進行全文檢索索引時,使用以下查詢寫法。推薦將原始內容作為查詢參數直接傳入 bm25.match

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.match(
    $q${"level":"error","msg":"全文檢索索引失敗","trace_id":"abc-123"}$q$,
    operator => 'or'
)
ORDER BY bm25.score(docs) DESC
LIMIT 20;

結構化過濾(組合 SQL 條件)

當您在全文檢索索引的同時需要按結構化欄位(如分類、評分、時間等)進一步篩選結果時,使用以下查詢寫法。在 WHERE 子句中組合 @@@ 全文檢索索引條件與普通 SQL 條件即可。

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.match('資料庫 檢索')
  AND category = 'tech'
  AND rating >= 4
  AND publish_at >= '2024-01-01'
ORDER BY bm25.score(docs) DESC
LIMIT 20;

多欄位加權查詢

當您需要同時在多個欄位中檢索並為不同欄位設定不同權重時,使用以下查詢寫法。通過 bm25.multi_match 函數,您可以指定各欄位的權重係數(如標題權重為 5、本文權重為 2)。

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.multi_match(
    ARRAY['title^5', 'body^2'],
    query => '全文檢索索引',
    operator => 'or'
)
  AND category = 'tech'
ORDER BY bm25.score(docs) DESC
LIMIT 20;

組合應用

BM25 + 向量混合檢索(RRF)

當您需要同時利用 BM25 關鍵詞匹配和向量語義相似性進行混合檢索時,使用以下查詢寫法。通過 Reciprocal Rank Fusion(RRF)演算法融合兩路排序結果,獲得更全面的檢索效果。

WITH
bm25_top AS (
    SELECT id, row_number() OVER (ORDER BY bm25.score(docs) DESC) AS bm25_rank
    FROM docs
    WHERE body @@@ bm25.match('資料庫 檢索 排序')
    ORDER BY bm25.score(docs) DESC
    LIMIT 100
),
vec_top AS (
    SELECT id, row_number() OVER (ORDER BY embedding <#> :query_embedding) AS vec_rank
    FROM docs
    ORDER BY embedding <#> :query_embedding
    LIMIT 100
),
rrf AS (
    SELECT COALESCE(b.id, v.id) AS id,
           COALESCE(1.0 / (60 + b.bm25_rank), 0) + COALESCE(1.0 / (60 + v.vec_rank), 0) AS rrf_score
    FROM bm25_top b FULL JOIN vec_top v USING (id)
)
SELECT d.id, d.title, r.rrf_score
FROM rrf r JOIN docs d USING (id)
ORDER BY r.rrf_score DESC
LIMIT 20;

BM25 + JOIN

當您需要將 BM25 全文檢索索引結果與其他表進行關聯查詢時,使用以下寫法。全文檢索索引條件與普通 JOIN 文法可以自由組合。

SELECT d.id, d.title, c.label, bm25.score(d) AS score
FROM docs d
JOIN categories c ON d.category = c.category
WHERE d.body @@@ bm25.match('資料庫檢索')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

BM25 + GROUP BY 彙總統計

當您需要對 BM25 檢索結果進行分組彙總統計時,使用以下寫法。全文檢索索引條件可與 GROUP BY 及彙總函式自由組合。

SELECT category, COUNT(*) AS cnt, SUM(rating) AS total_rating
FROM docs
WHERE body @@@ bm25.match('資料庫')
GROUP BY category
ORDER BY cnt DESC;

結果展示

高亮和片段(snippet/snippets)

當您需要在檢索結果中高亮顯示匹配的關鍵詞片段時,使用以下查詢寫法。bm25.snippet 返回單個高亮片段,bm25.snippets 返回多個高亮片段。

SELECT id, title, bm25.score(docs) AS score,
       bm25.snippet(body, '<em>', '</em>') AS snippet
FROM docs
WHERE body @@@ bm25.match('資料庫檢索')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

多片段返回:

SELECT id, bm25.snippets(body, '<em>', '</em>', 120, 3, 0, 'score') AS snippets
FROM docs
WHERE body @@@ bm25.match('全文檢索索引')
ORDER BY bm25.score(docs) DESC
LIMIT 20;

More Like This(相似內容檢索)

當您需要根據已有內容尋找相似文檔時,使用以下查詢寫法。bm25.more_like_this 函數基於指定樣本內容提取關鍵詞,檢索與之相似的文檔。

SELECT id, title, bm25.score(docs) AS score
FROM docs
WHERE body @@@ bm25.more_like_this(
    document => '{body:"機器學習 神經網路 資料"}',
    min_term_frequency => 1,
    min_doc_frequency => 1,
    max_query_terms => 10
)
ORDER BY bm25.score(docs) DESC
LIMIT 20;