Excel VBA | SQLite FTSでページング検索+COUNT+MAX(score)を組み合わせて上位候補の関連度を表示する応用例

Excel VBA VBA
スポンサーリンク

SQLiteの FTS(Full-Text Search) では、検索結果に関連度スコア(rank)を付与できます。
これに COUNT(*)(総件数)と MAX(rank)(最大スコア)を組み合わせることで、検索結果の全体像と上位候補の関連度を同時に把握できます。
これにより「全体で何件あるか」「最も関連度が高い候補はどれか」をユーザーに提示できます。


FTSテーブル作成例

-- FTS5を利用した住所検索用テーブル
CREATE VIRTUAL TABLE PostalFTS USING fts5(
    PostalCode,
    Prefecture,
    City,
    Town,
    content=''
);

-- 通常のPostalTableからデータをコピー
INSERT INTO PostalFTS(PostalCode, Prefecture, City, Town)
SELECT PostalCode, Prefecture, City, Town FROM PostalTable;
SQL

検索SQL例(ページング+COUNT+MAX)

-- 総件数と最大スコアを取得
SELECT COUNT(*) AS TotalCount, MAX(rank) AS MaxScore
FROM PostalFTS
WHERE PostalFTS MATCH '東京都';

-- ページング検索(例:2ページ目、10件ずつ)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 10;
SQL

💡 これで「東京都に一致する住所は全部で何件あるか」と「最も関連度が高い候補のスコア」を同時に把握できます。


VBAコード例(ページング+COUNT+MAX)

Sub QueryPostalSQLiteFTSPagingWithCountMax()
    Dim conn As Object, rs As Object
    Dim dbPath As String, keywords As String
    Dim pageSize As Integer, pageNum As Integer
    Dim totalCount As Long, maxScore As Double
    
    dbPath = "C:\data\PostalCache.sqlite"
    
    ' SQLite接続(ODBCドライバ利用)
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
    
    ' 検索キーワード
    keywords = "東京都"
    
    ' ページサイズとページ番号
    pageSize = 10
    pageNum = 2   ' 例:2ページ目
    
    ' 総件数と最大スコアを取得
    Set rs = conn.Execute("SELECT COUNT(*), MAX(rank) FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "'")
    totalCount = rs.Fields(0).Value
    maxScore = rs.Fields(1).Value
    rs.Close
    
    ' OFFSET計算
    Dim offsetVal As Integer
    offsetVal = (pageNum - 1) * pageSize
    
    ' ページング検索
    Set rs = conn.Execute("SELECT PostalCode, Prefecture, City, Town, rank " & _
                          "FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "' " & _
                          "ORDER BY rank LIMIT " & pageSize & " OFFSET " & offsetVal)
    
    ' 結果をImmediate Windowに表示
    Debug.Print "=== 検索結果: " & totalCount & "件中 ページ " & pageNum & " ==="
    Debug.Print "最高関連度スコア: " & maxScore
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value & " → " & rs.Fields(1).Value & rs.Fields(2).Value & rs.Fields(3).Value & _
                    " (score=" & rs.Fields(4).Value & ")"
        rs.MoveNext
    Loop
    
    rs.Close
    conn.Close
End Sub
VB

実行イメージ

検索条件:東京都

  • 総件数:250件
  • 最大スコア:12.0
  • ページサイズ:10件
  • ページ番号:2ページ目(11〜20件目)

出力例:

=== 検索結果: 250件中 ページ 2 ===
最高関連度スコア: 12
1000011 → 東京都千代田区大手町 (score=11)
1000012 → 東京都千代田区丸の内 (score=10)
...

実務での応用

  • 総件数+上位候補の関連度を提示 → ユーザーに検索全体の状況を分かりやすく表示
  • 顧客データ補完 → 曖昧な住所入力から最も関連度の高い候補を提示
  • 検索UI改善 → ページングとスコア表示でユーザー体験を向上
  • 分析業務 → 全件数と関連度分布を把握して統計処理に活用

💡 COUNT(*)MAX(rank)LIMIT+OFFSET を組み合わせることで、検索結果の全体像と上位候補の関連度を同時に提示でき、業務効率やユーザー体験が大幅に向上します。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました