全部产品
Search
文档中心

智能开放搜索 OpenSearch:filter子句

更新时间:Dec 27, 2023

子句说明

过滤功能支持用户根据查询条件,筛选出用户感兴趣的文档。会在通过query子句查找到的文档进行进一步的过滤,以返回最终所需结果。

语法说明

过滤条件格式为:field=value

  • 过滤条件支持>、<、=、<=、>=、!=、in/notin 等常见条件运算符;以及+、-、*、/、&、^、| 等算术运算符;

  • 过滤条件可以配置多个,通过AND、OR及()的逻辑运算关系(必须大写!)进行连接。

注意事项

  1. filter为非必选子句。

  2. 在filter中出现的字段必须在定义应用结构的时候配置为属性字段。

  3. FLOAT、DOUBLE类型因为精度问题无法做精确相等的判断,如有这种场景请改用>和<来实现。

  4. LITERAL类型的字段值,在filter子句中必须要使用双引号(否则会报错:6135,常量表达式类型错误),支持所有的关系运算,不支持算术运算。

  5. 排序功能——功能函数项中的函数,可以在filter子句中使用;如:distance函数。

  6. LITERAL类型字段的过滤仅支持=、!=运算,含义为等于、不等于,不支持>、<等关系运算。(LITERAL字段类型不分词,需要完全匹配)

  7. in/notin 判断字段值是否(不)在指定列表中,支持INT、LITERAL及FLOAT、DOUBLE类型,( 不支持ARRAY、TEXT、模糊分词系列类型 ),详细用法参考 in和notin

  8. 分词字段类型无法配置为属性,例如 TEXT,SHORT_TEXT等都不支持,只支持数值字段类型及不分词字段类型配置为属性,例如INT,INT_ARRAY,FLOAT,FLOAT_ARRAY,DOUBLE,DOUBLE_ARRAY,LITERAL,LITERAL_ARRAY这些字段类型都支持。

功能性函数使用

  • distance: 获取两个点之间的球面距离。一般用于LBS的距离计算。

举例

查找距离用户(120.34256,30.56982)10公里内的外婆家(lon,lat为文档中记录商家的经纬度值,需要配置为属性字段):

query=default:'外婆家'&&filter=distance(lon,lat,"120.34256","30.56982")<10
  • in_polygon: 判断某个点是否在某个多边形范围内,一般用于配送范围判断

举例

判断用户是否在商家的配送范围。如商家配送范围的字段为coordinates, 用户位置坐标为 (120.307234, 39.294245),过滤在配送范围内的商家:

query=default:'美食'&&filter=in_polygon(coordinates, 120.307234, 39.294245)>0
  • in_query_polygon: 判断文档中指定的点是否在用户指定的多边形范围内

举例

搜索银泰商圈(xA,yA,xB,Yb,xC,Yc;xD,yD,xE,yE,xF,yF,xG,yG)的外婆家,商家位置存放在point字段中

query=default:'外婆家'&&filter=in_query_polygon("polygons",point)>0&&kvpairs=polygons:xA\,yA\,xB\,Yb\,xC\,Yc;xD\,yD\,xE\,yE\,xF\,yF\,xG\,yG
  • bit_struct: 将INT_ARRAY字段值进行自定义分组并允许对分组值进行指定operation计算

举例

查询给定时间段在营业的店铺有哪些? 假定用户文档中有一个int64_array类型的字段open_time,每个值表示一段营业时间,将int64的高32位表示起始时间,低32位表示结束时间,如果要查询下午14点到15:30点营业的店铺,可以将时间转换为从当天0点开始,按分钟为单位的时间段, 则下午14点到15:30表示为(840,930):

filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
  • fieldlen: 获取LITERAL类型字段长度

举例

返回用户名usr_name不为空的文档

query=default:'关键词'&&filter=fieldlen(usr_name)>0
  • in/notin: 判断字段值是否(不)在指定列表中

举例

查询文档中包含"iphone"且type(int类型)为1或2或3的文档:

query=default:'iphone'&&filter=in(type, "1|2|3")

查询文档中包含"iphone"且type(int32类型)不为1或2或3的文档:

query=default:'iphone'&&filter=notin(type, "1|2|3")

举例

商品有多个价格[市场价、折扣价、销售价],存到prices字段中。查询销售价小于1000的手机:

query=default:'手机'&&filter=multi_attr(price,2)<1000

示例

  1. 应用中有一个int32字段category,值分别为1(news),2(bbs)等,需要查询分类category为2(bbs)且包含"浙大"的文档:

     query=default:'浙大' AND category_search:'2'   //category字段创建了一个索引字段category_search
      //或者
     query=default:'浙大'&&filter=category=2
  2. 小说应用中有个LITERAL_ARRAY字段tags,表示小说风格标签:"宫廷"、"悬疑恐怖"、"言情",需要查询包含"甄嬛传"且标签包含"宫廷"的文档:

     query=default:'甄嬛传'&&filter=tags="宫廷"
  3. 电商应用中有个int32的字段hit(点击)和sale(销量),及int64的字段create_time,需要查询包含"连衣裙"且销量与点击的和乘上rate(偏移率)超过10000,创建时间早于1402345600的文档:

     query=default:'连衣裙'&&filter=(hit+sale)*rate>10000 AND create_time<1402345600