Ich versuche, Solr zu verwenden, um genaue Übereinstimmungen für Kategorien in einer Benutzersuche (e.g. "skinny jeans" in "blue skinny jeans")
zu finden. Ich verwende die folgende Typdefinition:Solr Shingle ist nicht in Debug-Abfrage
<fieldType name="subphrase" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory"
pattern="\ "
replacement="_"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory"
outputUnigrams="true"
outputUnigramsIfNoShingles="true"
tokenSeparator="_"
minShingleSize="2"
maxShingleSize="99"/>
</analyzer>
</fieldType>
Der Typ Willen Indexkategorien ohne Tokenisieren, nur mit Unterstrichen Leerzeichen ersetzt. Aber es wird Abfragen Tokenize und schindel sie (mit Unterstrichen).
Was ich versuche zu tun ist, die Query Schindeln mit den indizierten Kategorien übereinstimmen. In der Seite Solr Analyse kann ich sehen, dass die Leerzeichen/unterstreichen Ersatz beiden Werke auf dem Index und Abfrage, und ich kann sehen, dass die Abfrage richtig geschuppt wird (Abbildung unten):
Mein Problem ist, dass in der Solr-Abfrage-Seite kann ich nicht sehen, dass Schindeln erzeugt werden, und ich nehme an, dass als Ergebnis die Kategorie "Skinny Jeans" nicht übereinstimmt, aber die Kategorie "Jeans" ist abgestimmt :(
Dies ist die Debug-Ausgabe:
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "name:(skinny jeans)",
"indent": "true",
"wt": "json",
"debugQuery": "true",
"_": "1464170217438"
}
},
"response": {
"numFound": 1,
"start": 0,
"docs": [
{
"id": 33,
"name": "jeans",
}
]
},
"debug": {
"rawquerystring": "name:(skinny jeans)",
"querystring": "name:(skinny jeans)",
"parsedquery": "name:skinny name:jeans",
"parsedquery_toString": "name:skinny name:jeans",
"explain": {
"33": "\n2.2143755 = product of:\n 4.428751 = sum of:\n 4.428751 = weight(name:jeans in 54) [DefaultSimilarity], result of:\n 4.428751 = score(doc=54,freq=1.0), product of:\n 0.6709952 = queryWeight, product of:\n 6.600272 = idf(docFreq=1, maxDocs=541)\n 0.10166174 = queryNorm\n 6.600272 = fieldWeight in 54, product of:\n 1.0 = tf(freq=1.0), with freq of:\n 1.0 = termFreq=1.0\n 6.600272 = idf(docFreq=1, maxDocs=541)\n 1.0 = fieldNorm(doc=54)\n 0.5 = coord(1/2)\n"
},
"QParser": "LuceneQParser"
}
}
Es ist klar, dass der Parameter parsedquery die schindelförmige Abfrage nicht anzeigt. Was muss ich tun, um den Abgleich von Query-Schindeln mit indizierten Werten abzuschließen? Ich habe das Gefühl, dass ich diesem Problem sehr nahe bin. Jeder Rat wird geschätzt!
Haben Sie versucht Name: "Skinny Jeans"? – MatsLindh
Ja, nichts wird zurückgegeben, nicht einmal "Jeans". Dies kann auf eine andere Frage im Zusammenhang I angehoben @ [link] (https://stackoverflow.com/questions/37425263/solr-keywordtokenizerfactory-exact-match-for-multiple-words-not-working) Als @ Abhijit Bashetti erwähnte, Token funktionieren nicht so, sie sind nicht sequenziert. Außerdem möchte ich nicht, dass es so funktioniert, ich möchte keine Anführungszeichen verwenden, da ich nach einem Teilstring suche, und dies würde den Zweck zunichte machen. – mils