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"
]
}
}