2012-03-23 26 views
6

我已經多次閱讀Solr突出顯示的wiki文檔,到處搜索,但無法獲得基本突出顯示以使用我的Solr安裝。我在演示Jetty 6.1服務器上運行Solr 3.5。爲什麼這個簡單的Solr突出顯示嘗試失敗?

我已經索引了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> 

如何調試這個問題的進一步?謝謝!

編輯以下是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> 

編輯雖然最初我的「標題」字段設置爲索引=「假」因爲我已經測試它設置爲true(無變化/沒有高亮依舊),並同時termVectors =「真」 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,仍然沒有突出顯示。對於它的價值,我使用了標準的查詢解析器,根據debugQuery = on是LuceneQParser。

最後!感謝@javanna的幫助。我做了很多試驗,並且兩個關鍵要點是:

  1. 您必須使用標記化字段類型。字符串字段類型不起作用。似乎沒有必要使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> 
+0

你可以在你的schema.xml中發佈你的標題字段定義嗎? – javanna 2012-03-23 17:03:37

+0

當然,對不起,我最初離開了。 – 2012-03-23 17:36:25

+0

謝謝!還有一件事:你的schema.xml中字符串fieldType的定義是什麼?默認的或不同的東西? – javanna 2012-03-23 21:41:21

回答

11

你讓高亮似乎不錯的方式,但你solrconfig.xml中看起來有點凌亂。不幸的是,你採用的例子基本上使用了所有可用的選項,我猜你不需要它們。除非您需要與默認設置不同的東西,否則我會開始註釋掉所有突出顯示配置以及默認參數。然後,我會玩你需要的url參數,只是一對夫婦開始:hl = on和hl.fl = title。一旦你找到了正確的參數,你可以將它們配置爲默認參數。

這就是說,給你的標題fieldType我懷疑它沒有標記,除非你改變了默認的字符串類型定義。在這種情況下,您的查詢不會與標題字段匹配,這就是爲什麼您不會突出顯示它的原因。你可能使用edismax(或dismax)?如果是,你的qf參數是什麼?豐田術語可能在另一個與您的查詢相匹配的字段上?如果您使用edismax,您可以嘗試搜索q = title:toyota並查看您是否得到結果。

您還可以檢查您的匹配在哪裏啓用debugQuery = on並檢查調試輸出。

UPDATE
我看見你改變了標題字段類型來text_general,但由於該類型未在空格標記化這不會改變任何事情。你還沒有告訴你還正在使用的查詢解析器,反正如果我是正確的,你應該使用WhitespaceTokenizerFactory代替StandardTokenizerFactory

<tokenizer class="solr.WhitespaceTokenizerFactory"/> 

之後,記得要重新索引所有的數據,否則你贏了」沒有看到任何改變。 基本上,如果你在沒有標記空格的情況下編制類似toyota whatever的東西,你將不會得到任何結果搜索toyota,並且你甚至不會在該字段上突出顯示toyota,因爲它不匹配。我的假設是,您正在使用dismaxedismax查詢解析器並在多個字段上進行搜索,其中一些字段不匹配您的搜索,這就是爲什麼您會得到結果但未在title上突出顯示,這是您選擇的唯一字段突出顯示。你能發佈你搜索toyota的結果嗎? toyota是否在title以外的其他字段?

+0

是的,它看起來很混亂,但這是Solr 3.5中的默認配置。 :)我沒有使用dismax或edismax,除非它是默認配置。星期一,當我回去工作時,我會嘗試你的建議,謝謝! – 2012-03-24 16:09:25

+2

@ MasonG.Zhwiti我不應該這樣說,但是......絕對不要相信solr的例子:)真的,爲了理解SOlr是如何工作的,最好從幾乎空的模式和乾淨的配置開始。讓我知道如果我可以幫助更多! – javanna 2012-03-24 18:58:08

+0

我仍在努力將配置重置爲更準確的配置,但到目前爲止,我已嘗試將標題fieldType更改爲text_general,帶有和不帶termVector = true,並且對於突出顯示而言我沒有做任何事情。 – 2012-03-26 17:11:25

相關問題