2016-05-27 7 views
0

Ich verwende Solr 6.0. Ich möchte die Highlighting Funktion von Solr verwenden.Solr Hervorhebung funktioniert nicht ohne hl.q

Wenn ich die folgende Abfrage der highlighting Abschnitt in der Antwort machen nur ids (ohne &hl.q=data:*ad*) -

http://<hostname>:<port>/solr/<core>/select?q=text:ad&fl=data&rows=10&hl=on&hl.fl=data&hl.preserveMulti=true&hl.mergeContiguous=true 

Ausgang -

"highlighting": { 
    "id1": {}, 
    "id2": {} 
} 

Wenn ich die folgende Abfrage machen dann bekomme ich die gewünschter Ausgang (mit &hl.q=data:*ad*) -

http://<hostname>:<port>/solr/<core>/select?q=text:ad&fl=data&rows=10&hl=on&hl.q=data:*ad*&hl.fl=data&hl.preserveMulti=true&hl.mergeContiguous=true 

Ausgang -

"highlighting": { 
    "id1": { 
     "data": ["<em>advertise</em>", 
      "<em>add</em>" 
     ] 
    }, 
    "id2": { 
     "data": ["<em>admin</em>", 
      "<em>addon</em>" 
     ] 
    } 
} 

Warum benötige ich hl.q passieren? Gibt es eine Möglichkeit, es zu vermeiden?

Wenn ich eine benutzerdefinierte requestHandler(qt) in solrconfig.xml schreiben möchte, kann dann gebe ich den Q-Wert zu hl.q mit * als Präfix und Postfix so etwas wie hl.q=*$q*.

Ich habe die folgenden zwei Felder -

<field name="text" type="text_suggest" indexed="true" stored="false" multiValued="true"/> 
<field name="data" type="lower" indexed="false" stored="true" multiValued="true"/> 

ist die Definition der Felder Nach -

<fieldType name="lower" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
    <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 
<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="30"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Im Folgenden ist der Weg, um Daten in den zwei Feldern kopiert wird -

<copyField source="somefield" dest="text" maxChars="30"/> 
<copyField source="somefield" dest="data"/> 

EDIT 1

Wenn ich der ersten Abfrage &hl.alternateField=data hinzufügen, werden alle Werte in den mehrwertigen Feldern im Abschnitt highlighting wie bei einer normalen Suche angezeigt. Wie unten -

"highlighting": { 
    "id1": { 
     "data": ["advertise", 
      "not relevant", 
      "add" 
     ] 
    }, 
    "id2": { 
     "data": ["admin", 
      "addon", 
      "irrelevant" 
     ] 
    } 
} 

Antwort

1

Fügen Sie den EdgeNGram Filter auf den unteren Typ, und es wird das erste Beispiel entsprechen. Es wird nicht "ad" in Daten übereinstimmen, da es keine NGrams hat.

Verwandte Themen