gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:28:09 24 4
gpt4 key购买 nike

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

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

编辑 虽然最初我的“标题”字段设置为 indexed="false"我已经测试将其设置为 true(没有变化/仍然没有突出显示),并且 termVectors="true"termPositions="true"termOffsets="true"。 ..还是没有效果。 (我根据阅读 this post to SO 尝试了这些。)

这是我现在的“标题”字段定义:
<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 字段类型重新索引标题,它使用 WhitespaceTokenizerFactory 而不是 StandardTokenizerFactory,但仍然没有突出显示。对于它的值(value),我使用的是标准查询解析器,根据 debugQuery=on 是 LuceneQParser。

最后! 感谢@javanna 的帮助。我做了很多实验,两个关键要点是:
  • 您必须使用标记化字段类型。字符串字段类型不起作用。 indexed=true 或 termVectors=true 似乎没有必要,但字段类型必须标记化。
  • 您必须小心使用正确的大小写来引用您的字段。除了搞砸标记之外,我还在开发过程中更改了字段的大小写,并且忘记更改 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>

    最佳答案

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

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

    您还可以检查您的匹配在哪里启用 debugQuery=on 并检查调试输出。

    更新
    我看到你把标题 fieldType 改成了 text_general ,但这不会改变任何东西,因为该类型未在空格上标记。你还没有告诉你正在使用什么查询解析器,无论如何,如果我是对的,你应该使用 WhitespaceTokenizerFactory而不是 StandardTokenizerFactory :

    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 

    之后,请记住重新索引所有数据,否则您将看不到任何更改。
    基本上,如果你索引类似 toyota whatever 的内容如果不对空格进行标记,您将不会得到任何搜索 toyota 的结果。 ,你甚至不会有 toyota在该字段上突出显示,因为它不匹配。我的假设是您正在使用 dismaxedismax查询解析器并搜索多个字段,其中一些但不是标题与您的搜索匹配,这就是为什么您会得到结果但没有在 title 上突出显示的原因,您选择突出显示的唯一字段。你能发布你搜索的结果吗 toyota ?是 toyota除了 title 之外的一些其他领域的术语?

    关于solr - 为什么这个简单的 Solr 突出显示尝试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9842886/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com