私は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)として使用されます。