2012-01-10 64 views
1

我們運行的是Solr 3.4,索引相對較小,大約90,000個文檔。這些文件被分割在若干個邏輯源等等每個搜索將具有用於特定源所施加的濾波器查詢,e.g:Solr * vs *:*查詢性能

?q=<query>&fq=source:<source> 

其中source是一個典型的字符串字段。我們正在使用edismax並且有一個默認搜索字段文本

我們目前看到q=*的平均運行時間比q=*:*長20倍。差異很明顯,*:*需要100ms,*需要3500ms。在文檔集中搜索常用詞(匹配所有文檔的近50%)將在不到200毫秒的時間內返回結果。

看着與debugQuery查詢,我們可以看到,*被解析到一個DisjunctionMaxQuery((text:*)),而*:*被解析到一個MatchAllDocsQuery(*:*)。這是有道理的,但我仍然不認爲它會導致這種幅度的放緩(與文件的50%相匹配的東西減緩了2000%)。

這可能是什麼原因造成的?有什麼我們可以調整?

回答

2

當您剛剛通過*時,您將訂購檢查該字段中的每個值,並將其與*相匹配,這很重要。但是,當您使用* : *時,您會要求Solr爲您提供一切,並跳過任何匹配。

Solr/Lucene進行了優化,以便快速高效地完成* : *

+0

怎麼來*比搜索任何其他常見的字,但慢得多? 'text:foo'與'text:*'相比是非常快的,無論有多少文檔都與foo匹配。當然,搜索字段:*應該能夠放棄字段內容的任何實際匹配,假設它存在? – 2012-01-10 10:02:19

+1

由於*匹配所有內容,而且價格昂貴。我對Lucene不太瞭解,但我相信搜索條件是使用更多優化的數據,然後當您在該領域的每個值中搜索*時。請閱讀:http://lucidworks.lucidimagination.com/display/lweug/Wildcard+Queries他們提到外卡的表現。目前我不記得自己在哪裏讀過,但Solr Wiki中的某處提到了反對使用字段:*支持*:* – Fuxi 2012-01-10 11:19:29

+0

所以看起來字段:*相當於運行正則表達式匹配*任何在該領域發現的術語。我們基本上正在查詢我們所知道的Lucene索引無法爲我們提供一個快速答案,迫使它對該領域中的術語進行粗略掃描。 – 2012-01-12 12:39:54