我需要自定义Solr突出显示前缀和后缀,如下所示:
<span class="highlight">text</span>
而不是默认的
<em>text</em>
这就是为什么我在solrconfig.xml
中为HighlightComponent
:使用此配置
<searchComponent class="solr.HighlightComponent" name="highlight">
<highlighting>
<fragmentsBuilder name="simple" default="true" class="solr.highlight.SimpleFragmentsBuilder">
<lst name="defaults">
<str name="hl.tag.pre"><![CDATA[<span class="highlight">]]></str>
<str name="hl.tag.post"><![CDATA[</span>]]></str>
</lst>
</fragmentsBuilder>
</highlighting>
</searchComponent>
以下是我的标准请求处理程序的默认参数:
<requestHandler name="standard" class="solr.SearchHandler" default="true">
<lst name="defaults">
<str name="hl">true</str>
<str name="hl.fl">body,title</str>
<str name="hl.useFastVectorHighlighter">true</str>
</lst>
</requestHandler>
当我搜索text
单词时,我确实会突出显示文本单词,但并不总是使用我配置的前缀和后缀:
<lst name="highlighting">
<lst name="document_1">
<arr name="body">
<str>my <em>text</em> highlighted</str>
</arr>
<arr name="title">
<str>my <span class="highlight">text</span> highlighted</str>
</arr>
</lst>
</lst>
有人知道为什么吗?
我猜您看到了这种行为,因为您只为SimpleFragmentsBuilder定义了前缀和后缀,而其他亮点来自另一个片段生成器。
我使用自定义前缀和后缀进行高亮显示,并在solrconfig.xml的highlighting
部分的formatter
部分中设置了该值,没有遇到任何问题,因为它将适用于所有片段构建器。
因此,也许可以尝试以下方法:
<highlighting>
<fragmentsBuilder name="simple" default="true"
class="solr.highlight.SimpleFragmentsBuilder"/>
<!-- Configure the standard formatter -->
<formatter name="html" class="org.apache.solr.highlight.HtmlFormatter"
default="true">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<span class="highlight">]]></str>
<str name="hl.simple.post"><![CDATA[</span>]]></str>
</lst>
</formatter>
</highlighting>
我终于找到了原因!我正在使用fastVectorHighlighter使高亮显示更快。一开始,我只强调title
字段,一切都很好。当我将body
字段添加到高亮显示时,我忘记启用termVectors=true
。现在我的body
字段看起来像这个
<field name="body" type="text" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
在一个完整的重新索引突出显示是完美工作后:
<lst name="highlighting">
<lst name="document_1">
<arr name="body">
<str>my <span class="highlight">text</span> highlighted</str>
</arr>
<arr name="title">
<str>my <span class="highlight">text</span> highlighted</str>
</arr>
</lst>
</lst>
以前,正文字段高亮显示确实有效,但没有fastVectorHighlighter
,因为该字段没有termVectors=true
参数。这就是为什么我使用默认前缀和后缀突出显示body
的原因。由于fastVectorHighlighter
是一种完全不同的高亮显示方法,因此配置也不同。
为了避免这种错误,只要用户可以选择用hl.fl parameter
突出显示哪些字段,我建议还包括标准突出显示(格式化程序元素,类solr.highlight.HtmlFormatter
)的配置,如下所示:
<searchComponent class="solr.HighlightComponent" name="highlight">
<highlighting>
<formatter name="html" default="true" class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<span class="highlight">]]></str>
<str name="hl.simple.post"><![CDATA[</span>]]></str>
</lst>
</formatter>
<fragmentsBuilder name="simple" default="true" class="solr.highlight.SimpleFragmentsBuilder">
<lst name="defaults">
<str name="hl.tag.pre"><![CDATA[<span class="highlight">]]></str>
<str name="hl.tag.post"><![CDATA[</span>]]></str>
</lst>
</fragmentsBuilder>
</highlighting>
</searchComponent>
这种方式高亮显示将使用相同的前缀和后缀,即使对于禁用termVectors
的字段也是如此。