First off, I _really_ like the idea of AppEngine. We're hosting most
of our sites (
versionsapp.com,
checkoutapp.com) on it and it works
great for that purpose. Impressed as we were, I started trying to
build our first serious webapp on AppEngine; a small webstore. What I
basically wanted to do is building a page where you could browse 50
products at a time, optionally limited by a search or tag, based on
Django. All went well until I wanted to implement search...
I grabbed a few example datasets from users of our Mac POS app, they
mostly have around a 1000 products with a name, brand and description.
I knew substring search was hard to implement, so I skipped that and
used the undocumented ext.search models with my own set of search
words, mostly around 40 per product. Because some searches took quite
long I decided to slice the results by 50 at a time, not impressive
but good enough. And because product descriptions don't change often I
could use memcache to cache each result 'slice'.
To do so, I figured I needed to at least order by name, so the slicing
would make sense. Therefore I had to create an index on name,
searchIndex (set of searchable words). Worked great, until I tried to
type two words. I told me I had to create another index: name,
searchIndex, searchIndex. Seemed logical, but then people may want to
type more then 2 words at the same time so I added 5 indexes to get up
to five words.
From that moment inserting products started to take more then a
second, which I guess was due to the indexing, but even worse, I
started to get errors like BadRequestError: Too many indexed
properties for entity: app. I found out the max indexes for an entity
is capped at 5000, and calculated that if I were to use max 3 words
for a search I could only add 17 searchable words in an items' index
(17*17*17=4913). I'm still not sure that math is 100% correct, but at
least I was able to insert most of my products again, but searching is
just horribly slow.
So now I'm stuck with a _lot_ of limitations for a simple app: only 3
search terms, no substring searching, 50 results at a time and in my
opinion pretty bad performance, especially when inserting. Maybe I'm
doing something horribly wrong, and I don't consider myself the best
db programmer out there but this just seems silly.
Again, this is not to bash AppEngine because I really see the
potential and like the idea. But as it stands now it's just unusable
for us (a small indie dev company that wants their products to scale),
and it's hard for me to imagine that anyone else can live with these
limitations. I guess what I'm saying is: I love this thing to work for
us! We want to use it and pay for it! Seriously, please fix the
searching... you're Google for god sake :-)
Kindest regards,
Koen Bok -
madebysofa.com