【问题标题】:GAE python: why is searching through the datastore so slow? What is a good search query algorithms?GAE python:为什么在数据存储中搜索这么慢?什么是好的搜索查询算法?
【发布时间】:2015-02-11 06:31:16
【问题描述】:

我正在使用 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 秒),因为您必须遍历每一个数据才能找到结果。如果使用多个词,搜索次数会成倍增加。

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

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

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

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

    只需在搜索文档中输入数据,然后您就可以通过它们进行查询

    【讨论】:

    • 我也考虑过使用它。但是您不能自定义自己的搜索。至少 100 个查询的价格看起来有点吓人。
    • “您不能自定义自己的搜索”是什么意思?考虑设置类似弹性搜索的东西并使用它。 Datastore 不适用于全文搜索,但对于简单的单词查询,您可以通过拆分所有单词并将它们存储在重复属性中来加快速度。
    • 谢谢德米特里。通过自定义,我认为只使用 python 进行查询并在以后添加更多功能会更容易。如果我错了,请纠正我。
    • 搜索 API 中也有很多可用的功能,例如逻辑运算符、计数等。您应该阅读文档,您会发现此功能非常有用。如果您想坚持使用简单的 python 检查,那么您将不得不在速度上做出妥协,这也将无法扩展。
    • tipsywacky 您要做的最后一件事是查看数据存储中的所有结果以查找内容。查找“索引”。
    【解决方案2】:

    如果search_words的字数不多,可以在title上查询IN

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

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

    【讨论】:

      【解决方案3】:

      我认为@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 操作符可以找到至少有一次“命中”的实体——而且它使用事物“后端”的索引来快速定位。

      【讨论】:

      • 将元组/列表提供给ComputedProperty 返回NotImplementedError: Property ... does not support <type 'tuple'> types. 这个解决方案是不可行的,可悲的是
      猜你喜欢
      • 2013-04-11
      • 2012-11-01
      • 2013-09-19
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多