功能應用情境
在很多業務情境中會涉及到區間範圍查詢的需求,比如常見的O2O業務中會基於搜尋使用者所在地理位置的某個範圍內的商家進行查詢;商品搜尋中也會有基於商品最低和最高價格區間的查詢;還有後台類巨量資料檢索情境中也會有尋找某個時間段內的結果需求。
使用方法
實現range查詢總共分3步:
1.在定義應用結構中對需要range查詢的欄位進行相關的欄位類型配置。
只有以下欄位類型可支援range查詢,請按需求進行配置。
欄位類型 | 說明 | 系統限制 |
INT | int64類型整數, 支援INT類型資料的範圍查詢。 | 最多隻能有4個欄位為該類型。 |
TIMESTAMP | 大於等於0的整數時間戳記,單位為毫秒(儲存支援毫秒,查詢精度只到秒級,後3位元值預設為000)。提供時間戳記類型資料的範圍查詢。 | 最多隻能有4個欄位為該類型。 |
GEO_POINT | 字串類型,格式為:lon lat。lon表示經度,lat表示緯度,都為double類型,二者之間用空格分隔。lon的範圍:[-180, 180], lat範圍[-90, 90]。 | 最多隻能有2個欄位為該類型。 |
2.在定義索引結構中對步驟1類型的欄位建立索引並指定相關分析器。
TIMESTAMP欄位、GEO_POINT欄位和INT類型的欄位可建立單欄位索引,但是不可建立複合式索引。
這三個欄位建立的索引應選擇的分析器及含義可參見下表。
單欄位索引包含的欄位類型 | 實現range查詢的分析器名稱 | 分析器釋義 |
INT | 數值分析 | 分詞方式:不分詞索引類型:需要範圍查詢的數值索引。 |
TIMESTAMP | 數值分析 | 分詞方式:不分詞索引類型:需要範圍查詢的數值索引。 |
GEO_POINT | 地理位置 | 分詞方式:不分詞索引類型:需要範圍查詢的數值索引。 |
3.在查詢中使用range查詢文法實現區間查詢。
(1)INT與TIMESTAMP的範圍查詢
INT的範圍查詢文法與TIMESTAMP類型的文法相同,支援的查詢文法如下:
index:[number1,number2]// number1 <= index <= number2
index:[number1,number2)// number1 <= index < number2
index:(number1,number2]// number1 < index <= number2
index:(number1,number2)// number1 < index < number2
index:(,number2)// index < number2
index:(number1,)// index > number1
index:(,number2]// index <= number2
index:[number1,)// index >= number1
注意:索引冒號後面不能加引號。
例如:
在商品中搜尋價格在100-200 RMB“連衣裙”:
query=index_text:'連衣裙' AND index_price:[100,200]
在新聞中搜尋 2019年6月1日-2019年6月3日之間的關於“北京”的新聞:
query=index_text:'北京' AND index_timestamp:[1559318400000,1559577599000]
(2)GEO_POINT的範圍查詢
目前查詢只支援點、圓、矩形的查詢,文法如下:
查詢點:
query=spatial_index:'point(LON LAT)'
LON為經度,LAT為緯度。如:query=spatial_index:’point(116.3906 39.92324)’,查詢與這個座標一樣的文檔。
查詢圓內的點, 可以用於附近若干公裡的點查詢
query=spatial_index:'circle(LON LAT,Radius)'
LON表示經度,LAT表示緯度,Radius為半徑,單位米;半徑10公裡內效能最佳,超過10公裡效能會大幅變差。例如:query=spatial_index:'circle(116.5806 39.99624, 1000)'
,查詢在座標’116.5806 39.99624’附近1000米(1公裡)以內的文檔。
查詢矩形內的點:
query=spatial_index:'rectangle(minX minY,maxX maxY)'
緯度上,maxY>=minY,如果寫反了,會自動調整; 經度上,minX到maxX是由西向東理解的,如果寫反了,代表的範圍就不對了。例如:rectangle(116.3906 39.92324, 116.3907 39.92325),查詢在這兩個座標組成的矩形內的文檔。
使用限制
TIMESTAMP欄位類型的查詢精度範圍為從1970-01-01 00:00到2100-01-01 00:00之間的毫秒時間戳記(儲存支援毫秒,查詢精度只到秒級,後3位元值預設為000),即[0, 4102416000000]。超過4102416000000的值都當作4102416000000處理。如果需要區分大於4102416000000的時間,需要加filter做過濾。
數值分析索引在做範圍查詢時,區間值後面的數字需要大於或等於前面的值,否則會報語法錯誤(6112,Query clause error)
GEO_POINT欄位類型精度範圍為,經度:-180~180,緯度-90~90