Escape-Suchanfragen für den Google-Volltextsuchdienst
Dies ist ein Cross-Post vonhttps://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion
Ich arbeite mit dem neuen Volltextsuchdienst in gae 1.6.6 und habe Probleme damit, meine Abfragezeichenfolgen korrekt zu maskieren, bevor ich sie an den Suchindex weitergebe. In den Dokumenten wird erwähnt, dass bestimmte Zeichen maskiert werden müssen (d. Hnumerische Operatoren), aber sie geben nicht anWie Der Abfrageparser erwartet, dass die Zeichenfolge maskiert wird.
Ich habe zwei Probleme:
Wenn es nicht gelingt, dem Mist vieler Zeichen zu entkommen (mehr als in den Dokumenten angegeben), löst der Parser a ausQueryException
.Wenn ich die Abfrage so weit maskiert habe, dass sie nicht mehr ausgelöst wird, werden die numerischen Operatoren (>, <,> =, <=) nicht mehr korrekt analysiert (bei der Suche nicht berücksichtigt).Ich richte einen Test ein, bei dem ich fütterestring.printable
inmy_index.search()
und festgestellt, dass es erhöhen würdeQueryException
auf jedem der "druckbaren" Steuerzeichen, die ich jetzt herausnehme, sowie auf Dingen, die unschuldig erscheinen würden, wie Sternchen, Komma, Klammern, Klammern, Tilde. In den Dokumenten wird nicht erwähnt, dass ein Escape-Befehl erforderlich ist.
Bisher habe ich versucht:
cgi.escape()
saxutils.escape()
mit einer Zuordnung von ASCII zu urlencodierten Äquivalenten (z,
->%2C
)saxutils.escape()
mit einer Zuordnung von ASCII zu HTML-Entity-codierten ASCII-Codes (z{
)urllib.quote_plus()
Ich habe die besten Ergebnisse bisher mit url-style erzielt (%NN
) Ersetzungen, aber>, <,> = und <= liefern weiterhin nicht die erwarteten Ergebnisse aus dem Index. Auch und dies scheint nicht wirklich etwas mit dem entkommenden Problem zu tun zu haben, sondern mitNOT
vor einemfield = value
Typabfrage scheint auch nicht wie angekündigt zu funktionieren.
Wie kann ich meine Abfragen umgehen, bevor ich sie an den Suchdienst sende, damit der Parser nicht ausgelöst wird?QueryException
und Meine Abfrage liefert erwartete Ergebnisse?