Excel VBA | SQLite FTSで複雑検索結果をランキング+LIMITで上位候補だけ抽出する応用例

VBA
スポンサーリンク

SQLiteの FTS(Full-Text Search) では、検索結果に関連度スコア(rank)を付与して並べ替えることができます。さらに LIMIT を組み合わせることで、上位候補だけを抽出することが可能です。これにより「複雑検索条件で候補を絞り込み、最も関連度の高い住所だけを提示」できます。


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例(複雑検索+ランキング+LIMIT)

-- 条件: 東京都 AND 渋谷区 OR 神奈川県
-- 除外: 新宿
-- 近接: 渋谷 NEAR 道玄坂
-- 上位3件のみ抽出
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂'
ORDER BY rank
LIMIT 3;
SQL

💡 ORDER BY rank LIMIT 3 により、関連度の高い上位3件だけを返します。


VBAコード例(複雑検索+LIMIT)

Sub QueryPostalSQLiteFTSLimit()
    Dim conn As Object, rs As Object
    Dim dbPath As String, keywords As String
    
    dbPath = "C:\data\PostalCache.sqlite"
    
    ' SQLite接続(ODBCドライバ利用)
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
    
    ' 複雑検索条件
    keywords = "(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂"
    
    ' FTS検索+ランキング+LIMIT
    Set rs = conn.Execute("SELECT PostalCode, Prefecture, City, Town, rank " & _
                          "FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "' ORDER BY rank LIMIT 3")
    
    ' 結果をImmediate Windowに表示
    Debug.Print "=== 上位3件の検索結果 ==="
    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

実行イメージ

検索条件:(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂
上位3件のみ抽出

郵便番号都道府県市区町村町域スコア
1500003東京都渋谷区道玄坂1
2200012神奈川県横浜市西区みなとみらい3
1500002東京都渋谷区渋谷5

実務での応用

  • 候補を絞り込み → 複雑検索条件でも上位数件だけを提示
  • 顧客データ補完 → 曖昧な住所入力から最も関連度の高い候補を返す
  • ユーザー入力支援 → 郵便番号検索フォームで候補をランキング順に提示
  • マーケティング分析 → 特定地域に関連する顧客を上位候補だけ抽出して分析

💡 ORDER BY rank LIMIT n を組み合わせることで、複雑検索でも必要な候補だけを効率的に抽出できます。

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