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 を組み合わせることで、検索結果の全体像と上位候補の関連度を同時に提示でき、業務効率やユーザー体験が大幅に向上します。


