Escaparea interogărilor de căutare pentru serviciul Google de căutare text integral

This is a cross-post of https://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion

Lucrez cu noul serviciu de căutare full text în gae 1.6.6 și am probleme în a afla cum să scap de coloanele mele de interogare înainte să le trimit în indexul de căutare. Documentele menționează că anumite caractere trebuie să fie scoase (și anume, operatorii numerici ), cu toate acestea ei nu specifică cum parserul interogărilor așteaptă ca șirul să fie scăpat.

Problema pe care o am este de două ori:

  1. Failing to escape the crap out of many characters (more than those that are hinted at in the docs) will cause the parser to raise a QueryException.
  2. When I've escaped the query to the point it won't raise, the numeric operators (>, <, >=, <=) no longer parse correctly (not factored into the search).

Confirmați un test în care v-am alimentat string.printable în my_index.search() și am constatat că va ridica QueryException "caractere de control, pe care acum le-am dezbrăcat, precum și lucruri care ar părea inocente ca asterisc, virgulă, paranteză, bretele, tilde. Nici unul dintre acestea nu este menționat în documente ca fiind nevoit să fie scăpat.

Până acum am încercat:

  • cgi.escape()
  • saxutils.escape() with a mapping of ascii to urlencoded equivalents (eg , -> %2C)
  • saxutils.escape() with a mapping of ascii to html entity encoded ascii codes (eg {)
  • urllib.quote_plus()

I've gotten the best results so far using url-style(%NN) replacements, but >, <, >=, and <= continue to fail to yield the expected results from the index. Also, and this doesn't really seem to have anything to do with the escaping issue, but using NOT in front of a field = value type query seems to not be working as advertised either.

tl; dr

Cum ar trebui să mă scape de interogările mele înainte de a le trimite la serviciul de căutare, astfel încât parserul să nu ridice QueryException și interogarea mea produce rezultate așteptate?

0

1 răspunsuri

după cum se explică pe scurt în documentație ( https://developers.google.com/ appengine/docs/python/search/overview # Query_Language_Overview ), parametrul interogării este un șir care ar trebui să corespundă limbii noastre de interogare. Ce ar trebui să documentăm mai bine.

Pentru moment, vă recomand să completați interogările dvs. (sau cel puțin unele dintre cuvintele/termenii) în ghilimele duble. În acest fel, veți putea să transmiteți toate caracterele imprimabile, dar "și. Următorul exemplu va arăta rezultatul.

import string
from google.appengine.api.search import Query
Query('"%s"' % string.printable.replace('"', '').replace('\\', ''))

și ați putea chiar să transmiteți caractere care nu pot fi tipărite

Query('"%s"' % ''.join(chr(i) for i in xrange(128)).replace('"','').replace('\\', ''))

EDIT: Note that anything that is enclosed in double quotes is an exact match, that is "foo bar" would match against ...foo bar... but no ...bar foo..

0
adăugat
Ar fi posibil să oferim un exemplu mai practic? Având în vedere o întrebare de genul created> = 2009-20-13 ȘI descriere: foobar , cum ai face să scapi de asta?
adăugat autor Owen Nelson, sursa
Ok, încep să văd. Aceasta este într-adevăr contextuală (așa cum am făcut aluzie la postul meu de grupuri). foo> = 123 funcționează fără intervenție, dar foo> = 123> va ridica o excepție. Se pare că trebuie să construiesc un parser pre-parser pentru a rezolva acest lucru complet. Este stânjenitor.
adăugat autor Owen Nelson, sursa
În plus, campul mai mare decât cel de pe data mea nu pare să funcționeze deloc, chiar și atunci când oferă o interogare civilă și bine formată.
adăugat autor Owen Nelson, sursa
Am să văd unde te duci cu întrebarea asta. Mă uit acum la 2 contexte diferite pentru rularea interogărilor: primul este atunci când pregătesc interogarea pentru utilizator (în siguranță, nu trebuie să fie scăpat) și a doua fiind întrebări provenite de la utilizator (pe care ar trebui să fiu dezbrăcarea brutală a ghimpilor și a spinii, așa cum se întâmplă).
adăugat autor Owen Nelson, sursa
Acest răspuns modifică termenul original de căutare eliminând orice ghilimele duble care ar putea fi de fapt parte din interogare. În schimb, utilizez următorul înlocuitor cu succes, care scapă pur și simplu de orice ghilimele duble din termenul de căutare: search_term.replace ('' ',' \\ '')
adăugat autor Nick Franceschina, sursa
Interogarea pe care ați furnizat-o nu trebuie să fie scăpată Interogarea ("creată> = 2009-20-13 ȘI descrierea: foobar") funcționează bine. Dacă de fapt căutați șirul "creat> = 2009-20-13 ȘI descrierea: foobar" în documentele dvs., ar trebui să închideți șirul în ghilimele. Dar, de regulă, voi înconjura în ghilimele duble orice operator definit în documentație dacă vreau să le folosesc ca personaje și nu ca operatori.
adăugat autor Sebastian Kreft, sursa
Presupun că primești șirul de interogări de la un utilizator final. Dreapta?
adăugat autor Sebastian Kreft, sursa
Acest răspuns datează din 2012 și menționează "pentru moment". Există o modalitate mai bună de a face acest lucru acum? împachetarea în citate nu este o soluție de dorit, deoarece va căuta șirul exact
adăugat autor manubot, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.