Kueri rentang memfilter hasil berdasarkan nilai numerik, stempel waktu, atau koordinat geografis, seperti pada pemfilteran produk berdasarkan harga, pencarian catatan dalam jendela waktu tertentu, dan penentuan lokasi merchant terdekat dalam skenario online-to-offline (O2O).
Untuk menjalankan kueri rentang, ikuti langkah-langkah berikut secara berurutan:
Tentukan tipe bidang dalam skema aplikasi.
Buat indeks bidang tunggal dalam skema indeks menggunakan alat analisis yang sesuai.
Tulis kueri rentang dengan sintaksis yang sesuai untuk tipe bidang Anda.
Tipe bidang yang didukung
Kueri rentang hanya mendukung tiga tipe bidang. Setiap bidang memerlukan indeks bidang tunggal khusus—indeks gabungan tidak didukung untuk tipe-tipe ini.
| Tipe bidang | Deskripsi | Batas |
|---|---|---|
INT | Integer 64-bit | Maks. 4 bidang |
TIMESTAMP | Stempel waktu integer dalam milidetik (≥ 0). Presisi penyimpanan adalah milidetik, tetapi presisi kueri adalah detik—tiga digit terakhir diperlakukan sebagai 000 selama kueri. | Maks. 4 bidang |
GEO_POINT | String dalam format lon lat, di mana kedua nilai berupa double yang dipisahkan spasi. Rentang bujur: [−180, 180]. Rentang lintang: [−90, 90]. | Maks. 2 bidang |
Buat indeks
Dalam skema indeks, buat satu indeks bidang untuk setiap bidang kueri rentang dan tetapkan alat analisis yang sesuai.
| Tipe bidang | Analyzer | Perilaku indeks |
|---|---|---|
INT | Analisis numerik | Tanpa tokenisasi; membangun indeks numerik untuk kueri rentang |
TIMESTAMP | Analisis numerik | Tanpa tokenisasi; membangun indeks numerik untuk kueri rentang |
GEO_POINT | Lokasi geografis | Tanpa tokenisasi; membangun indeks numerik untuk kueri rentang |
Sintaksis kueri
INT dan TIMESTAMP
Kedua tipe bidang menggunakan notasi kurung yang sama. Kurung siku [ ] berarti inklusif; tanda kurung biasa ( ) berarti eksklusif. Hilangkan batas untuk membuka sisi tersebut.
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:[number1,) // index >= number1
index:(number1,) // index > number1
index:(,number2] // index <= number2
index:(,number2) // index < number2Jangan letakkan tanda kutip langsung setelah titik dua indeks.
Contoh rentang harga — cari "dress" dengan harga antara 100 dan 200:
query=index_text:'dress' AND index_price:[100,200]Contoh rentang stempel waktu — cari berita mengenai "Beijing" dari 1 Juni hingga 3 Juni 2019:
query=index_text:'Beijing' AND index_timestamp:[1559318400000,1559577599000]Untuk indeks analisis numerik, batas atas harus lebih besar dari atau sama dengan batas bawah. Rentang yang terbalik akan menghasilkan error sintaksis 6112 (Query clause error).
Presisi TIMESTAMP: Presisi kueri dibatasi hingga detik. Tiga digit terakhir dari nilai stempel waktu apa pun diatur menjadi 000 selama kueri. Rentang valid adalah [0, 4102416000000], yang mencakup periode dari 1970-01-01 00:00 hingga 2100-01-01 00:00. Nilai yang melebihi batas atas akan dikunci pada 4102416000000. Untuk membedakan nilai di luar rentang ini, gunakan filter.
GEO_POINT
Tiga bentuk kueri spasial didukung: titik, lingkaran, dan persegi panjang.
Kueri titik — mencocokkan dokumen pada koordinat yang tepat:
query=spatial_index:'point(LON LAT)'Contoh — temukan dokumen pada koordinat (116.3906, 39.92324):
query=spatial_index:'point(116.3906 39.92324)'Kueri lingkaran — mencocokkan dokumen dalam radius tertentu dari titik pusat:
query=spatial_index:'circle(LON LAT,Radius)'Radius dinyatakan dalam satuan meter. Performa kueri optimal untuk radius hingga 10 km dan menurun secara signifikan di luar batas tersebut.
Contoh — temukan dokumen dalam jarak 1.000 meter dari (116.5806, 39.99624):
query=spatial_index:'circle(116.5806 39.99624, 1000)'Kueri persegi panjang — mencocokkan dokumen dalam area persegi panjang yang dibatasi oleh koordinat tertentu:
query=spatial_index:'rectangle(minX minY,maxX maxY)'Lintang:
maxYharus ≥minY. Jika urutannya terbalik, sistem akan memperbaikinya secara otomatis.Bujur: Rentang dari
minXkemaxXdiinterpretasikan dari barat ke timur. Jika urutannya terbalik, kueri akan mengembalikan hasil yang salah.
Contoh — temukan dokumen dalam persegi panjang yang dibatasi oleh (116.3906, 39.92324) dan (116.3907, 39.92325):
query=spatial_index:'rectangle(116.3906 39.92324, 116.3907 39.92325)'Nilai GEO_POINT yang valid berada dalam rentang [−180, 180] untuk bujur dan [−90, 90] untuk lintang.