我正在使用谷歌应用引擎数据存储区,并在数据存储区中有大约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秒),因为你必须通过每一个数据才能找到结果。如果您使用多个单词,它将乘以搜索次数。
所以我的问题是。有哪些方法可以加快搜索和谷歌应用引擎的速度?任何示例和指示都将是感激的。提前谢谢。
答案 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
运算符定位具有至少一个“命中”的实体 - 并且它使用事物的“后端”上的索引快速完成。