1

これはやや複雑ですが単純な問題です。オブジェクトに保存できる小さなアプリケーションを作成しています。そのオブジェクトには、タイトル、説明、タグ、およびサブオブジェクトがあります。件名にはコメントが含まれています。検索フィールドを使用してこれらのオブジェクトの一致を見つけるには、どのような方法が理想的でしょうか。

例: object 1 {id:1, title:test, description:fun, tags:[{games, toys}]} subobject 1 {lid:1, comment:'これは楽しくて速い'}

私が検索すると言う:楽しい高速。または検索: テスト

それらのいずれかが同じオブジェクトを返すようにしたいと思います。

変数をスペースまたはコンマで分解して配列を作成する必要があることは理解していますが、どのように正確に SQL を構築すればよいでしょうか。

洗練されたページ ランク アルゴリズムを作成しようとしているわけではありません。タイトル、タグ、または説明による検索に制限する必要がある場合はそうします。

注: これは単純なアプリです。オプションを探しているだけです。

4

2 に答える 2

1

私が知っている最も簡単な方法は、PostgreSQL トライグラム検索を使用することです。次のようなテーブルがあるとします。

CREATE TABLE t (id int NOT NULL PRIMARY KEY, value text);
INSERT INTO t VALUES (1, '{id:1, title:test, description:fun, tags:[{games, toys}]} subobject 1 {lid:1, comment:''this is fun and fast''}');

これで検索の準備ができます:

CREATE EXTENSION pg_trgm;
CREATE INDEX t_trgm ON t USING gin (value gin_trgm_ops);
SELECT set_limit(0.05);

拡張機能をインストールする必要があるのは、データベースごとに 1 回だけです。GiST または GIN インデックスを使用できます。対応する操作セットを使用するだけです。一般的に、GiST の方が更新が高速です。通常、GIN の方が検索が高速です。そのため、最適な選択はワークロードによって異なります。文字列の小さな部分での一致に満足しているように見えるので、接続の類似度制限を 5% に設定しました。必要に応じて調整します。この制限はセッションベースであるため、% 演算子を使用する前に接続で設定する必要があることに注意してください。

そのセットアップを行った後、検索は次のとおりです。

SELECT * FROM t WHERE value % 'test';
SELECT * FROM t WHERE value % 'fun fast';

これほど単純なことはありません。

テーブルに行が 1 つしかない場合はおそらくインデックスを使用することさえありませんが、数百万行の検索が必要な実稼働データベースで、類似性検索は通常数十ミリ秒で実行されることがわかりました。

http://www.postgresql.org/docs/current/interactive/pgtrgm.html

于 2012-04-28T19:51:19.577 に答える
0

最も簡単な方法は、フィールドを JSON オブジェクトに結合し、それを MongoDB または別の JSON データベースに配置することです

于 2012-04-27T19:34:51.470 に答える