Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine StringProperty的gql查询中不区分大小写的where子句_Google App Engine_Gql_Gqlquery - Fatal编程技术网

Google app engine StringProperty的gql查询中不区分大小写的where子句

Google app engine StringProperty的gql查询中不区分大小写的where子句,google-app-engine,gql,gqlquery,Google App Engine,Gql,Gqlquery,使用google appengine数据存储,是否有方法执行gql查询,在不区分大小写的StringProperty数据类型上指定WHERE子句?我并不总是确定该值在什么情况下。文档指定where对my值区分大小写,是否有方法使其不区分大小写 例如,db模型如下所示: from google.appengine.ext import db class Product(db.Model): id = db.IntegerProperty() category = db.String

使用google appengine数据存储,是否有方法执行gql查询,在不区分大小写的StringProperty数据类型上指定WHERE子句?我并不总是确定该值在什么情况下。文档指定where对my值区分大小写,是否有方法使其不区分大小写

例如,db模型如下所示:

from google.appengine.ext import db
class Product(db.Model):
    id = db.IntegerProperty()
    category = db.StringProperty()
数据如下所示:

id         category
===================
1          cat1
2          cat2
3          Cat1
4          CAT1
5          CAT3
6          Cat4
7          CaT1
8          CAT5
我想说

gqlstring = "WHERE category = '{0}'".format('cat1')
returnvalue = Product.gql(gqlstring)
并具有
returnvalue
contain

id         category
===================
1          cat1
3          Cat1
4          CAT1
7          CaT1

我认为数据存储中没有这样的操作符


您是否控制类别数据的输入?如果是这样的话,您应该选择一个标准格式来存储它(全小写或全大写)。如果出于某种原因需要存储原始案例,那么可以只存储两列—一列包含原始案例,一列包含标准案例。这样,您就可以执行普通的WHERE子句。

数据存储不支持不区分大小写的比较,因为您不能为使用它们的查询编制索引(除非索引转换值)。正如Peter所建议的,解决方案是在标准字符串之外存储字符串的规范化版本。库中的属性类可能会很有用,特别是DerivedProperty。

这个线程很有用,让我想用类似的方法来帮助实现部分搜索匹配。我在DatastoreKind上再添加一个字段,并将规范化短语上的每个单词保存为一个集合,然后在过滤器中使用以进行碰撞。这是一个Clojure的例子。规范化部分至少应易于翻译为java(感谢@raek on#clojure),而数据库交互应可转换为任何语言:

(use '[clojure.contrib.string :only [split lower-case]])
(use '[appengine-magic.services.datastore :as ds])

; initialize datastore kind entity
(ds/defentity AnswerTextfield [value, nvalue, avalue]) 

; normalize and lowercase a string
(defn normalize [string-to-normalize]
  (lower-case
    (apply str
      (remove #(= (Character/getType %) Character/NON_SPACING_MARK)
               (java.text.Normalizer/normalize string-to-normalize java.text.Normalizer$Form/NFKD)))))

; save original value, normalized value and splitted normalized value
(defn textfield-save! [value]
  (ds/save! 
    (let [nvalue (normalize value)]
      (ds/new* AnswerTextfield [value nvalue (split #" " nvalue)]))))

; normalized search
(defn search-normalized [value]
  (ds/query :kind AnswerTextfield
            :filter [(= :nvalue (normalize value))]))

; partial normalized word search
(defn search-partial [value]
  (flatten
    (let [coll []]
      (for [splitted-value (split #" " (normalize value))]
        (merge coll 
          (ds/query :kind AnswerTextfield
                    :filter [(in :avalue [splitted-value])]))))))

最后我写了一个脚本来规范它们。感谢您提供指向库的指针。