1

約 150 万レコードの Postgres データベースがあります。私の Ruby on Rails アプリでは、statement_textフィールド (1 から数百の単語を含む可能性があります) を検索する必要があります。

私の問題: pgSearchgem を使用してsearch_all_wordsやのようなスコープを作成できることはわかっていますが、正確に一致するレコードのみが結果セットに返されるsearch_any_wordsようにする最も効率的な方法が何であるかはわかりません。

つまり、"Pope Francis" を検索する場合、これらの 2 つの単語が連続していて同じ順序である場合にのみ検索する必要があります (たとえば、"教皇の名前は Francis" ではありません)。

これまでのところ、GIN インデックスとILIKE完全一致検索を組み合わせただけです。しかし、GIN インデックスが基本的にすべてのレコード内の単語の正確な位置を格納することILIKEによって機能することを考えると、検索語がフィールドと完全に一致することを保証するより効率的な (非) 方法があるはずではありませんか?

4

1 に答える 1

1

一般的に言えば、フルテキストでは、使用する言語辞書に基づいた単語ステミングが必要です。そのため、フルテキスト検索では、ステミングts_rank()なしで関数を使用し、辞書を使用して、検索している語句の関連性を判断できます。'simple'

WITH t(v) AS ( VALUES
  ('Test sentence with Pope Francis'),
  ('Test Francis sentence with Pope '),
  ('The pope is named Francis')
)
SELECT v,ts_rank(tsv,q) as rank
FROM t,
    to_tsvector('simple',v) as tsv,
    plainto_tsquery('simple','Pope Francis') AS q;

結果:

                v                 |   rank    
----------------------------------+-----------
 Test sentence with Pope Francis  | 0.0991032
 Test Francis sentence with Pope  | 0.0973585
 The pope is named Francis        | 0.0973585
(3 rows)

全文検索がなければ、拡張機能を使用したより高速なILIKEパターン マッチングを実装できます。pg_trgm例はこちらです。

于 2016-04-11T20:55:49.260 に答える