Подсветка Solr с неожиданным префиксом и суффиксом - PullRequest
0 голосов
/ 09 февраля 2012

Мне нужно настроить префикс и суффикс подсветки 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>

Кто-нибудь знает почему?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Я наконец узнал почему! Я использую 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.

1 голос
/ 09 февраля 2012

Я предполагаю, что вы наблюдаете такое поведение, потому что у вас есть только префикс и суффикс, определенные для SimpleFragmentsBuilder, а другие основные моменты поступают от другого компоновщика фрагментов.

Я использую собственный префикс и суффикс длямое выделение и я установил это значение в разделе formatter раздела highlighting файла solrconfig.xml, и у него не было никаких проблем, так как это будет применяться ко всем сборщикам фрагментов.

Так что, возможно, попробуйте следующее:

 <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>
...