Почему эта простая попытка выделения Solr не удалась? - PullRequest
7 голосов
/ 23 марта 2012

Я прочитал вики-документ с подсвечиванием Solr несколько раз, искал везде, но не могу даже получить базовое выделение для работы с моей установкой Solr. Я использую Solr 3.5 на демонстрационном сервере Jetty 6.1.

Я проиндексировал 250 тыс. Документов, и могу нормально их искать. Помимо настройки определений полей моего документа, большая часть конфигурации Solr - это «сток», хотя я временно закомментировал «Highlighting defaults» в solrconfig.xml, чтобы убедиться, что они не вызывают эту проблему:

  <!-- Highlighting defaults
   <str name="hl">on</str>
   <str name="hl.fl">title snippet</str>
   <str name="f.name.hl.fragsize">0</str>
   <str name="f.name.hl.alternateField">name</str> -->

Моя строка запроса URL очень проста. Я перепробовал много вариантов, но вот мой последний, возвращающий самый простой запрос:

hl=on&hl.fl=title&indent=on&version=2.2&q=toyota&fq=&start=0&rows=1&fl=*%2Cscore

Вот итоговый XML:

<?xml version="1.0" encoding="UTF-8"?>
<response>

<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">32</int>
  <lst name="params">
    <str name="explainOther"/>
    <str name="indent">on</str>
    <str name="hl.fl">title</str>
    <str name="wt"/>
    <str name="hl">true</str>
    <str name="version">2.2</str>
    <str name="rows">1</str>
    <str name="fl">*,score</str>
    <str name="start">0</str>
    <str name="q">toyota</str>
    <str name="qt"/>
    <str name="fq"/>
  </lst>
</lst>
<result name="response" numFound="9549" start="0" maxScore="0.9960097">
  <doc>
    <float name="score">0.9960097</float>
    <str name="id">2-33-200</str>
    <str name="title">1992 Toyota Camry 2.2L CV Boots</str>
  </doc>
</result>
<lst name="highlighting">
  <lst name="2-33-200"/>
</lst>
</response>

Как я могу отладить эту проблему дальше? Спасибо!

Редактировать Вот раздел <highlighting> из solrconfig.xml. Как я уже говорил, это сток. Это может быть проблемой, но я новичок в Solr и еще не знаком с подсвечиванием входов и выходов (очевидно).

    <highlighting>
  <!-- Configure the standard fragmenter -->
  <!-- This could most likely be commented out in the "default" case -->
  <fragmenter name="gap" 
              default="true"
              class="solr.highlight.GapFragmenter">
    <lst name="defaults">
      <int name="hl.fragsize">100</int>
    </lst>
  </fragmenter>

  <!-- A regular-expression-based fragmenter 
       (for sentence extraction) 
    -->
  <fragmenter name="regex" 
              class="solr.highlight.RegexFragmenter">
    <lst name="defaults">
      <!-- slightly smaller fragsizes work better because of slop -->
      <int name="hl.fragsize">70</int>
      <!-- allow 50% slop on fragment sizes -->
      <float name="hl.regex.slop">0.5</float>
      <!-- a basic sentence pattern -->
      <str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str>
    </lst>
  </fragmenter>

  <!-- Configure the standard formatter -->
  <formatter name="html" 
             default="true"
             class="solr.highlight.HtmlFormatter">
    <lst name="defaults">
      <str name="hl.simple.pre"><![CDATA[<em>]]></str>
      <str name="hl.simple.post"><![CDATA[</em>]]></str>
    </lst>
  </formatter>

  <!-- Configure the standard encoder -->
  <encoder name="html" 
           class="solr.highlight.HtmlEncoder" />

  <!-- Configure the standard fragListBuilder -->
  <fragListBuilder name="simple" 
                   default="true"
                   class="solr.highlight.SimpleFragListBuilder"/>

  <!-- Configure the single fragListBuilder -->
  <fragListBuilder name="single" 
                   class="solr.highlight.SingleFragListBuilder"/>

  <!-- default tag FragmentsBuilder -->
  <fragmentsBuilder name="default" 
                    default="true"
                    class="solr.highlight.ScoreOrderFragmentsBuilder">
    <!-- 
    <lst name="defaults">
      <str name="hl.multiValuedSeparatorChar">/</str>
    </lst>
    -->
  </fragmentsBuilder>

  <!-- multi-colored tag FragmentsBuilder -->
  <fragmentsBuilder name="colored" 
                    class="solr.highlight.ScoreOrderFragmentsBuilder">
    <lst name="defaults">
      <str name="hl.tag.pre"><![CDATA[
           <b style="background:yellow">,<b style="background:lawgreen">,
           <b style="background:aquamarine">,<b style="background:magenta">,
           <b style="background:palegreen">,<b style="background:coral">,
           <b style="background:wheat">,<b style="background:khaki">,
           <b style="background:lime">,<b style="background:deepskyblue">]]></str>
      <str name="hl.tag.post"><![CDATA[</b>]]></str>
    </lst>
  </fragmentsBuilder>

  <boundaryScanner name="default" 
                   default="true"
                   class="solr.highlight.SimpleBoundaryScanner">
    <lst name="defaults">
      <str name="hl.bs.maxScan">10</str>
      <str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str>
    </lst>
  </boundaryScanner>

  <boundaryScanner name="breakIterator" 
                   class="solr.highlight.BreakIteratorBoundaryScanner">
    <lst name="defaults">
      <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
      <str name="hl.bs.type">WORD</str>
      <!-- language and country are used when constructing Locale object.  -->
      <!-- And the Locale object will be used when getting instance of BreakIterator -->
      <str name="hl.bs.language">en</str>
      <str name="hl.bs.country">US</str>
    </lst>
  </boundaryScanner>
</highlighting>

Редактировать Хотя изначально мое поле "title" было установлено в indexed = "false", с тех пор я проверил, устанавливая его в значение true (без изменений / без выделения), а также в termVectors = "true" termPositions = "true" termOffsets = "true" ... по-прежнему безрезультатно. (Я пробовал это, основываясь на прочтении этого поста к SO .)

А вот мое определение поля "title" на данный момент:

<field name="title" type="string" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" />

Изначально я начал с:

<field name="title" type="string" indexed="false" stored="true" required="true" />

Редактировать Я также попробовал это определение:

<field name="title" type="text_general" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" />

и без изменения подсветки, все еще не работает. Мое определение text_general является определением по умолчанию, которое поставляется с демонстрацией Solr:

 <!-- A general text field that has reasonable, generic
        cross-language defaults: it tokenizes with StandardTokenizer,
 removes stop words from case-insensitive "stopwords.txt"
 (empty by default), and down cases.  At query time only, it
 also applies synonyms. -->
 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.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">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
 </fieldType>

Редактировать Я также попытался переиндексировать заголовок с полевым типом text_en_splitting, в котором вместо StandardTokenizerFactory используется WhitespaceTokenizerFactory, но по-прежнему нет выделения. Для чего он стоит, я использую стандартный анализатор запросов, который в соответствии с debugQuery = on является LuceneQParser.

НАКОНЕЦ! Спасибо @javanna за помощь. Я провел много экспериментов, и два ключевых вывода:

  1. Вы должны использовать тип поля токенизации. Строка fieldtype не будет работать. Кажется, нет необходимости иметь indexed = true или termVectors = true, но тип поля должен быть размечен.
  2. Вы должны быть осторожны, ссылаясь на свои поля в правильном регистре. В дополнение к порче токенизации, я также изменил регистр на своих полях во время разработки и забыл изменить регистр в определении hl.fl (выделенное поле) - чтобы подсветка не работала.
  3. Убедитесь, что вы переиндексируете каждое изменение конфигурации. На всякий случай я удалял все документы из индекса и перестраивал его с нуля, но в этом нет необходимости.

Мое определение теперь выглядит как:

<field name="Title" type="text_general" indexed="false" stored="true" required="true" />

И мой solrconfig.xml имеет такой набор:

<str name="hl">on</str>
<str name="hl.fl">Title</str>

1 Ответ

12 голосов
/ 24 марта 2012

То, как вы делаете подсветку, кажется хорошим, но ваш solrconfig.xml выглядит немного грязно.К сожалению, пример, который вы взяли, использует в основном все доступные опции, и я думаю, они вам не нужны.Если вам не нужно что-то отличное от значения по умолчанию, я бы начал комментировать все ваши настройки подсветки, а также параметры по умолчанию.Затем я бы поэкспериментировал с необходимыми вам параметрами url, просто пара для начала: hl = on и hl.fl = title.Как только вы нашли правильные параметры, вы можете настроить их по умолчанию.

Тем не менее, учитывая ваш заголовок fieldType, я подозреваю, что он не маркирован, если вы не изменили определение типа строки по умолчанию.В этом случае ваш запрос не будет соответствовать полю заголовка, поэтому вы не выделите его.Возможно, вы используете edismax (или dismax)?Если да, каков ваш параметр qf?Возможно ли, что термин toyota находится в другом поле, соответствующем вашему запросу?Если вы используете edismax, вы можете попробовать поискать q = title: toyota и посмотреть, если вы получите результаты.

Вы также можете проверить, где находится ваше соответствие, включающее debugQuery = on и проверяющий выходные данные отладки.

ОБНОВЛЕНИЕ
Я видел, как вы изменилисьзаголовок fieldType в text_general, но это ничего не меняет, потому что этот тип не маркируется в пробелах.Вы еще не сказали, какой анализатор запросов вы используете, в любом случае, если я прав, вы должны использовать WhitespaceTokenizerFactory вместо StandardTokenizerFactory:

<tokenizer class="solr.WhitespaceTokenizerFactory"/> 

После этого не забудьте переиндексировать все вашиданные, иначе вы не увидите никаких изменений.По сути, если вы индексируете что-то вроде toyota whatever без разбивки по пробелам, вы не получите никакого результата при поиске toyota, и вы даже не выделите toyota в этом поле, потому что оно не совпадает.Я предполагаю, что вы используете парсер запросов dismax или edismax и выполняете поиск по нескольким полям, и некоторые из них, но не заголовок, соответствуют вашему поиску, поэтому вы получите результаты, но не выделите title, единственное поле, которое вы выбрали для выделения.Можете ли вы опубликовать результаты поиска toyota?Термин toyota в некоторых других полях, кроме title?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...