2012-07-30 54 views
4

我正在使用PostgreSQL数据库。在Lucene或SQL中性能更好

经与结构的命名metadatavalue表如下:

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

如果一切都被提交或几乎25元数据字段创建 添加的项目。

的metadatavalue表已经包含了周围

十五万(150000)的记录。

我正在执行一个字段的自动完成功能,让说“作者” 这是作为metadata_field_id存储在表中。

当我在PgSQL提示符上查询表时,它需要几乎1或2秒才能返回结果。

QUERY:

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的搜索。

其中,At首先从后端创建索引,然后创建每个新项目的索引 创建运行一个线索来索引新项目。

我想知道是否Apache Lucene是更好的选择还是 SQL可以优化。

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

+1

在切换到Lucene之前,为什么不正确索引表?似乎是这样一个激进的措施。 – usr 2012-07-30 18:48:18

回答

1

我会说任何数据库将适当地处理至少一百万行,如果适当的索引完成,没有理由进入Lucene或Solr,它会向您介绍新的任务,如索引与最新的同步DB的状态。

此外,Lucene或Solr非常适合自由文本搜索。这意味着如果您在Lucene的“文档”上搜索“Bob Marley”,那么您将获得所有包含“Bob Marley”,“Marley Bob”或仅“Bob”以及仅“Marley”或甚至“Bob”的文档。文字......。马利“。所以使用Lucene也取决于你想要覆盖哪种用例。

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

感谢

+0

非常感谢Lucene的回答和简介。我将检查与查询建议并取回更新 – 2012-09-04 09:09:40

+0

以前的查询是第一次运行需要近2秒,然后在数据库控制台上后续运行600毫秒 我已更改为内部连接,并且它需要将近510毫秒首次运行时间大约为300毫秒,甚至比后续运行的时间要少。感谢您,您的建议奏效。 – 2012-09-11 17:56:05

1

通过在这样一个小数据集上进行前缀查询,Solr和PostgreSQL应该能够很好地执行,只要所需的列被正确索引。

+0

查询只是一个例子。假设我在文本框中输入“Pr”,那么它应该查询给定字段中具有起始值“Pr”的所有行 – 2012-07-31 03:35:39

1

你不提metadatafieldregistry表的架构(其实你说你只有一个表,但是您的查询使用两个)

看那explain analyze输出,看看有什么查询计划是什么,以及需要花费什么时间来扫描。你的子查询是相关的,这几乎肯定不是一个好计划:一般来说,EAV的模式气味。你可能会发现一个有用的部分索引,以产生一个只包含那些你想做前缀搜索的文本值的索引(可能限制metadata_schema_idelement

+0

为子查询点+1。该查询是由其他人编写的,我正在使用它。编辑其他表格细节的问题。谢谢 – 2012-09-12 06:00:23