GAE python:为什么搜索数据存储这么慢?什么是好的搜索查询算法?

时间:2015-02-11 06:31:16

标签: python google-app-engine

我正在使用谷歌应用引擎数据存储区,并在数据存储区中有大约1500篇博文。

使用ndb

class BlogPost(ndb.Model):
    title = ndb.StringProperty(required=True)
    content = ndb.TextProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

所以我正在使用

words = self.request.get("q")
search_words = words.split()

query = libs.blogs_cache() # returns a list of blogs memcache
search_results = [blog for blog in query for word in search_words 
            if word.lower() in blog.title.lower()]

这是我暂时使用的一个例子。但不幸的是,这非常慢(大约需要6秒),因为你必须通过每一个数据才能找到结果。如果您使用多个单词,它将乘以搜索次数。

所以我的问题是。有哪些方法可以加快搜索和谷歌应用引擎的速度?任何示例和指示都将是感激的。提前谢谢。

3 个答案:

答案 0 :(得分:3)

我认为对于这种类型的搜索,您应该使用google app engine search api。

https://cloud.google.com/appengine/docs/python/search/

只需提供搜索文档中的数据,然后您可以通过它们进行查询

答案 1 :(得分:1)

如果search_words中的字词太多,您可以对title进行IN查询:

search_words = [word.lower() for word in words.split()]
search_results = BlogPost.query(BlogPost.title.IN(search_words)).fetch()

请注意,这与您可能不想要的标题完全匹配,如果您需要查询小写博客标题,您可能还必须为此设置ComputerProperty

答案 2 :(得分:1)

我认为@ omair_77的答案可能是最好的,但如果博客文章和搜索列表足够小,可以选择考虑计算属性

class BlogPost(ndb.Model):
    title = ndb.StringProperty(required=True)
    content = ndb.TextProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
    words = ndb.ComputedProperty(lambda self: content.lower().split())

现在,BlogPost.words.IN(words.lower().split())将为您提供所需的语义 - 所有博客都包含至少一个以空格分隔的字符串words中的单词,不区分大小写。

如果您需要忽略标点符号,则可能需要使用正则表达式(re.findall(r'\w+', whatever.lower())而不是简单的split调用,但GAE术语中的一般概念是相同的:计算属性可以是在查询中使用,并且IN运算符定位具有至少一个“命中”的实体 - 并且它使用事物的“后端”上的索引快速完成。