2012-07-30 49 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