TairSearch adalah modul pencarian teks penuh yang terintegrasi dalam Tair (Redis OSS-Compatible). Modul ini menggunakan sintaks kueri yang mirip dengan Elasticsearch dan memberikan performa penulisan serta pencarian dalam hitungan milidetik.
Ikhtisar
TairSearch menyediakan kemampuan berikut:
-
Latensi rendah dan performa tinggi: Penulisan dan pencarian teks penuh dalam hitungan milidetik didukung oleh mesin in-memory Tair. Untuk detailnya, lihat whitepaper performa TairSearch.
-
Pembaruan inkremental dan parsial: Tambahkan, perbarui, hapus, dan auto-increment bidang dokumen individual tanpa menulis ulang seluruh dokumen.
-
Sintaks kueri ala Elasticsearch: Query DSL berbasis JSON yang mendukung
bool,match,term, paging, dan sorting—sudah dikenal oleh pengembang yang berpengalaman dengan Elasticsearch. -
Agregasi: Agregasi
terms, metrik, danfilteruntuk analitik pada hasil pencarian. Lihat Agregasi. -
Auto-complete: Pencocokan kabur berbasis awalan untuk pengalaman pencarian saat mengetik.
-
Alat analisis bawaan dan kustom: Alat analisis bawaan untuk bahasa Inggris (
standard,stop), Tiongkok (jieba,IK), dan bahasa lainnya. Alat analisis kustom dengan kamus dan daftar stop word buatan pengguna juga didukung. Untuk detailnya, lihat Alat analisis pencarian. -
Kueri indeks shard: Cari di beberapa indeks shard sekaligus dengan
TFT.MSEARCHdan dapatkan hasil agregasi. -
Kompresi dokumen: Kompres dokumen yang disimpan untuk mengurangi penggunaan memori. Dinonaktifkan secara default.
-
Cache kueri: Cache hasil kueri terbaru untuk meningkatkan performa kueri data panas.
Prasyarat
Instans harus merupakan instans Tair optimasi memori berbasis DRAM yang menjalankan salah satu versi berikut:
|
Versi engine |
Versi minor minimum |
|
Redis 5.0-compatible |
1.7.27 atau lebih baru |
|
Redis 6.0-compatible |
6.2.4.1 atau lebih baru |
|
Redis 7.0-compatible |
Semua versi minor |
Perbarui instans ke versi minor terbaru untuk mendapatkan fitur terlengkap dan stabilitas tertinggi. Untuk instruksinya, lihat Upgrade versi minor dan proxy. Untuk instans kluster atau instans dengan pemisahan baca/tulis, perbarui juga node proxy ke versi minor terbaru agar semua perintah berfungsi sebagaimana mestinya.
Catatan rilis
Instans berbasis DRAM kompatibel Redis 5.0
|
Tanggal |
Versi |
Perubahan |
|
2022-03-11 |
V1.7.27 |
TairSearch dirilis |
|
2022-05-24 |
V1.8.5 |
Fitur agregasi |
|
2022-09-06 |
V5.0.15 |
Perintah |
|
2023-01-13 |
V5.0.25 |
Alat analisis |
|
2023-03-15 |
V5.0.28 |
Cache kueri, kompresi dokumen, perintah |
|
2023-06-12 |
V5.0.35 |
Tipe data ARRAY, algoritma similarity Okapi BM25 |
Instans berbasis DRAM kompatibel Redis 6.0
|
Tanggal |
Versi |
Perubahan |
|
2023-02-07 |
V6.2.4.1 |
TairSearch (semua fitur V5.0.25) |
|
2023-03-14 |
V6.2.5.0 |
Cache kueri, kompresi dokumen, |
|
2023-06-12 |
V6.2.7.3 |
Tipe data ARRAY, Okapi BM25 (semua fitur V5.0.35) |
|
2023-12-21 |
V23.12.1.2 |
Perintah |
Instans berbasis DRAM kompatibel Redis 7.0
|
Tanggal |
Versi |
Perubahan |
|
2024-07-22 |
V24.7.0.0 |
Dukungan TairSearch |
Praktik terbaik
Catatan penggunaan
-
Data TairSearch disimpan pada instans Tair dan mengonsumsi memori instans.
-
Untuk mengurangi penggunaan memori:
-
Atur
indexmenjaditruehanya untuk bidang yang perlu dapat dicari. Aturindexmenjadifalseuntuk bidang lainnya. -
Gunakan
_sourcedengan polaincludes/excludesuntuk menyimpan hanya bidang dokumen yang Anda butuhkan. -
Pilih alat analisis yang sesuai untuk menghindari tokenisasi yang tidak perlu dan peningkatan penggunaan memori.
-
Aktifkan kompresi dokumen untuk dokumen besar.
-
-
Batasi jumlah dokumen per indeks hingga maksimal 5 juta. Hal ini mencegah kesenjangan data pada instans kluster, menyeimbangkan permintaan baca dan tulis, serta mengurangi large key dan hotkey. Pisahkan dataset besar ke beberapa indeks dan gunakan
TFT.MSEARCHuntuk mengkuerinya secara bersamaan.
Konvensi sintaks
|
Konvensi |
Makna |
|
|
|
Kata kunci perintah |
|
|
*italic* |
Variabel |
|
|
|
Parameter opsional. Parameter tanpa tanda kurung siku wajib diisi. |
|
|
`A\ |
B` |
Parameter saling eksklusif. Tentukan hanya salah satu. |
|
|
Parameter sebelumnya dapat diulang. |
Perintah pencarian teks penuh
TFT.CREATEINDEX
Membuat indeks dengan definisi pemetaan. Sintaks pemetaan mirip dengan pemetaan eksplisit Elasticsearch. Indeks harus dibuat sebelum dokumen dapat ditambahkan.
Sintaks
TFT.CREATEINDEX index mappings [settings]
Untuk mencegah large key, pisahkan indeks besar menjadi beberapa indeks kecil denganmappingsdansettingsyang identik, lalu kueri secara bersamaan denganTFT.MSEARCH.
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks yang akan dibuat. |
|
*mappings* |
Ya |
Definisi pemetaan JSON. Lihat Opsi pemetaan. |
|
*settings* |
Tidak |
Pengaturan JSON untuk indeks. Lihat Pengaturan indeks. |
Opsi pemetaan
Objek mappings mendukung bidang tingkat atas berikut:
dynamic
Mode pemetaan. Nilai yang valid:
-
"strict"— Data hanya dapat ditulis ke bidang yang didefinisikan dalamproperties. Menulis ke bidang yang tidak didefinisikan akan gagal. -
Tidak ditentukan (default) — Mode non-strict. Sistem tidak memeriksa apakah bidang yang ditulis telah didefinisikan dalam
properties.
enabled
Mengontrol pemeriksaan tipe untuk bidang yang tidak diindeks (index diatur ke false). Nilai yang valid: true (default) dan false. Saat true, penulisan gagal jika tipe bidang tidak sesuai dengan tipe yang didefinisikan dalam properties. Bidang yang diindeks selalu diperiksa tipenya terlepas dari pengaturan ini.
_source
Mengontrol apakah dokumen asli disimpan. Pengaturan ini tidak memengaruhi pembuatan indeks.
-
enabled—true(default) menyimpan dokumen asli.falsetidak menyimpannya. -
includes— Array pola nama bidang yang akan disertakan. Wildcard didukung. -
excludes— Array pola nama bidang yang akan dikecualikan. Wildcard didukung. Jika suatu bidang cocok denganincludesdanexcludes,excludesmemiliki prioritas lebih tinggi (bidang tersebut tidak disimpan).
Contoh:
"_source": {"enabled": true}
Ini adalah pengaturan default—menyimpan semua bidang. Setara dengan "_source": {"enabled": true, "excludes": [], "includes": []}.
"_source": {"enabled": true, "excludes": [], "includes": ["id", "name"]}
Hanya menyimpan bidang id dan name.
properties
Kumpulan definisi bidang. Setiap bidang mendukung atribut berikut:
|
Atribut |
Deskripsi |
Default |
|
|
Tipe data. Lihat Tipe bidang. |
Wajib |
|
|
Apakah bidang ini diindeks (dapat dicari). |
|
|
|
Bobot bidang untuk skor. Bilangan titik mengambang positif. |
|
|
|
Algoritma similarity: |
|
Tipe bidang
|
Type |
Deskripsi |
Opsi khusus tipe |
|
|
String yang tidak ditokenisasi. Cocok untuk kueri pencocokan eksak. |
|
|
|
String yang ditokenisasi oleh alat analisis sebelum diindeks. |
|
|
|
Bilangan bulat 64-bit. Cocok untuk timestamp (epoch Unix). |
-- |
|
|
Bilangan bulat 32-bit. |
-- |
|
|
Bilangan titik mengambang 64-bit. |
-- |
Dukungan ARRAY: Semua tipe bidang mendukung varian array. Tambahkan [] ke nama tipe. Misalnya, keyword[] mendeklarasikan array kata kunci.
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"tags":{"type":"keyword[]"}}}}'
Opsi alat analisis teks
|
Opsi |
Deskripsi |
Default |
|
|
Alat analisis yang digunakan untuk pengindeksan. Lihat Alat analisis bawaan. Alat analisis kustom juga dapat ditentukan, dikonfigurasi melalui bagian |
|
|
|
Alat analisis yang digunakan saat pencarian. Nilai yang valid sama dengan |
Sama dengan |
Alat analisis bawaan
standard (default), jieba (direkomendasikan untuk bahasa Tiongkok, bekerja lebih baik daripada chinese), stop, IK, pattern, whitespace, simple, keyword, chinese, french, dutch, russian.
Untuk detailnya, lihat Alat analisis bawaan.
Pengaturan indeks
Objek settings opsional mendukung bidang berikut:
analysis
Menentukan alat analisis kustom. Untuk detailnya, lihat Alat analisis kustom.
index
Mengonfigurasi algoritma similarity kustom. Gunakan ini untuk menyesuaikan parameter Okapi BM25:
|
Parameter |
Deskripsi |
Default |
Nilai valid |
|
|
Mengontrol seberapa besar frekuensi term memengaruhi skor. Nilai yang lebih tinggi meningkatkan efeknya. |
|
Lebih besar dari |
|
|
Mengontrol seberapa besar panjang dokumen memengaruhi skor. Nilai yang lebih tinggi meningkatkan efeknya. |
|
|
Contoh:
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"name":{"type":"keyword","similarity":"my_bm25"}}},"settings":{"index":{"similarity":{"my_bm25":{"type":"BM25","k1":1.0,"b":1.0}}}}}'
queries_cache
Mengonfigurasi cache hasil kueri. Secara default, cache menyimpan hingga 10.000 hasil tanpa batas memori. Saat penuh, hasil dihapus menggunakan algoritma Least Recently Used (LRU).
|
Parameter |
Tipe |
Deskripsi |
Default |
|
|
STRING |
Memori maksimum untuk semua cache kueri. Mendukung satuan |
Tanpa batas |
|
|
INTEGER |
Time to Live untuk hasil yang di-cache, dalam detik. |
|
Contoh:
"settings": {"queries_cache": {"size": "100mb", "ttl": 3}}
queries_cacheadalah parameter tingkat node. Mengonfigurasinya pada satu indeks memengaruhi semua indeks lain dalam proses yang sama. Gunakan konfigurasiqueries_cacheyang sama di semua indeks.
compress_doc
Mengonfigurasi kompresi dokumen transparan. Mengaktifkan kompresi meningkatkan konsumsi CPU dan latensi baca/tulis. Aktifkan ini hanya ketika indeks besar (kilobyte atau lebih) dan biaya penyimpanan menjadi pertimbangan utama.
|
Parameter |
Type |
Deskripsi |
Default |
|
|
STRING |
Ambang batas kompresi. Dokumen hanya dikompresi ketika mencapai ukuran ini. Mendukung satuan |
|
|
|
BOOLEAN |
Apakah kompresi diaktifkan. |
|
Contoh:
"settings": {"compress_doc": {"size": "1kb", "enable": true}}
Kompresi hanya berlaku untuk dokumen yang ditulis atau diperbarui setelah Anda mengaktifkan pengaturan ini dengan TFT.UPDATEINDEX. Dokumen yang sudah ada tidak dikompresi secara retroaktif.
Nilai kembali
-
Jika berhasil:
OK -
Jika gagal: Pesan error
Contoh
TFT.CREATEINDEX idx:product '{"mappings":{"_source":{"enabled":true},"properties":{"product_id":{"type":"keyword","ignore_above":128},"product_name":{"type":"text"},"product_title":{"type":"text","analyzer":"jieba"},"price":{"type":"double"}}}}'OK
Lihat juga: TFT.UPDATEINDEX, TFT.GETINDEX
TFT.UPDATEINDEX
Menambahkan bidang baru ke pemetaan indeks atau memodifikasi pengaturan indeks.
Sintaks
TFT.UPDATEINDEX index mappings [settings]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*mappings* |
Ya |
Bidang |
|
*settings* |
Tidak |
Pengaturan indeks yang dimodifikasi. Hanya |
Untuk sintaks lengkap mappings dan settings, lihat TFT.CREATEINDEX.
Nilai kembali
-
Jika berhasil:
OK -
Jika gagal: Pesan error
Contoh
TFT.UPDATEINDEX idx:product '{"mappings":{"properties":{"product_group":{"type":"text","analyzer":"chinese"}}}}'OK
Lihat juga: TFT.CREATEINDEX, TFT.GETINDEX
TFT.GETINDEX
Mengambil pemetaan dan pengaturan suatu indeks.
Sintaks
TFT.GETINDEX index
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
Nilai kembali
-
Jika berhasil: Konten pemetaan indeks dalam format JSON
-
Jika gagal: Pesan error
Contoh
TFT.GETINDEX idx:product{"idx:product0310":{"mappings":{"_source":{"enabled":true,"excludes":[],"includes":["product_id"]},"dynamic":"false","properties":{"price":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"double"},"product_id":{"boost":1.0,"enabled":true,"ignore_above":128,"index":true,"similarity":"classic","type":"keyword"},"product_name":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"},"product_title":{"analyzer":"chinese","boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"}}}}}
Lihat juga: TFT.CREATEINDEX, TFT.UPDATEINDEX
TFT.ADDDOC
Menambahkan satu dokumen ke indeks.
Sintaks
TFT.ADDDOC index document [WITH_ID doc_id]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*document* |
Ya |
Dokumen JSON. Nilai bidang harus sesuai dengan tipe data yang didefinisikan dalam pemetaan. |
|
|
Tidak |
ID dokumen kustom (string). Jika dihilangkan, ID akan dibuat otomatis. Jika ID yang ditentukan sudah ada, dokumen yang ada akan ditimpa. |
Jika_sourcedikonfigurasi denganincludes, hanya bidang yang tercantum dalamincludesyang disimpan saat menambahkan atau memperbarui dokumen.
Nilai kembali
-
Jika berhasil: Objek JSON yang berisi ID dokumen, misalnya
{"_id":"00001"} -
Jika gagal: Pesan error
Contoh
Tambahkan dokumen dengan ID kustom:
TFT.ADDDOC idx:product '{"product_id":"product test"}' WITH_ID 00001{"_id":"00001"}
Tambahkan dokumen dengan bidang array:
TFT.ADDDOC idx:product '{"product_id":["an","2","3df"]}' WITH_ID 00001
Lihat juga: TFT.MADDDOC, TFT.UPDATEDOCFIELD, TFT.DELDOC
TFT.MADDDOC
Menambahkan beberapa dokumen ke indeks dalam satu operasi atomik. Jika ada dokumen yang memiliki format tidak valid, tidak ada dokumen yang ditambahkan.
Sintaks
TFT.MADDDOC index document doc_id [document1 doc_id1] ...
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*document* |
Ya |
Dokumen JSON. Nilai bidang harus sesuai dengan tipe data yang didefinisikan dalam pemetaan. |
|
*doc_id* |
Ya |
ID dokumen (string). |
Jika_sourcedikonfigurasi denganincludes, hanya bidang yang tercantum dalamincludesyang disimpan saat menambahkan atau memperbarui dokumen.
Nilai kembali
-
Jika berhasil:
OK -
Jika gagal: Pesan error
Contoh
TFT.MADDDOC idx:product '{"product_id":"test1"}' 00011 '{"product_id":"test2"}' 00012OK
Lihat juga: TFT.ADDDOC, TFT.DELDOC
TFT.UPDATEDOCFIELD
Memperbarui bidang tertentu dalam dokumen. Jika dokumen tidak ada, dokumen tersebut dibuat (setara dengan TFT.ADDDOC). Jika bidang tidak ada, bidang tersebut ditambahkan.
Sintaks
TFT.UPDATEDOCFIELD index doc_id document
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen yang akan diperbarui. |
|
*document* |
Ya |
Objek JSON yang berisi bidang yang akan diperbarui. Bidang yang diindeks harus sesuai dengan tipe data yang didefinisikan dalam pemetaan. Bidang yang tidak diindeks bisa bertipe apa saja. |
Jika_sourcedikonfigurasi denganincludes, hanya bidang yang tercantum dalamincludesyang disimpan saat menambahkan atau memperbarui dokumen.
Nilai kembali
-
Jika berhasil:
OK -
Jika gagal: Pesan error
Contoh
TFT.UPDATEDOCFIELD idx:product 00011 '{"product_id":"test8","product_group":"BOOK"}'OK
Lihat juga: TFT.ADDDOC, TFT.DELDOCFIELD
TFT.DELDOCFIELD
Menghapus satu atau beberapa bidang dari dokumen. Jika bidang diindeks, entri indeksnya juga dihapus.
Sintaks
TFT.DELDOCFIELD index doc_id field [field1 field2 ...]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen. |
|
*field* |
Ya |
Satu atau beberapa nama bidang yang akan dihapus. |
Operasi gagal jika bidang yang ditentukan tidak ada dalam dokumen (misalnya, bidang yang difilter oleh _source).
Nilai kembali
-
Jika berhasil: Jumlah bidang yang dihapus (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.DELDOCFIELD idx:product 00011 product_group(integer) 1
Lihat juga: TFT.UPDATEDOCFIELD
TFT.INCRLONGDOCFIELD
Menambahkan nilai bidang integer dalam dokumen. Bidang harus bertipe LONG atau INTEGER. Tipe data ARRAY tidak didukung.
Sintaks
TFT.INCRLONGDOCFIELD index doc_id field increment
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen. |
|
*field* |
Ya |
Bidang yang akan ditambahkan. Harus bertipe |
|
*increment* |
Ya |
Nilai penambahan. Bisa berupa bilangan bulat positif atau negatif. |
Jika dokumen tidak ada, dokumen tersebut dibuat otomatis dengan bidang diinisialisasi ke0sebelum menerapkan penambahan. Operasi gagal jika bidang tidak ada dalam dokumen (misalnya, bidang yang difilter oleh_source).
Nilai kembali
-
Jika berhasil: Nilai bidang yang diperbarui (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.INCRLONGDOCFIELD idx:product 00011 stock 100(integer)100
Lihat juga: TFT.INCRFLOATDOCFIELD, TFT.UPDATEDOCFIELD
TFT.INCRFLOATDOCFIELD
Menambahkan nilai bidang titik mengambang dalam dokumen. Bidang harus bertipe DOUBLE. Tipe data ARRAY tidak didukung.
Sintaks
TFT.INCRFLOATDOCFIELD index doc_id field increment
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen. |
|
*field* |
Ya |
Bidang yang akan ditambahkan. Harus bertipe |
|
*increment* |
Ya |
Nilai penambahan. Bisa berupa bilangan titik mengambang positif atau negatif. |
Jika dokumen tidak ada, dokumen tersebut dibuat otomatis dengan bidang diinisialisasi ke0sebelum menerapkan penambahan. Operasi gagal jika bidang tidak ada dalam dokumen (misalnya, bidang yang difilter oleh_source).
Nilai kembali
-
Jika berhasil: Nilai bidang yang diperbarui (string)
-
Jika gagal: Pesan error
Contoh
TFT.INCRFLOATDOCFIELD idx:product 00011 stock 299.6"299.6"
Lihat juga: TFT.INCRLONGDOCFIELD, TFT.UPDATEDOCFIELD
TFT.GETDOC
Mengambil dokumen berdasarkan ID-nya.
Sintaks
TFT.GETDOC index doc_id
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen. |
Nilai kembali
-
Jika berhasil: Objek JSON dengan ID dan konten dokumen
-
Jika gagal: Pesan error
Contoh
TFT.GETDOC idx:product 00011{"_id":"00011","_source":{"product_id":"test8"}}
Lihat juga: TFT.EXISTS, TFT.SEARCH
TFT.EXISTS
Memeriksa apakah dokumen ada dalam indeks.
Sintaks
TFT.EXISTS index doc_id
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
ID dokumen. |
Nilai kembali
-
1jika dokumen ada -
0jika indeks atau dokumen tidak ada -
Jika gagal: Pesan error
Contoh
TFT.EXISTS idx:product 00011(integer) 1
Lihat juga: TFT.GETDOC, TFT.DOCNUM
TFT.DOCNUM
Mendapatkan jumlah dokumen dalam indeks.
Sintaks
TFT.DOCNUM index
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
Nilai kembali
-
Jika berhasil: Jumlah dokumen (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.DOCNUM idx:product(integer) 3
Lihat juga: TFT.EXISTS, TFT.SCANDOCID
TFT.SCANDOCID
Memindai ID dokumen dalam indeks menggunakan kursor, mirip dengan perintah Redis SCAN.
Sintaks
TFT.SCANDOCID index cursor [MATCH *value*] [COUNT count]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*cursor* |
Ya |
Posisi kursor. Gunakan |
|
|
Tidak |
Pola gaya glob untuk memfilter ID dokumen. Contoh: |
|
|
Tidak |
Jumlah maksimum item yang dikembalikan per pemindaian. Default: |
Nilai kembali
Array dua elemen:
-
Kursor untuk iterasi berikutnya.
0menunjukkan pemindaian selesai. -
Array ID dokumen.
Contoh
TFT.SCANDOCID idx:product 0 COUNT 31) "0"
2) 1) "00001"
2) "00011"
3) "00012"
Lihat juga: TFT.DOCNUM, TFT.GETDOC
TFT.DELDOC
Menghapus satu atau beberapa dokumen dari indeks berdasarkan ID dokumen.
Sintaks
TFT.DELDOC index doc_id [doc_id] ...
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*doc_id* |
Ya |
Satu atau beberapa ID dokumen yang akan dihapus. |
Nilai kembali
-
Jika berhasil: Jumlah dokumen yang benar-benar dihapus (string). ID yang tidak ada diabaikan.
-
Jika gagal: Pesan error
Contoh
TFT.DELDOC idx:product 00011 00014"1" # Dokumen 00014 tidak ada, sehingga hanya dokumen 00011 yang dihapus.
Lihat juga: TFT.DELALL, TFT.ADDDOC
TFT.DELALL
Menghapus semua dokumen dari indeks tetapi mempertahankan indeks dan pemetaannya.
Sintaks
TFT.DELALL index
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
Nilai kembali
-
Jika berhasil:
OK -
Jika gagal: Pesan error
Contoh
TFT.DELALL idx:productOK
Lihat juga: TFT.DELDOC, DEL
TFT.ANALYZER
Menguji cara alat analisis menokenisasi teks tertentu.
Sintaks
TFT.ANALYZER analyzer_name text [INDEX index_name] [SHOW_TIME]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*analyzer_name* |
Ya |
Nama alat analisis bawaan atau kustom. |
|
*text* |
Ya |
Teks yang akan ditokenisasi. Harus dikodekan UTF-8. |
|
|
Bersyarat |
Indeks yang berisi definisi alat analisis. Diperlukan saat menggunakan alat analisis kustom atau alat analisis bawaan dengan daftar stop word atau kamus yang dimodifikasi. |
|
|
Tidak |
Sertakan durasi tokenisasi dalam output, dalam mikrodetik. Eksekusi pertama dengan kamus besar (misalnya, Jieba, IK) mungkin memakan waktu beberapa detik karena pemuatan kamus. |
Nilai kembali
-
Jika berhasil: Objek JSON yang berisi detail token
-
Jika gagal: Pesan error
Contoh
TFT.ANALYZER standard "Tair is a nosql database"{
"tokens": [
{"token": "Tair", "start_offset": 0, "end_offset": 4, "position": 0},
{"token": "nosql", "start_offset": 10, "end_offset": 15, "position": 3},
{"token": "database", "start_offset": 16, "end_offset": 24, "position": 4}
]
}
DEL (Redis native)
Gunakan perintah Redis native DEL untuk menghapus satu atau beberapa kunci TairSearch (indeks).
DEL key [key ...]
Untuk detailnya, lihat referensi perintah DEL.
TFT.SEARCH
Mencari dokumen dalam indeks menggunakan Query DSL.
Sintaks
TFT.SEARCH index query
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*query* |
Ya |
Pernyataan Query DSL JSON. Lihat bagian di bawah untuk sintaks lengkapnya. |
Sintaks kueri mirip dengan Elasticsearch Query DSL.
Nilai kembali
Jika berhasil, objek JSON yang berisi hasil pencarian:
{
"hits": {
"hits": [
{"_id": "...", "_index": "...", "_score": 1.0, "_source": {...}}
],
"max_score": 1.0,
"total": {
"relation": "eq",
"value": 3
}
}
}
Bidang total.relation menunjukkan hubungan antara jumlah dengan total.value:
-
"eq"— Jumlahnya eksak. -
"gte"— Jumlahnya minimal sebesar nilai ini (ketikatrack_total_hitsadalahfalse).
Contoh
TFT.SEARCH idx:product '{"sort":[{"price":{"order":"desc"}}]}'{"hits":{"hits":[{"_id":"fruits_3","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_3","product_name":"orange","price":30.2,"stock":3000}},{"_id":"fruits_2","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_2","product_name":"banana","price":24.0,"stock":2000}},{"_id":"fruits_1","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_1","product_name":"apple","price":19.5,"stock":1000}}],"max_score":1.0,"total":{"relation":"eq","value":3}}}
Lihat juga: TFT.MSEARCH, TFT.EXPLAINCOST, TFT.EXPLAINSCORE
Jenis kueri
Bidang query dalam Query DSL mendukung jenis kueri berikut.
Pengurutan
Gunakan bidang sort untuk mengontrol urutan hasil. Tipe data ARRAY tidak didukung untuk pengurutan.
|
Nilai |
Deskripsi |
|
|
Urutkan berdasarkan skor relevansi secara menurun. |
|
|
Urutkan berdasarkan ID dokumen secara menaik. |
|
*field_name* |
Urutkan berdasarkan bidang tertentu secara menaik. Bidang harus diindeks ( |
Untuk pengurutan multi-bidang, gunakan array. Kontrol arah pengurutan dengan order ("desc" atau "asc"):
{"sort": [{"price": {"order": "desc"}}, {"_doc": {"order": "desc"}}]}
Filtering sumber
Gunakan bidang _source untuk mengontrol bidang dokumen mana yang muncul dalam hasil:
{"_source": {"includes": ["f0"]}}
Mendukung includes dan excludes dengan pola wildcard.
Paging
|
Parameter |
Tipe |
Deskripsi |
Default |
|
|
INTEGER |
Offset berbasis nol dari hasil pertama yang dikembalikan. |
|
|
|
INTEGER |
Jumlah maksimum hasil yang dikembalikan. Nilai valid: |
|
Menggunakanfromdansizebersama-sama menyediakan paging. Performa kueri menurun seiring peningkatanfrom.
track_total_hits
Mengontrol apakah akan menghitung semua dokumen yang cocok untuk kueri term, terms, atau match (kueri majemuk juga didukung, tetapi pencocokan kabur dalam match dinonaktifkan).
|
Nilai |
Perilaku |
|
|
Hanya mengembalikan 100 dokumen teratas yang diurutkan berdasarkan skor. |
|
|
Menghitung semua dokumen yang cocok. |
Mengatur track_total_hits ke true dengan jumlah besar dokumen yang cocok dapat menyebabkan kueri lambat. Gunakan dengan hati-hati.
TFT.MSEARCH
Mencari di beberapa indeks yang memiliki pemetaan dan pengaturan identik, lalu mengagregasi dan mengembalikan hasil gabungan.
Sintaks
TFT.MSEARCH index_count index [index1] ... query
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index_count* |
Ya |
Jumlah indeks yang akan dicari. Nilai valid: |
|
*index* |
Ya |
Satu atau beberapa nama indeks. Semua indeks harus memiliki |
|
*query* |
Ya |
Pernyataan Query DSL JSON. Mendukung |
TFT.MSEARCHtidak mendukung parameterfrom. Gunakan paging berbasis kursor sebagai gantinya (lihat di bawah).
Paging berbasis kursor
Gunakan size, reply_with_keys_cursor, dan keys_cursor bersama-sama untuk paging:
|
Parameter |
Tipe |
Deskripsi |
Default |
|
|
INTEGER |
Jumlah hasil yang dikembalikan per halaman. |
|
|
|
BOOLEAN |
Sertakan posisi kursor dalam respons. |
|
|
|
OBJECT |
Posisi kursor dari kueri sebelumnya. Gunakan |
|
Cara kerja:
-
Kueri pertama: Atur
reply_with_keys_cursorketruedan hilangkankeys_cursor(atau atur ke0). Tair mengambilsizedokumen dari setiap indeks, lalu mengumpulkan, memberi skor, mengurutkan, dan mengagregasi hasil gabungan, mengembalikansizedokumen teratas. Respons menyertakan posisikeys_cursoruntuk setiap indeks. -
Kueri berikutnya: Teruskan
keys_cursoryang dikembalikan dari respons sebelumnya. Tair melanjutkan pengambilan dari posisi kursor di setiap indeks.
Perilaku agregasi
TFT.MSEARCH mengagregasi set hasil anak dari setiap indeks, bukan mengagregasi dataset gabungan:
-
Rate dan sort: Memberi skor dan mengurutkan set hasil anak.
-
sum, max, min, avg, value_count: Mengagregasi di seluruh set hasil anak.
-
sum_of_squares, variance, std_deviation: Merata-rata di seluruh set hasil anak.
-
Agregasi terms dan agregasi filter: Mengagregasi di seluruh set hasil anak secara terpisah.
Nilai kembali
Jika berhasil, objek JSON yang mirip dengan output TFT.SEARCH, ditambah bidang aux_info:
{
"aux_info": {
"index_crc64": 15096806844241479487,
"keys_cursor": {"key0": 2, "key1": 5, "key2": 3},
"field_type": {"f0": "long"}
}
}
|
Bidang |
Deskripsi |
|
|
Hash CRC-64 dari pemetaan dan pengaturan. Dapat diabaikan untuk permintaan bisnis. |
|
|
Posisi kursor untuk kueri berhalaman berikutnya. Disertakan hanya saat |
|
|
Tipe data bidang yang diurutkan. Disertakan hanya saat pengurutan berdasarkan bidang indeks. |
Contoh
Siapkan tiga indeks dengan pemetaan yang sama:
TFT.CREATEINDEX key0 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key1 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key2 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.ADDDOC key0 '{"f0":120}'
TFT.ADDDOC key0 '{"f0":130}'
TFT.ADDDOC key1 '{"f0":140}'
TFT.ADDDOC key1 '{"f0":150}'
TFT.ADDDOC key2 '{"f0":160}'
TFT.ADDDOC key2 '{"f0":170}'
Halaman pertama:
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true}'{"hits":{"hits":[{"_id":"16625439765504840","_index":"key2","_score":1.0,"_source":{"f0":170}},{"_id":"16625439741096630","_index":"key2","_score":1.0,"_source":{"f0":160}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":0,"key2":2}}}
Halaman kedua (teruskan keys_cursor dari respons sebelumnya):
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true,"keys_cursor":{"key0":0,"key1":0,"key2":2}}'{"hits":{"hits":[{"_id":"16625439652681160","_index":"key1","_score":1.0,"_source":{"f0":150}},{"_id":"16625439624704580","_index":"key1","_score":1.0,"_source":{"f0":140}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":2,"key2":2}}}
Lihat juga: TFT.SEARCH
TFT.EXPLAINCOST
Mengambil rincian waktu eksekusi kueri.
Sintaks
TFT.EXPLAINCOST index query
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*query* |
Ya |
Pernyataan Query DSL (sintaks sama dengan |
Nilai kembali
Objek JSON dengan bagian berikut:
|
Bagian |
Deskripsi |
|
|
Waktu eksekusi kueri dalam mikrodetik ( |
|
|
Waktu agregasi dalam mikrodetik. Diabaikan jika tidak ada agregasi yang ditentukan. |
|
|
Waktu untuk mengumpulkan dan mengurutkan hasil dalam mikrodetik, ditambah tipe collector: |
Contoh
TFT.EXPLAINCOST idx:product '{"sort":[{"price":{"order":"desc"}}]}'{
"QUERY_COST": {
"query": "MATCHALL_QUERY",
"doc_num": 1,
"time_cost_us": 2
},
"COLLECTOR_COST": {
"collector_type": "CustomSortCollector",
"time_cost_us": 20
}
}
Lihat juga: TFT.SEARCH, TFT.EXPLAINSCORE
TFT.EXPLAINSCORE
Mengambil rincian skor hasil pencarian, menunjukkan cara skor dokumen dihitung.
Hanya tersedia untuk instans berbasis DRAM yang kompatibel dengan Redis 6.0 atau lebih baru.
Sintaks
TFT.EXPLAINSCORE index query [doc_id] ...
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*query* |
Ya |
Pernyataan Query DSL (sintaks sama dengan |
|
*doc_id* |
Tidak |
Satu atau beberapa ID dokumen. Saat ditentukan, hanya dokumen ini yang disertakan dalam output. |
Nilai kembali
Set hasil yang sama dengan TFT.SEARCH, ditambah objek _explanation untuk setiap dokumen yang berisi:
|
Bidang |
Deskripsi |
|
|
Skor dokumen. |
|
|
Rumus yang digunakan untuk perhitungan skor. |
|
|
Bidang dokumen yang mencocokkan istilah kueri. |
|
|
Istilah kueri yang ditemukan dalam dokumen. |
|
|
Bobot skor yang diterapkan pada klausa kueri ini. |
|
|
Metadata dan proses pemberian skor langkah demi langkah. |
Contoh
TFT.EXPLAINSCORE today_shares '{"query":{"wildcard":{"shares_name":{"value":"*BY"}}}}'{
"hits": {
"hits": [
{
"_id": "17036492095306830",
"_index": "today_shares",
"_score": 1.0,
"_source": {
"shares_name": "YBY",
"logictime": 14300410,
"purchase_type": 1,
"purchase_price": 11.1,
"purchase_count": 100,
"investor": "Mila"
},
"_explanation": {
"score": 1.0,
"description": "score, computed as query_boost",
"field": "shares_name",
"term": "*BY",
"query_boost": 1.0
}
}
],
"max_score": 1.0,
"total": {"relation": "eq", "value": 1}
}
}
Lihat juga: TFT.SEARCH, TFT.EXPLAINCOST
Perintah auto-complete
TFT.ADDSUG
Menambahkan satu atau beberapa entri teks auto-complete dengan bobot terkait.
Sintaks
TFT.ADDSUG index text weight [text weight] ...
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*text* |
Ya |
Entri teks auto-complete. |
|
*weight* |
Ya |
Bobot skor (bilangan bulat positif). Bobot yang lebih tinggi mendapat peringkat lebih tinggi dalam hasil. |
Nilai kembali
-
Jika berhasil: Jumlah entri teks yang ditambahkan (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.ADDSUG idx:redis 'redis is a memory database' 3 'redis cluster' 10(integer) 2
Lihat juga: TFT.GETSUG, TFT.DELSUG, TFT.SUGNUM
TFT.DELSUG
Menghapus satu atau beberapa entri teks auto-complete dari indeks.
Sintaks
TFT.DELSUG index text [text] ...
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*text* |
Ya |
Teks entri yang akan dihapus. Harus merupakan kecocokan lengkap dan eksak. |
Nilai kembali
-
Jika berhasil: Jumlah entri teks yang dihapus (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.DELSUG idx:redis 'redis is a memory database' 'redis cluster'(integer) 2
Lihat juga: TFT.ADDSUG, TFT.SUGNUM
TFT.SUGNUM
Mendapatkan jumlah entri teks auto-complete dalam indeks.
Sintaks
TFT.SUGNUM index
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
Nilai kembali
-
Jika berhasil: Jumlah entri (bilangan bulat)
-
Jika gagal: Pesan error
Contoh
TFT.SUGNUM idx:redis(integer) 3
Lihat juga: TFT.ADDSUG, TFT.GETSUG
TFT.GETSUG
Mengambil saran auto-complete yang cocok dengan awalan. Hasil dikembalikan dalam urutan menurun berdasarkan bobot.
Sintaks
TFT.GETSUG index prefix [MAX_COUNT count] [FUZZY]
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
|
*prefix* |
Ya |
Awalan yang akan dicocokkan. |
|
|
Tidak |
Jumlah maksimum entri yang dikembalikan. Nilai valid: |
|
|
Tidak |
Aktifkan pencocokan kabur. |
Nilai kembali
-
Jika berhasil: Daftar entri teks auto-complete yang cocok
-
Jika gagal: Pesan error
Contoh
TFT.GETSUG idx:redis res MAX_COUNT 2 FUZZY1) "redis cluster"
2) "redis lock"
Lihat juga: TFT.ADDSUG, TFT.GETALLSUGS
TFT.GETALLSUGS
Mengambil semua entri teks auto-complete dalam indeks.
Sintaks
TFT.GETALLSUGS index
Parameter
|
Parameter |
Wajib |
Deskripsi |
|
*index* |
Ya |
Nama indeks. |
Nilai kembali
-
Jika berhasil: Daftar semua entri teks auto-complete
-
Jika gagal: Pesan error
Contoh
TFT.GETALLSUGS idx:redis1) "redis cluster"
2) "redis lock"
3) "redis is a memory database"
Lihat juga: TFT.GETSUG, TFT.ADDSUG
Agregasi
Tambahkan klausa aggs (atau aggregations) ke kueri TFT.SEARCH untuk melakukan agregasi pada set hasil.
Penggunaan dasar
Tentukan nama agregasi kustom, jenis agregasi, dan field yang akan diagregasi:
TFT.SEARCH shares '{"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'
Respons mencakup hasil pencarian dari query dan hasil agregasi dari aggs:
{"hits":{"hits":[{"_id":"16581351808123930","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}},{"_id":"16581351809626430","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}}],"max_score":1.0,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
Tambahkan "size": 0 ke kueri untuk hanya mengembalikan hasil agregasi tanpa dokumen.
Agregasi metrik
Agregasi metrik melakukan perhitungan numerik pada bidang numerik (integer, double, dll.) dan tidak mendukung sub-agregasi bersarang.
|
Metrik |
Deskripsi |
Tipe bidang yang didukung |
|
|
Jumlah nilai bidang |
Numerik |
|
|
Nilai maksimum |
Numerik |
|
|
Nilai minimum |
Numerik |
|
|
Nilai rata-rata |
Numerik |
|
|
Jumlah kuadrat nilai |
Numerik |
|
|
Varians statistik |
Numerik |
|
|
Standar deviasi |
Numerik |
|
|
Jumlah nilai (tanpa deduplikasi) |
Numerik, |
|
|
Semua metrik di atas dalam satu respons |
Numerik |
Hanyavalue_countyang mendukung bidangkeyword. Semua metrik lain memerlukan bidang numerik.
Output: Nilai DOUBLE yang dihitung dari bidang yang ditentukan.
Agregasi terms
Menghitung nilai yang dideduplikasi dalam bidang keyword. Mendukung sub-agregasi bersarang.
|
Parameter |
Deskripsi |
Default |
|
|
Bidang agregasi. Hanya bidang |
Wajib |
|
|
Jumlah bucket yang dikembalikan. Nilai valid: |
|
|
|
Urutan pengurutan. |
|
|
|
Jumlah dokumen minimum agar bucket disertakan dalam hasil. |
|
|
|
Pola regex atau nilai eksak yang harus dicocokkan oleh kunci bucket. Untuk bidang string, pencocokan regex didukung. Untuk bidang array, pencocokan eksak diperlukan. |
-- |
|
|
Pola regex atau nilai eksak yang tidak boleh dicocokkan oleh kunci bucket. Jika |
-- |
Output: Objek JSON dengan buckets. Setiap bucket berisi key (nilai bidang) dan doc_count (jumlah dokumen):
{
"aggregations": {
"Per_Investor_Freq": {
"buckets": [
{"doc_count": 2, "key": "Jay"},
{"doc_count": 1, "key": "Mila"}
]
}
}
}
Contoh:
{"aggs": {"Per_Investor_Freq": {"terms": {"field": "investor"}}}}
Agregasi filter
Menyaring hasil kueri dengan pernyataan kueri dan menghitung jumlah dokumen yang cocok. Mendukung sub-agregasi bersarang.
Output: Jumlah dokumen (doc_count) yang cocok dengan kondisi filter.
Contoh agregasi
Contoh berikut menggunakan dataset perdagangan saham.
Langkah 1: Buat indeks
TFT.CREATEINDEX today_shares '{"mappings":{"properties":{"shares_name":{"type":"keyword"},"logictime":{"type":"long"},"purchase_type":{"type":"integer"},"purchase_price":{"type":"double"},"purchase_count":{"type":"long"},"investor":{"type":"keyword"}}}}'
Langkah 2: Tambahkan dokumen
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"YBY","logictime":14300410,"purchase_type":1,"purchase_price":11.1,"purchase_count":100,"investor":"Mila"}'
Langkah 3: Jalankan kueri
sum -- Total jumlah pembelian untuk seorang investor
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
max -- Harga pembelian tertinggi untuk seorang investor
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Max":{"max":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Max":{"value":111.1}}}
avg -- Harga pembelian rata-rata untuk seorang investor
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Avg":{"avg":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Avg":{"value":106.1}}}
std_deviation -- Standar deviasi harga pembelian
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Std_Deviation":{"std_deviation":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Std_Deviation":{"value":5.0}}}
extended_stats -- Semua statistik sekaligus
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Extended_Stats":{"extended_stats":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Extended_Stats":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}
terms -- Investor dengan minimal dua transaksi
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"investor","min_doc_count":2,"order":{"_key":"desc"}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"Jay","doc_count":2}]}}}
Agregasi terms bersarang -- Jumlah transaksi per saham dengan harga rata-rata
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"shares_name","include":"[A-Z]+","exclude":["XAX"]},"aggs":{"Price_Avg":{"avg":{"field":"purchase_price"}}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"YBY","doc_count":1,"Price_Avg":{"value":11.1}}]}}}
Agregasi filter bersarang -- Filter berdasarkan investor dengan statistik lengkap
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Jay_BuyIn_Filter":{"filter":{"term":{"investor":"Jay"}},"aggs":{"Jay_BuyIn_Quatation":{"extended_stats":{"field":"purchase_price"}}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Jay_BuyIn_Filter":{"doc_count":2,"Jay_BuyIn_Quatation":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}}