全部产品
Search
文档中心

智能开放搜索 OpenSearch:filter表达式

更新时间:Nov 17, 2023

支持用户指定过滤条件,筛选文档。过滤表达式不是一个必选子句。

语法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的值即可。

  • 表达式中的双引号需要转义。