Open algorithm
順位の付け方は、全部見せる。
HeSearch は検索アルゴリズムを公開します。以下は現行の実装そのままの説明です。 検索画面の「HiRank(新)/標準/学習」から、いつでも切り替えられます。
候補の作り方
本文・タイトル・説明を PGroonga(TokenMecab)で全文索引しています。本文は先頭 8,000 文字までを索引対象にしています。クエリ語ごとに同義語を OR 拡張し、グループ間は AND で絞ります。
検索演算子として -除外語(除外)、"フレーズ"(完全一致)、OR(いずれかを含む)に対応しています。例:ラーメン -つけ麺 や "君の名は" 映画 のように書けます。
タイトル全体にクエリを含むページは優遇し、質問文(〜とは・〜とは何か・?など)では FAQ の構造化データを持つ Q&A ページを優遇します。 「〜とは」付きで0件のときは核(「君の名はとは」→「君の名は」)で再検索し、 それでも0件なら語を1つずつ外して緩和します(緩和時は「○○で検索しました」と表示)。 英数・和文の境界(「日本におけるGoogle」など)は空白補完した変種も OR で混ぜ、原文を主として評価します。タイトルの空白有無は同一視します。
キーワードスコアは各列の PGroonga スコアの最大値を使い、ln(1 + kw) で飽和させます。 本文・JSONB などの重い列は、上位に絞ってからだけ読みます。 総件数は別途正確に数え、スコア付けの対象はキーワード上位 5,000 件に絞っています(各列の上位1万件までを寄せ集めるため、大量ヒットでも破綻しません)。
標準スコア(線形和)
+ pagerank×pr + freshness×fr + authority×au + ctr×ctr
+ navigational + homepage + landing − wiki非記事
ブランド名クエリで、その登録可能ドメイン直下(www 含む)のホームが見つかった場合は landing 加点に加え、TLD 別の上乗せ(.com +2.0/.co.jp +1.6/.jp +1.2/.net +1.0/.org +0.4)があります。
HiRank(信頼の乗算)
信頼の低いページは、関連度が高くても上位に来にくくします。信頼係数 T を関連度に掛け算し、公式・ブランド加点はその後に足します。
score = T × BM25F(本文/タイトル/説明/鮮度) + 公式・ブランド加点
学習は、検証に通ったものだけ。
クリック集計からロジスティック回帰で重みを学習します。特徴量は bm25 / title / desc / pagerank / freshness / authority の6つで、スケール差を吸収するため標準化して学習し、生特徴量の重みに変換し直します。
データは決定的に4分割してホールドアウト検証し、訓練データ 400 エポック(学習率 0.1、L2 1e-3)で学習します。検証 AUC が 0.55 未満、またはサンプルが 200 件未満のモデルは有効化しません。 配信時も AUC 0.52 未満のモデルは無視し、既定の重みに戻ります。 過去には精度のないモデルが順位を逆転させたことがあり、この仕組みで再発を防いでいます。
埋め尽くしを許さない。
同一サイト(登録可能ドメイン単位)からの表示数に上限を設けます。Wikipedia は全言語を1サイトとして扱い1件まで。単一語のブランドクエリはブランド系列で1件、 複数語なら2件まで。その他のサイトは2件までです。
クエリ言語の Wikipedia を優先し、英語版が出た場合は言語間リンク(langlinks)で 日本語版が索引にあれば差し替えます。Wikipedia のプロジェクト名前空間(Wikipedia: や Portal: など)は大幅に降格します。
運用も公開する。
ランキングの全再計算は6時間ごと(変更の無い行は更新しない)、学習は1日1回です。 同一クエリの再実行は60秒だけキャッシュします。robots.txt と noindex は尊重し、オプトアウト・ブロックの申告は検索から除外します。