4

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
4

1 に答える 1

3

トリグラム検索のマニュアルを引用していますが、実際にはテキスト検索ts_rank()から機能を操作しています。

結果を次の順序で並べると、

(addresses.full_string <-> '1493 cambridge')

...あなたが求めるものを手に入れます。
<->トライグラムの「距離」演算子です。

%で ("similarity") 演算子を使用することもできます。理想的には、この列にWHEREGiST インデックスを作成します。gist_trgm_ops

于 2013-01-18T20:51:42.350 に答える