2015-10-20 10 views
7

Ich konfigurierte Solr 4.10 (auch 5.3) mit highlighting functionality. Es funktioniert gut mit den meisten Wörtern, aber ich fand einige Wörter, die "nicht" erlauben, Hervorhebungen zu erlauben, dh solr gibt die erforderlichen Dokumente zurück, aber hebt einige von ihnen nicht hervor.Solr markiert einige Wörter nicht

Was kann einen solchen Effekt verursachen?

solrconfig.xml

<requestHandler name="/select" class="solr.SearchHandler"> 
<lst name="defaults"> 
    <str name="wt">json</str> 
    <str name="indent">true</str> 
    <str name="defType">edismax</str> 
    <str name="bf">product(concount)</str> 
    <str name="df">text bio text_syn text_syn_other</str> 
    <str name="qf"> 
    text^25 bio^16 text_syn^8 text_syn_other^3 
    </str> 
    <str name="hl">on</str> 
    <str name="hl.fl">text bio text_syn text_syn_other</str> 
    <str name="hl.preserveMulti">true</str> 
    <str name="hl.encoder">html</str> 
    <str name="f.text.hl.fragsize">100</str> 
    <str name="hl.snippets">20</str> 
    <arr name="components"> 
    <str>highlight</str> 
    </arr> 
</lst> 

schema.xml

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_abbr.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en_syn" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en_syn_other" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_other.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" /> 
<field name="text_syn" type="text_en_syn" indexed="true" stored="false" multiValued="true" /> 
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="false" multiValued="true" /> 

<field name="text_exact" type="string" indexed="true" stored="false" multiValued="false" /> 

<field name="bio" type="text_en" indexed="true" stored="true" multiValued="false" /> 

<field name="bio_exact" type="string" indexed="true" stored="false" multiValued="false" /> 

<field name="concount" type="long" indexed="true" stored="true" multiValued="false" /> 

<field name="concount_exact" type="long" indexed="true" stored="false" multiValued="false" /> 

<copyField source="text" dest="text_syn"/> 
<copyField source="bio" dest="text_syn"/> 
<copyField source="text" dest="text_syn_other"/> 
<copyField source="bio" dest="text_syn_other"/> 

Für die Abfrage http://localhost:8983/solr/select?q=senior bekam ich docs mit dem Wort senior, aber Abschnitt solr Reaktion in Hervorhebung dieses Wort ist nicht hervorgehoben.


UPDATE 1: ich herausfinden, dass ich das Wort senior in meiner synonyms_abbr.txt-Datei haben, die Linie senior,lead. Als ich diese Zeile kommentierte oder die Stellen der Wörter, lead,senior, überraschte, fing das Wort senior fing an, hervorzuheben. Irgendwelche Ideen ?


UPDATE 2: Wörter aus synonyms.txt und synonyms_other.txt werden hervorgehoben normalerweise immer, aber Worte von synonyms_abbr.txt seltsam verhalten sich wie folgt. Zum Beispiel habe ich die Linie lead,head,senior in synonyms_abbr.txt dann

  • die Abfragen http://localhost:8983/solr/select?q=senior und http://localhost:8983/solr/select?q=head kein Wort markiert,
  • die Abfrage http://localhost:8983/solr/select?q=lead Highlights nicht nur das Wort lead, sondern auch head und senior.
+0

Verwenden Sie die Solr-Backend-Funktionalität für eine Analyse der Transformation des Wortes. Ich bin mir nicht sicher, wie das Wort transformiert wird. Es könnte ein stemming Problem sein. Verwenden Sie andernfalls ein anderes Feld, schalten Sie die Transformationen aus und lassen Sie nur den Tokenizer zurück, und markieren Sie dann das entsprechende Feld. – 0xCAFEBABE

+0

@Mher Sind die Wörter, die nicht hervorgehoben werden, Stoppwörter? Oder nur zufällig? –

+0

Ich habe keine Stoppwörter konfiguriert. Die gesamte 'stopwords.txt' Datei ist kommentiert. – Mher

Antwort

2

Von Ihrem update2 zu laufen klar ist, dass nur das erste Wort unter lead,head,senior tatsächlich verwendet wird, Synonymabgleich und Hervorhebung.

Wenn Sie auf Text & Tabellen auf SolrWiki aussehen https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters gibt es eine Erwähnung expand=true eine gewisse Wirkung

die Synonyme Parameternamen eine externe Datei, die die Synonyme zu definieren. Wenn ignoreCase den Wert true hat, wird die Übereinstimmung vor der Überprüfung der Gleichheit in Kleinbuchstaben umgewandelt. Wenn "expand" auf "true" gesetzt ist, wird ein Synonym auf alle gleichwertigen Synonyme erweitert. Wenn es falsch ist, werden alle gleichwertigen Synonyme auf die erste in der Liste reduziert.

Die Website auch präsentiert und Beispiel

# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping: 
ipod, i-pod, i pod => ipod, i-pod, i pod 
# If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping: 
ipod, i-pod, i pod => ipod 

Dies scheint mit dem Verhalten konsistent zu sein, Sie beobachten. Dies bedeutet, dass Sie die Synonymfilterdefinition in schema.xml ändern sollten, um expand = true zu verwenden. OR ändern Sie die Art und Weise, in der Ihre Synonymdatei den Filter so definiert, dass explizites Mapping verwendet wird.

Da die Analyzer zum Zeitpunkt der Indexierung arbeiten, müssen Sie Dokumente möglicherweise neu indizieren, damit dies funktioniert.

+0

danke für die erklärung, es ist sehr hilfreich, kannst du bitte den anderen teil einer frage erklären: es ist zum beispiel wir haben 'expand = true', warum wenn ich synonymwort aus der' synonyms_abbr.txt' datei dann abfrage alle Synonyme dieses Wortes werden sowohl hervorgehoben als auch selbst, aber wehen Sie das Synonym von 'synonyms.txt', dann wird nur dieses Wort hervorgehoben, nicht die Synonyme dieses Wortes? – Mher

+0

Mit Blick auf Ihre Felddefinition scheint es, dass Felder, die mit synonym.txt verknüpft sind, mit store = false konfiguriert sind. Daher wird die Hervorhebung nicht funktionieren. Siehe die andere Antwort auf diese Frage von ilinca – vvs

2

Einige Felder werden nicht gespeichert und können daher nicht zurückgegeben werden. Da sie indiziert sind, können sie durchsucht werden. Ändern Sie Ihr Schema so, dass für alle Felder, die Sie hervorheben möchten, "=" gespeichert wurde.

<field name="text_syn" type="text_en_syn" indexed="true" stored="true" multiValued="true" /> 
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="true" multiValued="true" /> 

Mit Blick auf Ihre Config nehme ich Hervorhebung funktioniert auf den Feldern Bio und Text?

+0

keine @linca, Hervorhebung funktioniert nicht nur auf den Feldern Bio und Text. Ich denke nicht über die Files nach, die nicht gespeichert sind. – Mher

+0

Oh, Entschuldigung. Die Zeile Text bio text_syn text_syn_other ließ mich denken, dass Sie auch Highlights auf den 2 nicht gespeicherten Feldern möchten. Ich denke, wir brauchen ein Beispiel für die Werte der Felder, Abfrage, Ergebnis. – ilinca

0

Könnten Sie versuchen, Senioren hinzufügen, Blei und Blei, Senioren in der Datei synonyms_abbr.txt und dann versuchen, den Textmarker

Verwandte Themen