2012-03-28 6 views
1

Ich muss einen Algorithmus machen, der mir erlaubt, unbestimmte (Regexp) Suche in Sphinx verwenden.Verwenden von Regexp mit Sphinx

Zum Beispiel: Ich brauche einen Ausdruck zu finden, die unsicheren Symbole enthält: „2x4“ vielleicht aussehen wie „2x4“ oder „2 * 4“ oder „2-4“.

Ich möchte etwas wie das tun: "2 (x | * | -) 4". Aber wenn ich versuche, in Abfrage dieser Konstruktion zu verwenden, teilen Sphinx es auf drei Worte: "2", "(x | * | -)" und "4":

$ search -p "2x4" 
... 
index 'xxx': query '2x4 ': returned 25 matches of 25 total in 0.000 sec 
... 
words: 
1. '2x4': 25 documents, 25 hits 


$ search -p "2(x|y)4" 
... 
index 'xxx': query '2(x|y)4 ': returned 0 matches of 0 total in 0.000 sec 

words: 
1. '2': 816 documents, 842 hits 
2. 'x': 21 documents, 21 hits 
3. 'y': 0 documents, 0 hits 
4. '4': 2953 documents, 3014 hits 

wie hässliche Hack, den ich Katze etwas tun wie (2x4) | (2 * 4) | (2-4), aber das ist keine gute Lösung, wenn ich eine große Phrase wie "2x4x2.2" bekomme und "2 (x | * | -) 4 (x | * | -) 2 (. |,) 2 ".

Ich kann die Option "charset_table" verwenden, um "*> x", "-> x", ",>." Zu definieren. und so weiter, aber das ist keine flexible Entscheidung.

Können Sie eine bessere Lösung finden?

ps: sorry für mein Englisch =)

+0

Die akzeptierte Antwort ist nicht ganz korrekt.Während RegEx nicht zur Suchzeit verwendet werden kann, kann es beim Erstellen des Index verwendet werden. Siehe meine Antwort. –

Antwort

2

Von dem, was ich gelesen habe, Sphinx nicht regex Suche unterstützt. Während die extended syntax (aktiviert mit der -e Option) Operatoren hat, die Alternativen unterstützen (den "OR" Operator: |) und Sequencing (der strikte Reihenfolgeoperator: < <), arbeiten sie nur mit Worten, nicht Atome, so dass 2 << (x|*|-) << 4 würde Zeichenfolgen entsprechen, bei denen jedes Element ein separates Wort ist, z. B. "2 x 4", "2 * 4".

Eine Option besteht darin, ein Dienstprogramm zu schreiben, das ein Muster des Formulars 2(x|*|-)4(x|*|-)2(.|,)2 (oder, um dem Regex-Idiom 2[-*x]4[-*x]2[.,]2 zu folgen) in eine erweiterte Sphinx-Abfrage konvertiert.

+0

Danke für deine Antwort, aber ich brauche Atome nicht Worte: "2x2" ohne Leerzeichen zwischen ... – taofos

+0

@taofos: das ist mein Punkt: Sphinx unterstützt nicht die Funktionen, die Sie brauchen, also brauchen Sie einen anderen Ansatz, wie ein Dienstprogramm, um aus Regexes in die erweiterte Abfragesprache von Sphinx zu übersetzen. – outis

+0

Jetzt benutze ich Mongo mit Regexp statt =) Viel langsamer, aber es ist kein Problem für mich ... – taofos

1

Sphinx Indizes ganze Wörter - und ‚tokenizes‘ das Wort in eine ganze Zahl, die dann in dem Index gespeichert ist. Als solche können reguläre Ausdrücke nicht funktionieren, weil Sie die ursprünglichen Wörter nicht haben.

Allerdings gibt es dict = Schlüsselwörter - die die Wörter in einem Index speichert. Aber das kann erst jetzt für * und? Platzhalter, unterstützt keine regulären Ausdrücke.

Auch könnte vielleicht die Techniken hier http://swtch.com/~rsc/regexp/regexp4.html

diskutiert verwenden

Dies zeigt, wie generische Regex Suche mit einem trigram Index umgesetzt werden kann. Sphinx selbst würde als Trigramm-Index arbeiten. Sie speichern die Trigramme als Stichworte, die dann Sphinx Indizes. Sphinx kann die booleschen Abfragen ausführen, die das System ausgibt.

(normal Sphinx, funktioniert ziemlich ähnlich wie die 'Indizierte Word Search' Abschnitt dokumentiert. So der Trick würde Sphinx als Backend für die indizierten Reg-Ex Suche verwenden)

2

Sie tatsächlich reguläre Ausdrücke verwenden können mit Sphinx.

Während sie können nicht bei Suchzeit verwendet werden, können sie verwendet werden, während der Index des Aufbau eine Gruppe von Worten/Symbolen zu identifizieren, die in Betracht gezogen werden sollten die gleichen Token sein.

http://sphinxsearch.com/docs/current.html#conf-regexp-filter

# index '13-inch' as '13inch' 
regexp_filter = \b(\d+)\" => \1inch 

# index 'blue' or 'red' as 'color' 
regexp_filter = (blue|red) => color 
+0

Großartig! Danke für die nützliche Ergänzung! – taofos

+0

Sollte als richtige Antwort markiert sein! – dft