全部產品
Search
文件中心

OpenSearch:filter子句

更新時間:Jul 13, 2024

子句說明

過濾功能支援使用者根據查詢條件,篩選出使用者感興趣的文檔。會在通過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