4

私はPostgreSQLデータベースを使用しています。

構造を持つmetadatavalueという名前のテーブルを持つことは次のとおりです。

metadatavalue_id    integer  Primary Key Auto Increment
metadta_field_id    integer  Foreign Key
text_Value      varchar
text_lang       varchar
place           integer

何かが送信または追加されると、ほぼ25のメタデータフィールドを持つアイテムが作成されます。

メタデータ値テーブルにはすでに

1億5千(150000)レコード。

テーブルにmetadata_field_idとして保存されている「作成者」などのフィールドのオートコンプリート機能を実装しています。

PgSQLプロンプトでテーブルをクエリすると、結果が返されるまでに1〜2秒かかります。

質問:

SELECT metadatavalue.text_value AS author, count(metadatavalue.text_value) AS count
   FROM metadatavalue
  WHERE (metadatavalue.metadata_field_id IN ( SELECT metadatafieldregistry.metadata_field_id
           FROM metadatafieldregistry
          WHERE metadatavalue.text_value LIKE 'Pra%' AND metadatafieldregistry.metadata_schema_id = 1 AND metadatafieldregistry.element::text = 'contributor'::text))
  GROUP BY metadatavalue.text_value;

オートコンプリートの場合、ユーザーが値を入力すると、クエリが4〜5回実行される可能性があります。

そこで、LUCENEベースの検索を実装することを考えています。

その中で、最初にバックエンドからインデックスを作成し、次に新しいアイテムの作成ごとにスレッドを実行して新しいアイテムにインデックスを付けます。

Apache Luceneがより良い選択であるか、SQLを最適化できるかを知りたいです。

編集:メタデータフィールドを含む別のテーブルがあり、値のmetadatavalueテーブルで外部キー(metadatafieldregistry.metadata_field_id)として使用されます。

4

3 に答える 3

1

このような小さなデータセットに対するプレフィックスクエリでは、必要な列に適切なインデックスが付けられていれば、SolrとPostgreSQLの両方が非常にうまく機能するはずです。

于 2012-07-30T20:40:30.553 に答える
1

適切なインデックス作成が行われれば、どのデータベースでも少なくとも100万行が適切に処理されると思います。インデックスとDBの最新の状態との同期など、新しいタスクを紹介するLuceneやSolrに入る理由はありません。 。

また、LuceneまたはSolrは、フリーテキスト検索に非常に適しています。つまり、Luceneの「ドキュメント」で「BobMarley」を検索すると、「Bob Marley」、「Marley Bob」、または「Bob」のみ、さらには「Marley」または「Bob」を含むすべてのドキュメントが表示されます。 。たくさんのテキスト...マーリー」。したがって、Luceneの使用は、カバーしようとしているユースケースの種類にも依存します。

metadatavalue.text_value metadatafieldregistry.metadata_schema_idあなたが示したクエリから、インデックスとmetadatafieldregistry.element列を作成すると、優れたパフォーマンスが得られると思います。また、クエリをクエリではなく結合に変換してみてくださいin

ありがとう

于 2012-09-04T08:42:56.973 に答える
1

テーブルのスキーマについては言及していませんmetadatafieldregistry(実際、テーブルは1つだけだと言っていますが、クエリでは2つ使用しています)

出力を見explain analyzeて、クエリプランとは何か、スキャンに時間がかかっているものを確認します。サブクエリには相関関係がありますが、これはほぼ間違いなく適切な計画ではありません。一般に、スキーマはEAVのにおいがします。プレフィックス検索を実行するテキスト値のみを含むインデックスを作成するには、部分インデックスが役立つ場合があります(おそらく制限 metadata_schema_idおよびelement

于 2012-09-04T11:27:25.890 に答える