2012-08-02 120 views
3

我試圖在我的SOLR實例中優化突出顯示,因爲這似乎使查詢速度減慢了2個數量級。我有一個標記化字段索引和存儲的,定義如下:優化SOLR熒光筆

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

期限載體等時,也會生成:

<field name="Events" type="text_general" multiValued="true" stored="true" indexed="true" termVectors="true" termPositions="true" termOffsets="true"/> 

對於我使用默認配置SOLR高亮組件。我嘗試的查詢使用FastVectorHighlighter,但仍需要〜1500ms,對於每個文檔中存儲10-20個值的〜1000個文檔非常長。下面是該查詢:

q=Events:http\://mydomain.com/resource/term/906&fq=(Document_Code:[*+TO+*])&hl.requireFieldMatch=true&facet=true&hl.simple.pre=<b>&hl.fl=*&hl=true&rows=10&version=2&fl=uri,Document_Type,Document_Title,Modification_Date,Study&hl.snippets=1&hl.useFastVectorHighlighter=true 

我感到好奇的是,在Solr管理統計單查詢生成9146個請求HtmlFormatter和GapFragmenter。想知道爲什麼會發生這種情況,以及如何提高熒光筆的性能?

+0

我使用在Tomcat 7.0.28上運行的Solr 3.6 – kpentchev 2012-08-02 09:22:42

+0

在未啓用termVectors的類似字段上運行相同的查詢,顯示響應時間沒有顯着差異。 – kpentchev 2012-08-02 10:50:01

回答

4

看來問題是由「hl.fl = *」引起的,它導致DefaultSolrHighlighter在每個找到的文檔(在我的情況下最大爲10)上遍歷相對較大數量的字段(在我的索引中)。這會導致額外的O(n^2)時間。這裏是相關的代碼片段:

for (int i = 0; i < docs.size(); i++) { 
    int docId = iterator.nextDoc(); 
    Document doc = searcher.doc(docId, fset); 
    NamedList docSummaries = new SimpleOrderedMap(); 
    for (String fieldName : fieldNames) { 
    fieldName = fieldName.trim(); 
    if(useFastVectorHighlighter(params, schema, fieldName)) 
     doHighlightingByFastVectorHighlighter(fvh, fieldQuery, req, docSummaries, docId, doc, fieldName); 
    else 
     doHighlightingByHighlighter(query, req, docSummaries, docId, doc, fieldName); 
    } 
    String printId = schema.printableUniqueKey(doc); 
    fragments.add(printId == null ? null : printId, docSummaries); 
} 

減少字段數量應該大大改善行爲。但是,在我的情況下,我無法將它縮小到20個字段,因此我將檢查是否爲所有這些字段啓用FastVectorHighlighter都會提高整體性能。

我還想知道是否可以通過使用匹配文檔中的某些信息(此時已經可用)來進一步減少此列表。

更新

使用FastVectorHighlighter所有字段(設置termVectorstermPositionstermOffsets真正所有記號化字段)由一個數量級確實提高了高亮的速度,所以現在所有查詢都運行< 1秒。該指數的規模增加了其原始值的3倍(從500M到2G)。多值場的碎片如何產生也存在問題,但性能的改善足夠高。

+0

不錯,謝謝你提供你自己的解決方案。 – javanna 2012-08-03 08:20:49

+0

請注意,3.6中突出顯示的問題似乎存在一系列問題。除了多值字段的問題之外,數字字段似乎被熒光筆自動忽略(https://issues.apache.org/jira/browse/SOLR-3050),並且根本無法評估日期範圍查詢(https: //issues.apache.org/jira/browse/SOLR-3704)。 – kpentchev 2012-08-03 11:19:01