8 Stimmen

TermQuery kehrt bei einem bekannten Suchbegriff nicht zurück, WildcardQuery hingegen schon

Ich hoffe, dass jemand mit genügend Einblick in das Innenleben von Lucene in der Lage sein könnte, mich in die richtige Richtung zu weisen =)

Ich werde die meisten der umliegenden irellevant Code überspringen, und schneiden Sie direkt auf den Punkt. Ich habe einen Lucene-Index, zu dem ich das folgende Feld zum Index hinzufüge (Variablen durch ihre literalen Werte ersetzt):

document.Add( new Field("Typenummer", "E5CEB501A244410EB1FFC4761F79E7B7", 
                        Field.Store.YES , Field.Index.UN_TOKENIZED));

Wenn ich später meinen Index durchsuche (unter Verwendung anderer Abfragetypen), kann ich überprüfen, ob dieses Feld tatsächlich in meinem Index enthalten ist, z. B. wenn ich eine Schleife durch alle von Document.GetFields() zurückgegebenen Felder ziehe

Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7

So weit, so gut :-)

Das eigentliche Problem ist nun, warum kann ich nicht eine TermQuery verwenden, um nach diesem Wert zu suchen und tatsächlich ein Ergebnis zu erhalten.

Dieser Code ergibt 0 Treffer:

// Returns 0 hits
bq.Add( new TermQuery( new Term( "Typenummer", 
        "E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

Aber wenn ich dies auf eine WildcardQuery (ohne Platzhalter) umstelle, erhalte ich den 1 Treffer, den ich erwarte.

// returns the 1 hit I expect
bq.Add( new WildcardQuery( new Term( "Typenummer", 
        "E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

Ich habe die Feldlängen überprüft, ich habe überprüft, dass ich denselben Analyzer verwende und so weiter, und ich stehe immer noch auf Platz 1, warum das so ist.

Kann mir jemand einen Tipp geben, wo ich suchen sollte?

9voto

Mark Cassidy Punkte 5770

Endlich habe ich herausgefunden, was los ist. Ich erweitere die Tags für diese Frage, da sich zu meiner Überraschung herausstellte, dass es sich um ein Problem mit dem CMS handelt, in dem dieses spezielle Problem auftritt. Zusammenfassend lässt sich sagen, dass das Problem auf Folgendes hinauslief:

  1. Das Feld wird UN_TOKENIZED gespeichert, d.h. Lucene speichert es genau "wie es ist".
  2. Die BooleanQuery, aus der ich Schnipsel eingefügt habe, wird innerhalb eines PreparedQuery-Wrappers an den Sitecore SearchManager gesendet
  3. Ich hatte erwartet, dass meine Abfrage (nachdem sie bereits vorbereitet war) unverändert an die Lucene-API weitergeleitet wird
  4. Wie sich herausstellte, lag ich falsch. Es durchläuft eine RewriteQuery-Methode, die meinen gesamten Satz verschachtelter Abfragen unverändert kopiert, mit einer Ausnahme - alle Term-Argumente werden durch eine LowercaseStrategy() übergeben
  5. Da ich einen UPPERCASE Term (UN_TOKENIZED) indiziert habe, und Sitecore meine PreparedQuery auf Kleinbuchstaben ändert, werden 0 Ergebnisse zurückgegeben

Ich werde keinen Streit darüber beginnen, ob dies eine "by design" oder "by design flaw" Implementierung der Lucene Wrapper API ist - ich werde nur anmerken, dass das Umschreiben meiner Abfrage bei Verwendung der PreparedQuery Überladung... für mich... unerwartet ist ;-)

Weitere Lehren hieraus; das Speichern des Feldes als TOKENIZED wird auch dieses Problem beseitigen, da der StandardAnalyzer standardmäßig alle Token klein schreibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X