Rails で pg_search gem を使用してトライグラム検索を実装しました。https://github.com/Casecommons/pg_search
問題は、返される結果の順序が、gem ドキュメントを表示するトライグラム検索の定義に従って正しくないように見える場合があることです。
トライグラム検索は、クエリとテキストの間で一致する 3 文字の部分文字列 (または「トライグラム」) の数をカウントすることによって機能します。
私のアプリケーションは、ユーザーからの文字列入力 (「111 Streetname」) を受け取り、トリグラムによる近似検索で Address.full_string 値に一致する住所のリストを返します。
検索例一覧
トライグラム検索: 「1493 カンブリッド」
- 結果:
- 100 ケンブリッジ プレイス
- 100 ケンブリッジ プレイス
- 150ケンブリッジパーク博士
- 1575 ケンブリッジ ストリート
- 1573 ケンブリッジ ストリート
- 1493 ケンブリッジ ストリート
トライグラム検索: 「1493 cambr」
- 結果:
- 1493 ケンブリッジ ストリート
トライグラム検索: 「1493 カンブリ」
- 結果:
- 1575 ケンブリッジ ストリート
- 1573 ケンブリッジ ストリート
- 1493 ケンブリッジ ストリート
トライグラム検索: 「1493 ケンブリッジ」
- 結果:
- 1493 ケンブリッジ ストリート
- 5 ケンブリッジパーク ドライブ
- 7 ケンブリッジパーク ドライブ
- 100 ケンブリッジ プレイス
- などなど
質問
「1493 Cambridge St」が常に検索結果の一番上に表示されないのはなぜですか? ¿トライグラム検索のクエリを変更する必要がありますか、それともアルゴリズムの動作方法だけですか?
クエリの例
SELECT "addresses".*, (ts_rank((to_tsvector('simple', coalesce("addresses"."full_string"::text, ''))), (to_tsquery('simple', ''' ' || '1493' || ' ''') && to_tsquery('simple', ''' ' || 'cambridge' || ' ''')), 0)) AS pg_search_rank FROM "addresses" WHERE (((coalesce("addresses"."full_string"::text, '')) % '1493 cambridge')) ORDER BY pg_search_rank DESC, "addresses"."id" ASC