支持用户指定过滤条件,筛选文档。过滤表达式不是一个必选子句。
语法:filter:"表达式"
其中表达式左值 关系运算符 右值
左值:可以是一个属性字段或者是一个常量值(可以是数值或者string)
关系运算符:目前支持的逻辑运算有>、<、=、<=、>=、!=
右值:可以是一个属性字段或者是一个常量值(可以是数值或者string)
示例:
filter:"price > 100" 表示筛选出价格大于100的文档
filter:"ids=1" ids为一个多值字段,表示筛选出ids中包含1的文档
filter:"province!=\"浙江\"" ,表示筛选出province不为浙江的文档
查询示例
多个过滤条件组合
语法:filter:"条件 逻辑运算符 条件"
条件:是一个完整的关系运算表达式,比如 price > 100
逻辑运算符:AND、OR。AND表示两边条件都必须为TRUE,OR表示有一个为TRUE即可。也可以在子句中使用()
,括号的优先级最高。
示例:
filter:"price > 100 AND categoryId=10",表示筛选出categoryId为10,且价格大于100的文档
filter:"categoryId = 100 OR categoryId=10",表示筛选出categoryId为100或者10的文档
filter:"(categoryId = 100 OR categoryId=10) AND price > 100",表示筛选出categoryId为100或者10且价格大于100的文档
过滤时使用算术运算
语法:filter:"左值 算术运算符 右值 关系运算符 条件值"
左值:可以是一个属性字段或者是一个常量值(可以是数值或者string)
算术运算符:目前支持的逻辑运算有+、-、*、/
右值:可以是一个属性字段或者是一个常量值(可以是数值或者string)
条件值:可以是一个属性字段或者是一个常量值
示例:
filter:"price*0.5 > 100",表示筛选出price打5折之后大于100的文档
filter:"price-cost > 100",表示筛选出price减去cost大于100的文档
filter:"(price*0.5 > 100) AND categoryId=10",表示筛选出price打5折之后大于100且categoryId为10的文档
过滤时使用function函数
语法:filter:"function 关系运算符 右值"
说明:function为内置的function函数,比如in/notin等,更多的内置函数可以参考内置function函数。如果function函数的返回值是bool型,那么filter中可以不需要关系运算符。另外关系运算符的右边也可以是一个function函数。
示例:
filter:"in(id,"1|2|3")",表示筛选出id为1或者2或者3的文档
其他function用法可参考下文中的内置function函数。
内置function函数
distance
distance:获取两个点之间的球面距离。一般用于LBS的距离计算。
举例:
查找距离用户(120.34256,30.56982)10公里内的商铺(lon,lat为文档中记录商家的经纬度值,需要配置为属性字段):
filter:"distance(lon,lat,\"120.34256\",\"30.56982\")<10"
contain/notcontain
说明:
contain:判断单值或多值a中是否包含b中描述的内容
notcontain:判断单值或多值a中是否不在b中描述的内容
参数:
contain(a,b)
a:输入为单值多值的int32/int64/string 类型
b:输入为常量string表达式,用
|
分隔,表示满足任意一项即可
notcontain(a,b)
a:输入为单值多值的int32/int64/string 类型
b:输入为常量string表达式,用
|
分隔,表示不满足任意一项即可
返回值:
contain(a,b)
:boolean类型返回,表示参数a是否包含参数b中描述的集合notcontain(a,b)
:boolean类型返回,表示参数a是否不在参数b中描述的集合
举例:
使用contain
,检索nid字段值在[1,2,3]的所有记录
filter:"contain(nid, \"1|2|3\")"
使用notcontain
,检索nid字段值不在[1,2,3]范围内的所有记录
filter:"notcontain(nid, \"1|2|3\")"
in/notin
in和notin: 判断字段值是否(不)在指定列表中
举例:
查询文档中type(int类型)为1或2或3的文档:
filter:"in(type, \"1|2|3\")"
查询文档中type(int32类型)不为1或2或3的文档:
filter:"notin(type, \"1|2|3\")"
注意事项
float、double类型因为精度问题无法做精确相等的判断,如有这种场景请改用>和<来实现。
string类型的字段值,在filter表达式中必须要加双引号,支持所有的关系运算,不支持算术运算。
string类型字段的过滤仅支持=、!=运算,含义为等于、不等于,不支持>、<等关系运算。
多值字段使用=、!=时,其语义是多值字段只要包括filter的值即可。
表达式中的双引号需要转义。