Google app engine StringProperty的gql查询中不区分大小写的where子句
使用google appengine数据存储,是否有方法执行gql查询,在不区分大小写的StringProperty数据类型上指定WHERE子句?我并不总是确定该值在什么情况下。文档指定where对my值区分大小写,是否有方法使其不区分大小写 例如,db模型如下所示: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
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])]))))))
最后我写了一个脚本来规范它们。感谢您提供指向库的指针。