Vra

Eenvoudige een regtig. In SQL, as ek wil 'n teks veld te soek na 'n paar van die karakters, kan ek doen:

SELECT blah FROM blah WHERE blah LIKE '%text%'

Die dokumentasie vir App Engine maak geen melding van hoe om dit reg te kry, maar seker dit is 'n algemene genoeg probleem?

Was dit nuttig?

Oplossing

groottabel, wat is die databasis agterkant vir App Engine, sal die skaal om miljoene rekords. As gevolg van hierdie, sal App Engine nie toelaat dat jy enige navraag wat sal lei tot 'n tafel scan doen, as prestasie verskriklike vir 'n goed bevolk tafel sou wees.

Met ander woorde, elke navraag moet 'n indeks gebruik. Dit is hoekom jy net kan doen =, > en < navrae. (In die feit dat jy kan ook != doen, maar die API doen dit met behulp van aa kombinasie van > en < navrae.) Dit is ook die rede waarom die ontwikkeling omgewing monitor al die navrae wat jy doen en outomaties voeg 'n vermiste indekse om jou index.yaml lêer.

Daar is geen manier om indeks vir 'n LIKE navraag so dit is eenvoudig nie beskikbaar nie.

Het jy 'n horlosie van hierdie Google IO sessie vir 'n veel beter en meer volledige uiteensetting van hierdie.

Ander wenke

Ek is die gesig staar dieselfde probleem, maar ek het iets op Google app enjin bladsye:

Tip: Query filters het nie 'n eksplisiete manier om net deel van 'n string waarde te pas, maar jy kan fake 'n voorvoegsel wedstryd met behulp van ongelykheid filters:

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
            "abc",
            u"abc" + u"\ufffd")

Dit pas by elke MyModel entiteit met 'n string eiendom stut wat begin met die karakters ABC. Die unicode string u "\ ufffd" verteenwoordig die grootste moontlike Unicode karakter. Wanneer die waarde van eiendom is gesorteer in 'n indeks, die waardes wat in hierdie reeks val is al die waardes wat begin met die gegewe voorvoegsel.

http://code.google.com/appengine/docs/ python / datastore / queriesandindexes.html

miskien kan dit doen die truuk;)

Altough App Engine ondersteun nie SOOS navrae, 'n blik op die eienskappe Object en StringListProperty . Wanneer 'n toets gelykheid gedoen op dié eiendomme, sal die toets eintlik toegepas word op alle lede lys, bv list_property = value toetse as die waarde verskyn nêrens in die lys.

Soms hierdie funksie kan gebruik word as 'n tydelike oplossing om die gebrek aan SOOS navrae. Byvoorbeeld, dit maak dit moontlik om te doen eenvoudige teks soek, soos beskryf op hierdie post .

Jy moet soek diens gebruik om volteksnavraag navrae soortgelyk aan SQL LIKE uit te voer.

Gaelyk bied domein spesifieke taal te meer use navrae . Byvoorbeeld, sal volgende uit die eerste tien boeke gesorteer van die nuutste kinders met titel bevat fern vind en die genre presies ooreenstem thriller:

def documents = search.search {
    select all from books
    sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
    where title =~ 'fern'
    and genre =  'thriller'
    limit 10
}

Soos geskrywe is as Groovy se wedstryd operateur =~. Dit word ondersteun deur funksies soos distance(geopoint(lat, lon), location) sowel.

Het jy 'n blik op objektiveer hier , dit is soos 'n toegang-datastoor API. Daar is 'n Vrae met hierdie vraag spesifiek, hier is die antwoord

  

Hoe doen ek 'n navraag (Hou "cat%")
  Jy kan iets soos 'n startWith, of endWith doen as jy die einde te keer wanneer gestoor en gesoek. Jy doen 'n reeks navraag met die aanvang van die waarde wat jy wil, en nie 'n waarde net bokant die een wat jy wil.

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");

Volg hier: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354

Dit werk!

class Article(search.SearchableModel):
    text = db.TextProperty()
    ...

  article = Article(text=...)
  article.save()

To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

Ek getoets hierdie met GAE Datastore lae-vlak Java API. My en werk perfek

    Query q = new Query(Directorio.class.getSimpleName());

    Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
    Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
    Filter filterNombre =  CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);

    q.setFilter(filter);

In die algemeen, selfs al is dit 'n ou post, 'n manier om te produseer 'n "soos" of "ILIKE 'is om al die resultate in te samel van 'n'> = 'n navraag, dan lus resultate in python (of Java) vir elemente bevat wat jy soek vir.

Kom ons sê jy wil gebruikers filter gegee 'n q = 'luigi'

users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))

for _qry in qry:
 if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
      users.append(_qry)

Dit is nie moontlik om 'n soortgelyke soek op datastore app enjin doen, hoe ooit skep van 'n Array List sal die truuk doen as wat jy nodig het om te soek 'n woord in 'n string.

@Index
    public ArrayList<String> searchName;

en dan te soek in die indeks met behulp van objektiveer.

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

en dit sal jou 'n lys gee met al die items wat die wêreld jy op soek

het bevat

As die LIKE '%text%' vergelyk altyd 'n woord of 'n paar (dink permutasies) en jou data veranderinge stadig (stadig beteken dat dit nie te duur - beide prys-wys en prestasie-wyse - om te skep en updates indekse) dan Betrokkenheid Index entiteit (RIE) kan die antwoord wees.

Ja, sal jy het om bykomende datastore entiteit te bou en te vul dit gepas. Ja, daar is 'n paar beperkinge wat jy sal hê om te speel (een is 5000 beperking op die lengte van lys eiendom in GAE datastore). Maar die gevolglike soektogte is weerlig snel.

Vir meer inligting sien my RIE met Java en Ojbectify en RIE met Python poste.

"Soos" is dikwels gebruik as 'n swak-man se plaasvervanger vir die soektog teks. Vir die soektog teks, is dit moontlik om te gebruik whoosh-programenjin .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top