Range范圍查詢
功能應(yīng)用場(chǎng)景
在很多業(yè)務(wù)場(chǎng)景中會(huì)涉及到區(qū)間范圍查詢的需求,比如常見(jiàn)的O2O業(yè)務(wù)中會(huì)基于搜索用戶所在地理位置的某個(gè)范圍內(nèi)的商家進(jìn)行查詢;商品搜索中也會(huì)有基于商品最低和最高價(jià)格區(qū)間的查詢;還有后臺(tái)類大數(shù)據(jù)檢索場(chǎng)景中也會(huì)有查找某個(gè)時(shí)間段內(nèi)的結(jié)果需求。
使用方法
實(shí)現(xiàn)range查詢總共分3步:
1.在定義應(yīng)用結(jié)構(gòu)中對(duì)需要range查詢的字段進(jìn)行相關(guān)的字段類型配置。
只有以下字段類型可支持range查詢,請(qǐng)按需求進(jìn)行配置。
字段類型 | 說(shuō)明 | 系統(tǒng)限制 |
INT | int64類型整數(shù), 支持INT類型數(shù)據(jù)的范圍查詢。 | 最多只能有4個(gè)字段為該類型。 |
TIMESTAMP | 大于等于0的整數(shù)時(shí)間戳,單位為毫秒(存儲(chǔ)支持毫秒,查詢精度只到秒級(jí),后3位數(shù)值默認(rèn)為000)。提供時(shí)間戳類型數(shù)據(jù)的范圍查詢。 | 最多只能有4個(gè)字段為該類型。 |
GEO_POINT | 字符串類型,格式為:lon lat。lon表示經(jīng)度,lat表示緯度,都為double類型,二者之間用空格分隔。lon的范圍:[-180, 180], lat范圍[-90, 90]。 | 最多只能有2個(gè)字段為該類型。 |
2.在定義索引結(jié)構(gòu)中對(duì)步驟1類型的字段創(chuàng)建索引并指定相關(guān)分析器。
TIMESTAMP字段、GEO_POINT字段和INT類型的字段可創(chuàng)建單字段索引,但是不可創(chuàng)建組合索引。
這三個(gè)字段創(chuàng)建的索引應(yīng)選擇的分析器及含義可參見(jiàn)下表。
單字段索引包含的字段類型 | 實(shí)現(xiàn)range查詢的分析器名稱 | 分析器釋義 |
INT | 數(shù)值分析 | 分詞方式:不分詞索引類型:需要范圍查詢的數(shù)值索引。 |
TIMESTAMP | 數(shù)值分析 | 分詞方式:不分詞索引類型:需要范圍查詢的數(shù)值索引。 |
GEO_POINT | 地理位置 | 分詞方式:不分詞索引類型:需要范圍查詢的數(shù)值索引。 |
3.在查詢中使用range查詢語(yǔ)法實(shí)現(xiàn)區(qū)間查詢。
(1)INT與TIMESTAMP的范圍查詢
INT的范圍查詢語(yǔ)法與TIMESTAMP類型的語(yǔ)法相同,支持的查詢語(yǔ)法如下:
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
注意:索引冒號(hào)后面不能加引號(hào)。
例如:
在商品中搜索 價(jià)格在100-200 RMB“連衣裙”:
query=index_text:'連衣裙' AND index_price:[100,200]
在新聞中搜索 2019年6月1日-2019年6月3日之間的關(guān)于“北京”的新聞:
query=index_text:'北京' AND index_timestamp:[1559318400000,1559577599000]
(2)GEO_POINT的范圍查詢
目前查詢只支持點(diǎn)、圓、矩形的查詢,語(yǔ)法如下:
查詢點(diǎn):
query=spatial_index:'point(LON LAT)'
LON為經(jīng)度,LAT為緯度。如:query=spatial_index:’point(116.3906 39.92324)’,查詢與這個(gè)坐標(biāo)一樣的文檔。
查詢圓內(nèi)的點(diǎn),可以用于附近若干公里的點(diǎn)查詢
query=spatial_index:'circle(LON LAT,Radius)'
LON表示經(jīng)度,LAT表示緯度,Radius為半徑,單位米;半徑10公里內(nèi)性能最佳,超過(guò)10公里性能會(huì)大幅變差。例如:query=spatial_index:'circle(116.5806 39.99624, 1000)'
,查詢?cè)谧鴺?biāo)’116.5806 39.99624’附近1000米(1公里)以內(nèi)的文檔。
查詢矩形內(nèi)的點(diǎn):
query=spatial_index:'rectangle(minX minY,maxX maxY)'
緯度上,maxY>=minY,如果寫反了,會(huì)自動(dòng)調(diào)整; 經(jīng)度上,minX到maxX是由西向東理解的,如果寫反了,代表的范圍就不對(duì)了。例如:rectangle(116.3906 39.92324, 116.3907 39.92325),查詢?cè)谶@兩個(gè)坐標(biāo)組成的矩形內(nèi)的文檔。
使用限制
TIMESTAMP字段類型的查詢精度范圍為從1970-01-01 00:00到2100-01-01 00:00之間的毫秒時(shí)間戳(存儲(chǔ)支持毫秒,查詢精度只到秒級(jí),后3位數(shù)值默認(rèn)為000),即[0, 4102416000000]。超過(guò)4102416000000的值都當(dāng)作4102416000000處理。如果需要區(qū)分大于4102416000000的時(shí)間,需要加filter做過(guò)濾。
數(shù)值分析索引在做范圍查詢時(shí),區(qū)間值后面的數(shù)字需要大于或等于前面的值,否則會(huì)報(bào)語(yǔ)法錯(cuò)誤(6112,Query clause error)
GEO_POINT字段類型精度范圍為,經(jīng)度:-180~180,緯度-90~90
在ha3 schema場(chǎng)景下,range索引支持個(gè)數(shù):獨(dú)享型支持8個(gè),共享型支持4個(gè)