14

全文検索については知っていますが、それはクエリを個々の単語に対してのみ一致させます。クエリ内の単語で始まる単語を含む文字列を選択したいと考えています。たとえば、次のように検索すると:

appl

以下が一致する必要があります。

a really nice application
apples are cool
appliances

これらの文字列にはすべて で始まる単語が含まれているためapplです。また、一致する単語の数を選択して、それに基づいてソートできるとよいでしょう。

これを PostgreSQL に実装するにはどうすればよいですか?

4

2 に答える 2

16

全文検索によるプレフィックスマッチング

FTS はプレフィックス マッチングをサポートしています。クエリは次のように機能します。

SELECT * FROM tbl
WHERE  to_tsvector('simple', string) @@ to_tsquery('simple', 'appl:*');

に追加されていることに注意して:*くださいtsquery。これはインデックスを使用できます。見る:

正規表現による代替

SELECT * FROM tbl
WHERE  string ~ '\mappl';

ここでマニュアルを引用:

\m.. 単語の先頭のみに一致

一致数で並べ替えるには、次を使用できますregexp_matches()

SELECT tbl_id, count(*) AS matches
FROM  (
   SELECT tbl_id, regexp_matches(string, '\mappl', 'g')
   FROM   tbl
   WHERE  string ~ '\mappl'
   ) sub
GROUP  BY tbl_id
ORDER  BY matches DESC;

またはregexp_split_to_table():

SELECT tbl_id, string, count(*) - 1 AS matches
FROM  (
   SELECT tbl_id, string, regexp_split_to_table(string, '\mappl')
   FROM   tbl
   WHERE  string ~ '\mappl'
   ) sub
GROUP  BY 1, 2
ORDER  BY 3 DESC, 2, 1;

ここでdb<>fiddle
古いsqlfiddle

Postgres 9.3 以降には、トリグラム GIN または GiST インデックスを使用した単純な正規表現のインデックス サポートがあります。Postgres 9.3 のリリース ノート:

pg_trgm に正規表現検索のインデックス作成のサポートを追加しました (Alexander Korotkov)

見る:

Depesz は、正規表現のインデックス サポートについてブログを書きました。

于 2013-10-15T04:01:31.227 に答える
11
SELECT * FROM some_table WHERE some_field LIKE 'appl%' OR some_field LIKE '% appl%';

一致する単語の数をカウントすることに関しては、postgre で動的に行うにはコストがかかりすぎると思います (他の誰かがもっとよく知っているかもしれませんが)。これを行う 1 つの方法は、文字列内の出現回数をカウントする関数を作成し、次に を追加することORDER BY myFunction('appl', some_field)です。繰り返しますが、この方法は非常にコストがかかる (つまり遅い) ため、お勧めできません。

そのようなことについては、Sphinx Search (google it) のような、そのようなことに特化した別の無料の全文検索エンジンを使用する必要があります。

これに代わる方法は、キーワードと、各文字列でのそれらのキーワードの出現回数を含む別のテーブルを用意することです。つまり、各フレーズ (例: really really nice application) を保存し、キーワードを別のテーブル (例: really, 2nice, 1application, 1) に保存し、そのキーワード テーブルをフルフレーズ テーブルにリンクする必要があります。これは、文字列をデータベースに入力するときにキーワードに分割し、2 つの場所に保存する必要があることを意味します。これは典型的な容量と速度のトレードオフです。

于 2013-10-14T21:21:10.167 に答える