首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个简单的Solr突出显示尝试失败?

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

Stack Overflow用户
提问于 2012-03-23 16:27:47
回答 1查看 14.3K关注 0票数 8

我已经读过几次Solr突出显示wiki文档,到处搜索,但是我的Solr安装甚至连基本的高亮显示都无法使用。我在演示Jetty6.1服务器上运行Solr 3.5。

我已经索引了250 K文件,并能够搜索他们只是很好。除了配置文档字段定义之外,大多数Solr配置都是"stock“,尽管我暂时注释掉了solrconfig.xml的”高亮显示默认值“,以确保它们不会导致此问题:

代码语言:javascript
复制
  <!-- 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查询非常简单。我尝试过许多变体,但下面是我的最新版本,它返回了最基本的查询:

代码语言:javascript
复制
hl=on&hl.fl=title&indent=on&version=2.2&q=toyota&fq=&start=0&rows=1&fl=*%2Cscore

下面是生成的XML:

代码语言:javascript
复制
<?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>

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

编辑这里是来自solrconfig.xml的<highlighting>部分。正如我所说的,这是股票。这可能是个问题,但我对Solr还不熟悉(显然)。

代码语言:javascript
复制
    <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>

编辑虽然我的“标题”字段最初被设置为indexed="false“,但后来我测试了将其设置为true (没有更改/仍然没有突出显示),还测试了termVectors="true”termPositions=真“termOffsets=”true“.还是没有效果。(我在阅读this post to SO的基础上尝试了这些方法。)

以下是我的“标题”字段的定义:

代码语言:javascript
复制
<field name="title" type="string" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" />

最初我是从以下几个方面开始的:

代码语言:javascript
复制
<field name="title" type="string" indexed="false" stored="true" required="true" />

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

代码语言:javascript
复制
<field name="title" type="text_general" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" />

高亮点没有变化,仍然不起作用。我的text_general定义是Solr的演示程序附带的默认定义:

代码语言:javascript
复制
 <!-- 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字段类型重新索引标题,它使用WhitespaceTokenizerFactory而不是StandardTokenizerFactory,但仍然没有突出显示。至于它的价值,我使用的是标准的查询解析器,根据debugQuery=on,它是LuceneQParser。

最后,感谢@javanna的帮助。我做了很多实验,两个关键的方法是:

  1. 您必须使用标记字段类型。字符串字段类型不能工作。似乎没有必要使用indexed=true或termVectors=true,但是字段类型必须是indexed=true,必须小心使用适当的大小写引用字段。除了破坏标记化之外,我还在开发期间更改了字段中的情况,并忘记更改hl.fl (突出显示字段)定义中的情况--防止高亮显示工作。
  2. 确保在每次配置更改之间重新索引。为了安全起见,我从索引中删除了所有文档,并从头开始重新构建它,但这可能是不必要的。

我现在的定义是:

代码语言:javascript
复制
<field name="Title" type="text_general" indexed="false" stored="true" required="true" />

我的solrconfig.xml有这样一套:

代码语言:javascript
复制
<str name="hl">on</str>
<str name="hl.fl">Title</str>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-24 08:41:03

您进行高亮显示的方式看起来不错,但是您的solrconfig.xml看起来有点混乱。不幸的是,您所使用的示例基本上使用了所有可用的选项,我想您不需要它们。除非您需要与默认值不同的内容,否则我将开始注释掉所有高亮显示配置以及默认参数。然后,我会使用您需要的url参数,只需要几个开始: hl=on和hl.fl=title。一旦找到了正确的参数,就可以将它们配置为默认参数。

尽管如此,考虑到您的标题fieldType,我怀疑它没有被标记,除非您更改了默认的字符串类型定义。在这种情况下,查询将与title字段不匹配,这就是为什么没有突出显示的原因。您是否正在使用edismax (或dismax)?如果是,您的qf参数是什么?丰田术语是否有可能出现在与您的查询相匹配的另一个字段上?如果使用edismax,可以尝试搜索q=title:toyota和查看是否得到结果。

您还可以检查匹配的位置,启用debugQuery=on并检查调试输出。

更新

我看到您将标题fieldType更改为text_general,但这并没有改变什么,因为该类型没有在空白空间中标记。您还没有告诉您使用的是哪个查询解析器,无论如何,如果我是对的,您应该使用WhitespaceTokenizerFactory而不是StandardTokenizerFactory

代码语言:javascript
复制
<tokenizer class="solr.WhitespaceTokenizerFactory"/> 

在此之后,请记住重新编制所有数据的索引,否则不会看到任何更改。基本上,如果您在没有标记的情况下在空白空间上索引类似toyota whatever的内容,就不会得到搜索toyota的任何结果,甚至不会在该字段中突出显示toyota,因为它不匹配。我的假设是,您正在使用dismaxedismax查询解析器并在多个字段上进行搜索,其中一些字段(而不是标题)与搜索结果匹配,这就是为什么您将在title上获得结果而不是突出显示,这是您选择的唯一突出显示字段。你能把你搜索到的toyota结果发出来吗?是toyota项在title以外的其他字段上

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9842886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档