Frage

Ich baue eine Suchfunktion für eine PHP-Website mit Zend Lucene und ich bin ein Problem. Meine Website ist ein Shop Director (so ähnlich).

Zum Beispiel habe ich einen Laden namens „FooBar“ aber meine Besucher seach für „Foo Bar“ und Null Ergebnisse. Auch wenn ein Laden heißt „Foo Bar“ und Besucher seaches „FooBar“ nichts gefunden wird.

Ich habe versucht, für "foobar ~" (fuzzy Suchanfrage) seach aber nicht namentlich genannten "Foo Bar"

gefunden

Sie haben einen speciar Weg, um den Index zu erstellen oder die Abfrage zu machen?

War es hilfreich?

Lösung

Option 1: Brechen Sie die Eingabe Abfrage-String in zwei Teile an verschiedenen Stellen und suchen sie. z.B. In diesem Fall Abfrage sein (fo + bar +) würde OR (+ foo + bar) OR (+ foob + ar) Das Problem ist, diese tokenization zwei Token in Eingangs Query-String annimmt sind. Außerdem können Sie erhalten zusätzliche, möglicherweise irrelevant, Ergebnisse wie Ergebnisse von (+ foob + ar)

Option 2: Verwenden Sie n-Gramm tokenization beim Indizieren und Abfragen. Während die Token Indizierung für "foo bar" wäre fo, oo, ba, ar. Während mit Foobar Suche würde Token fo sein, oo, ob, ba, ar. Die Suche mit OR als Operator erhalten Sie die Dokumente mit maximal n-Gramm-Matches an der Spitze. Dies kann mit NGramTokenizer

Andere Tipps

Manuell Indexeinträge für häufigste Verwirrungen hinzuzufügen. Holen Sie sich Ihre Kunden, um sie auf einem speziellen Formular eingeben.

Haben Sie versucht, "* foo * und * bar *" oder "* foo * OR * bar *"? Es funktioniert in Ferret und ich lese es auf Lucene basiert.

Wenn Sie nicht über die Leistung kümmern, verwendet WildcardQuery (Performance deutlich schlechter):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

Für null oder mehr Zeichen, verwenden Sie ‚*‘, für null oder ein Zeichen, Verwendung ‚?‘

Wenn die Leistung wichtig ist, versuchen BooleanQuery verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top