首页 文章

为什么这个简单的Solr突出显示尝试失败?

提问于
浏览
7

我已经多次阅读了Solr突出显示维基文档,到处搜索,但是无法获得与我的Solr安装一起使用的基本突出显示 . 我在Jetty 6.1服务器上运行Solr 3.5 .

我已经索引了250K文档,并且能够很好地搜索它们 . 除了配置我的文档字段定义之外,大多数Solr配置都是“stock”,尽管我已经暂时注释掉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>

如何进一步调试此问题?谢谢!

Edit 这是solrconfig.xml中的 <highlighting> 部分 . 正如我所说,它是股票 . 这可能是问题所在,但我是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>

Edit 虽然最初我的"title"字段设置为indexed = "false"我已经测试过将其设置为true(没有更改/没有突出显示),还有termVectors = "true" termPositions = "true" termOffsets = "true" ...仍然无效 . (我根据阅读this post to SO尝试了这些 . )

这是我现在的“ Headers ”字段定义:

<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" />

Edit 我现在也尝试过这个定义:

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

Edit 我've now also tried re-indexing title with the text_en_splitting fieldtype, which uses WhitespaceTokenizerFactory instead of StandardTokenizerFactory, and still no highlighting. For what it'值得,我使用的是标准查询解析器,根据debugQuery = on是LuceneQParser .

FINALLY! 感谢@javanna的帮助 . 我做了很多实验,两个关键要点是:

  • 您必须使用标记化字段类型 . 对于indexed = true或termVectors = true,字符串fieldtype似乎必须't work. It doesn' t,但字段类型必须是标记化的 .

  • 您必须小心使用正确的案例来引用您的字段 . 除了搞砸令牌化之外,我还在开发过程中改变了我的字段上的情况,并且忘了在hl.fl(突出显示的字段)定义上更改案例 - 防止突出显示工作 .

  • 确保在每次配置更改之间重新编制索引 . 为了安全起见,我从索引中删除了所有文档,并从头开始重建,但这可能没有必要 .

我的定义现在显示为:

<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

    你进行突出显示的方式似乎很好,但是你的solrconfig.xml看起来有点乱 . 不幸的是,您采用的示例基本上使用了所有可用选项,我猜您不需要它们 . 除非您需要与默认值不同的内容,否则我将开始评论您的所有突出显示配置以及默认参数 . 然后我会玩你需要的url参数,只需要几个开始:hl = on和hl.fl = title . 找到正确的参数后,您可以将它们配置为默认值 .

    也就是说,给定你的 Headers fieldType我怀疑它没有被标记化,除非你改变了默认的字符串类型定义 . 在这种情况下,您的查询将与 Headers 字段不匹配,这就是您没有突出显示它的原因 . 你是否可以使用edismax(或dismax)?如果是,你的qf参数是多少?丰田术语是否可能在与您的查询匹配的另一个字段上?如果你正在使用edismax,你可以尝试搜索q = title:toyota ans看看你是否得到了结果 .

    您还可以检查匹配的位置 debugQuery=on 并检查调试输出 .

    UPDATE
    我看到你将 Headers fieldType更改为 text_general ,但这并没有在空格上进行标记 . 你还没有使用,无论如何,如果我是对的你应该使用 WhitespaceTokenizerFactory 而不是 StandardTokenizerFactory

    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    

    之后,请记住重新索引所有数据,否则您将看不到任何更改 . 基本上,如果您在没有对空格进行标记的情况下索引类似 toyota whatever 的内容,则不会获得任何搜索 toyota 的结果,并且您甚至不会在该字段上突出显示 toyota ,因为它没有't match. My assumption is that you'重新使用 dismaxedismax 查询解析器并搜索多个字段,其中一些但不是 Headers 与您的搜索匹配,'s why you' d得到结果但不突出 title ,您选择的唯一字段高亮 . 你能发布搜索 toyota 的结果吗? toyota 术语是否在 title 之外的其他一些字段中?

相关问题