【问题标题】:How to make case insensitive filter queries with Google App Engine?如何使用 Google App Engine 进行不区分大小写的过滤器查询?
【发布时间】:2018-03-04 14:55:32
【问题描述】:

我正在从事一个 GAE Django 项目,我必须在其中实现搜索功能,我编写了一个查询,它根据搜索关键字获取数据。

portfolio = Portfolio.all().filter('full_name >=',key).filter('full_name <',unicode(key) + u'\ufffd')

这个查询的问题是,它区分大小写。

有没有什么方法可以让它工作,而不取决于关键字的大小写?

请提出建议。

提前致谢。

【问题讨论】:

    标签: django google-app-engine google-cloud-datastore


    【解决方案1】:

    您需要在写入时存储数据的规范化版本,然后使用相同的规范化进行搜索。

    将数据全部存储为大写或全部小写,可选择删除标点符号并将所有空格更改为单个空格,并可能将非 ASCII 字符转换为某种合理的 ASCII 表示(当然,这比听起来更棘手。)

    【讨论】:

    • 感谢您回答 Wooble。但是该项目是一个维护项目,因此已经有很多页面正在使用大量数据。现在对数据进行更改将需要大量的工作,即更改正在呈现数据的所有视图。有没有办法让它适用于当前的结构?
    • 您不必对所有视图等进行更改。只需添加一个名为 foo_uppercase 的字段,并让任务一次检查所有实体 1000 或其他内容并填写字段。
    • @Jason 感谢您的回复。但即便如此,它也需要更改所有现有数据存储区的值,以便将此属性更改为小写或大写?
    • 好吧,我必须按照 Wooble 的建议去做。但我认为应该有一些方法可以使过滤不区分大小写。请告诉我。
    • @anand 我认为没有人在谈论更改现有值,只是创建一个 new 字段并使用大写/小写版本填充它,然后对其进行搜索。
    【解决方案2】:

    这个问题的替代解决方案 - 数据集很小 - 是在从数据存储区调用结果后在 python 中过滤结果:

    for each_item in list_of_results:
        if each_item.name.lower().rfind(your_search_term) != -1:
            #Your results action
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2019-05-21
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多