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 个元数据字段的项目。

元数据值表已经包含

十五万 (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。

编辑:还有另一个包含元数据字段的表,它在元数据值表中用作值的外键(metadatafieldregistry.metadata_field_id)。

4

3 回答 3

1

我想说,如果完成正确的索引,任何数据库都会优雅地处理至少一百万行,你没有理由进入 Lucene 或 Solr,这将向你介绍新任务,例如将索引与数据库的最新状态同步.

此外,Lucene 或 Solr 非常适合自由文本搜索。这意味着如果您在 Lucene“文档”中搜索“Bob Marley”,那么您将获得所有包含“Bob Marley”、“Marley Bob”或只有“Bob”且只有“Marley”甚至“Bob.. .很多文字......马利”。因此,使用 Lucene 还取决于您要涵盖的用例类型。

从您显示的查询中,我觉得如果您索引metadatavalue.text_value metadatafieldregistry.metadata_schema_idmetadatafieldregistry.element列,您将获得良好的性能。还可以尝试将您的查询转换为联接而不是in查询。

谢谢

于 2012-09-04T08:42:56.973 回答
1

通过对如此小的数据集进行前缀查询,只要正确索引所需的列,Solr 和 PostgreSQL 都应该执行得非常好。

于 2012-07-30T20:40:30.553 回答
1

您没有提到metadatafieldregistry表的架构(实际上您说您只有一张表,但您的查询使用了两张)

查看explain analyze输出以了解查询计划是什么,以及什么占用了扫描时间。您的子查询是相关的,这几乎肯定不是一个好的计划:通常,架构闻起来有 EAV 的味道。您可能会发现部分索引很有帮助,它可以生成仅包含您想要对其进行前缀搜索的那些文本值的索引(可能会限制 metadata_schema_idand element

于 2012-09-04T11:27:25.890 回答