优化 SOLR 荧光笔
Posted
技术标签:
【中文标题】优化 SOLR 荧光笔【英文标题】:Optimize SOLR Highlighter 【发布时间】:2012-07-31 05:59:59 【问题描述】:我正在尝试优化我的 SOLR 实例中的突出显示,因为这似乎会使查询速度降低 2 个数量级。我有一个标记化的字段索引并使用以下定义存储:
<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,但仍然需要 ~1500 毫秒,这对于 ~1000 个文档来说非常长,每个文档的字段中存储了 10-20 个值。这是查询:
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 的请求。关于为什么会发生这种情况以及如何提高荧光笔的性能有什么想法吗?
【问题讨论】:
我使用的是在 Tomcat 7.0.28 上运行的 Solr 3.6 在未启用 termVectors 的类似字段上运行相同的查询显示响应时间没有显着差异。 【参考方案1】:问题似乎是由“hl.fl=*”引起的,这导致 DefaultSolrHighlighter 为找到的每个文档(在我的情况下最多 10 个)迭代相对大量的字段(在我的索引中)。这会导致额外的 O(n^2) 时间。下面是相关代码sn-p:
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(将所有标记化字段的 termVectors、termPositions 和 termOffsets 设置为 true)确实确实将突出显示速度提高了一个数量级,因此现在所有查询都运行
【讨论】:
请注意,3.6 中的突出显示似乎存在一系列问题。除了多值字段的问题外,数字字段似乎会被荧光笔自动忽略 (issues.apache.org/jira/browse/SOLR-3050) 并且根本无法评估日期范围查询 (issues.apache.org/jira/browse/SOLR-3704)。以上是关于优化 SOLR 荧光笔的主要内容,如果未能解决你的问题,请参考以下文章