Saat menggunakan indeks pencarian untuk mengkueri data, Anda dapat memanfaatkan metode pengurutan yang telah ditentukan sebelumnya atau menentukan metode pengurutan sendiri. Dengan cara ini, baris-baris yang memenuhi kondisi kueri akan dikembalikan sesuai dengan urutan yang telah ditentukan. Jika respons mencakup sejumlah besar baris, Anda dapat menemukan data yang diperlukan dengan mengonfigurasi parameter limit dan offset atau menggunakan token.
Skenario
Kategori | Metode | Fitur | Skenario |
Pengurutan | Tentukan metode pengurutan saat membuat indeks pencarian | Secara default, data dalam indeks pencarian diurutkan berdasarkan pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort. Pengaturan ini menentukan urutan default dari baris-baris yang memenuhi kondisi kueri. | |
Tentukan metode pengurutan saat mengkueri data | Pengurutan berdasarkan skor relevansi kata kunci berbasis BM25 (ScoreSort) | Anda dapat menggunakan ScoreSort untuk mengurutkan hasil kueri berdasarkan skor relevansi kata kunci berbasis BM25. Metode ini cocok untuk skenario seperti pencarian teks lengkap. | |
Anda dapat menggunakan PrimaryKeySort untuk mengurutkan hasil kueri berdasarkan nilai kunci utama. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan pengenal unik dari data tersebut. | |||
Pengurutan berdasarkan nilai satu atau lebih kolom (FieldSort) | Anda dapat menggunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai satu atau lebih kolom. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan properti seperti volume penjualan atau tampilan halaman. FieldSort sering digunakan di industri seperti e-commerce dan jejaring sosial serta aset media. | ||
Anda dapat menggunakan GeoDistanceSort untuk mengurutkan hasil kueri berdasarkan lokasi geografis. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan jarak dari lokasi tertentu. GeoDistanceSort sering digunakan di industri seperti pemetaan dan logistik, misalnya untuk mengurutkan restoran di sekitar lokasi berdasarkan jarak. Anda dapat menentukan parameter mode dalam FieldSort untuk bidang multi-nilai, seperti Array fields atau Nested fields, untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri. | |||
Paging | Tentukan metode paging saat mengkueri data | Jika jumlah baris dalam respons kurang dari 100.000, Anda dapat menggunakan metode ini untuk melompat ke halaman tertentu. | |
Jika Anda menggunakan fitur ini, data dikembalikan halaman demi halaman dan Anda hanya bisa paging mundur. Untuk paging maju, Anda dapat menyimpan dan menggunakan token sebelumnya karena token valid secara permanen selama kueri. |
Tentukan metode pengurutan saat Anda membuat indeks pencarian
Secara default, data dalam indeks pencarian diurutkan berdasarkan nilai parameter IndexSort. Ketika menggunakan indeks pencarian untuk mengkueri data, nilai parameter IndexSort menentukan urutan default data yang cocok dikembalikan.
Saat membuat indeks pencarian, Anda dapat menentukan pengaturan pra-pengurutan dengan mengonfigurasi parameter IndexSort. Jika tidak menentukan pengaturan pra-pengurutan, data dalam indeks pencarian diurutkan berdasarkan kunci utama.
Anda dapat menentukan PrimaryKeySort atau FieldSort sebagai metode pra-pengurutan untuk indeks pencarian. PrimaryKeySort menunjukkan pengurutan berdasarkan kunci utama, sedangkan FieldSort menunjukkan pengurutan berdasarkan nilai bidang.
Indeks pencarian yang berisi bidang Nested tidak mendukung pra-pengurutan indeks.
Tentukan metode pengurutan saat Anda mengkueri data
Pengurutan hanya dapat diaktifkan untuk bidang yang memiliki parameter enableSortAndAgg disetel ke true.
Anda dapat menentukan metode pengurutan untuk setiap kueri. Kueri berbasis indeks pencarian mendukung metode pengurutan berikut. Anda juga dapat menentukan beberapa metode pengurutan berdasarkan prioritas yang berbeda.
ScoreSort
Anda dapat menggunakan ScoreSort untuk mengurutkan hasil kueri berdasarkan skor relevansi kata kunci berbasis BM25. Metode ini cocok untuk skenario seperti pencarian teks lengkap.
Sebelum mengurutkan data berdasarkan skor relevansi kata kunci, Anda harus mengonfigurasi parameter untuk ScoreSort. Jika tidak, data yang cocok akan diurutkan berdasarkan pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort.
SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new ScoreSort())));PrimaryKeySort
Anda dapat menggunakan PrimaryKeySort untuk mengurutkan hasil kueri berdasarkan nilai kunci utama.
SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new PrimaryKeySort()))); // Urutkan hasil kueri dalam urutan naik.
//searchQuery.setSort(new Sort(Arrays.asList(new PrimaryKeySort(SortOrder.DESC)))); // Urutkan hasil kueri dalam urutan turun.
FieldSort
Anda dapat menggunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai satu atau lebih kolom tertentu.
Urutkan hasil kueri berdasarkan nilai satu kolom
Anda dapat menggunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai kolom tertentu.
SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new FieldSort("col", SortOrder.ASC))));Urutkan hasil kueri berdasarkan nilai beberapa kolom
Anda juga dapat mengurutkan hasil kueri berdasarkan nilai dua kolom dalam urutan tertentu untuk menentukan urutan data yang cocok dikembalikan.
SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(
new FieldSort("col1", SortOrder.ASC), new FieldSort("col2", SortOrder.ASC))));Urutkan hasil kueri berdasarkan nilai kolom tambahan
Jika Anda mengurutkan data berdasarkan nilai kolom bertipe Long, Double, atau Date, Anda dapat mengonfigurasi parameter missingField untuk menentukan kolom dengan tipe data yang sama sebagai kolom tambahan yang digunakan ketika data hilang di kolom asli.
/**
* Urutkan hasil kueri berdasarkan nilai kolom Col_Long dalam urutan menurun. Jika data di kolom Col_Long bertipe Long hilang, Anda dapat menggunakan kolom Col_Long_sec dengan tipe data yang sama sebagai kolom tambahan untuk pengurutan.
*/
SearchQuery searchQuery = new SearchQuery();
FieldSort fieldSort = new FieldSort("Col_Long");
// Tentukan kolom Col_Long_sec sebagai kolom tambahan untuk pengurutan ketika data di kolom Col_Long hilang.
fieldSort.setMissingField("Col_Long_sec");
fieldSort.setOrder(SortOrder.DESC); Urutkan hasil kueri berdasarkan elemen yang ditentukan untuk bidang multi-nilai
Anda dapat menentukan parameter mode untuk bidang multi-nilai, seperti Array fields atau Nested fields, untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri.
Anda dapat menentukan parameter mode untuk Array fields untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri.
// Baris doc1 dan doc2 berisi kolom field1 bertipe Array. Nilai kolom field1 di baris doc1 adalah [2,3] dan nilai kolom field1 di baris doc2 adalah [1,3,4].
// Anda dapat menentukan parameter mode untuk menentukan elemen Array field di dua baris yang digunakan untuk mengurutkan dua baris tersebut.
{
// Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari Array field digunakan untuk mengurutkan baris. Dalam contoh ini, 3 di baris doc1 dan 4 di baris doc2 digunakan untuk mengurutkan dua baris, dan hasil pengurutan adalah doc2 dan doc1.
FieldSort fieldSort = new FieldSort("field1", SortOrder.DESC);
fieldSort.setMode(SortMode.MAX);
}
{
// Jika Anda menyetel parameter mode ke SortMode.MIN, elemen minimum dari Array field digunakan untuk mengurutkan baris. Dalam contoh ini, 2 di baris doc1 dan 1 di baris doc2 digunakan untuk mengurutkan dua baris, dan hasil pengurutan adalah doc1 dan doc2.
FieldSort fieldSort = new FieldSort("field1", SortOrder.DESC);
fieldSort.setMode(SortMode.MIN);
}Anda juga dapat menentukan parameter mode untuk Nested fields untuk menentukan elemen-elemen yang digunakan untuk mengurutkan baris anak.
// Baris doc1 dan doc2 berisi kolom field1 bertipe Nested.
// Nilai kolom field1 di baris doc1 adalah [{"name":"b", "age":1},{"name":"a", "age":7}].
// Nilai kolom field1 di baris doc2 adalah [{"name":"a", "age":1},{"name":"c", "age":1},{"name":"d", "age":5}].
{
// Anda dapat menentukan parameter mode untuk menentukan elemen Nested field di dua baris yang digunakan untuk mengurutkan baris anak.
// Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari Nested field digunakan untuk mengurutkan baris. Dalam contoh ini, 7 di baris doc1 dan 5 di baris doc2 digunakan untuk mengurutkan dua baris berdasarkan kolom age, dan hasil pengurutan adalah doc1 dan doc2.
FieldSort fieldSort = new FieldSort("field1.age", SortOrder.DESC);
fieldSort.setMode(SortMode.MAX);
String path = "field1";
NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.matchAll().build());
fieldSort.setNestedFilter(nestedFilter);
}
{
// Anda dapat menentukan parameter mode untuk menentukan elemen Nested field di dua baris yang digunakan untuk mengurutkan baris anak di mana nilai kolom age adalah 1.
{
// Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari Nested field digunakan untuk mengurutkan baris. Dalam contoh ini, "b" di baris doc1 dan "c" di baris doc2 digunakan untuk mengurutkan dua baris berdasarkan kolom name, dan hasil pengurutan adalah doc2 dan doc1.
FieldSort fieldSort = new FieldSort("field1.name", SortOrder.DESC);
fieldSort.setMode(SortMode.MAX);
String path = "field1";
NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.term("field1.age",1).build());
fieldSort.setNestedFilter(nestedFilter);
}
{
// Jika Anda menyetel parameter mode ke SortMode.MIN, elemen minimum dari Nested field digunakan untuk mengurutkan baris. Dalam contoh ini, "b" di baris doc1 dan "a" di baris doc2 digunakan untuk mengurutkan dua baris berdasarkan kolom name, dan hasil pengurutan adalah doc1 dan doc2.
FieldSort fieldSort = new FieldSort("field1.name", SortOrder.DESC);
fieldSort.setMode(SortMode.MIN);
String path = "field1";
NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.term("field1.age",1).build());
fieldSort.setNestedFilter(nestedFilter);
}
}GeoDistanceSort
Anda dapat menggunakan GeoDistanceSort untuk mengurutkan hasil kueri berdasarkan lokasi geografis.
SearchQuery searchQuery = new SearchQuery();
// Urutkan hasil berdasarkan jarak dari nilai di kolom geo bertipe Geopoint ke pasangan koordinat (0, 0).
Sort.Sorter sorter = new GeoDistanceSort("geo", Arrays.asList("0, 0"));
searchQuery.setSort(new Sort(Arrays.asList(sorter)));Tentukan metode paging
Anda dapat mengonfigurasi parameter limit dan offset atau menggunakan token untuk paging baris dalam respons.
Konfigurasikan parameter limit dan offset
Jika jumlah total baris dalam respons kurang dari 100.000, Anda dapat mengonfigurasi parameter limit dan offset untuk paging baris. Jumlah dari nilai parameter limit dan offset tidak boleh melebihi 100.000. Nilai maksimum parameter limit adalah 100.
Untuk informasi tentang cara meningkatkan nilai maksimum parameter limit, lihat Bagaimana cara meningkatkan nilai parameter limit menjadi 1000 ketika saya memanggil operasi Search fitur indeks pencarian untuk mengkueri data?
Jika Anda tidak menentukan nilai untuk parameter limit dan offset, nilai default digunakan. Nilai default parameter limit adalah 10. Nilai default parameter offset adalah 0.
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setLimit(100);
searchQuery.setOffset(100);Gunakan token
Kami merekomendasikan Anda menggunakan token untuk deep paging karena metode ini tidak memiliki batasan pada kedalaman paging.
Jika Tablestore tidak dapat membaca semua data yang memenuhi kondisi kueri, Tablestore mengembalikan nextToken. Anda dapat menggunakan nextToken untuk terus membaca data berikutnya.
Secara default, Anda hanya bisa paging mundur ketika menggunakan token. Namun, Anda dapat menyimpan dan menggunakan token sebelumnya untuk paging maju karena token valid selama kueri.
Jika Anda ingin menyimpan nextToken atau mentransfer nextToken ke halaman frontend, Anda dapat menggunakan Base64 untuk mengkodekan nextToken menjadi string. Token bukan string. Jika Anda menggunakan new String(nextToken) untuk mengkodekan token menjadi string, informasi tentang token hilang.
Ketika menggunakan token, metode pengurutan sama dengan metode yang digunakan dalam permintaan sebelumnya. Tablestore mengurutkan data berdasarkan parameter IndexSort secara default atau berdasarkan metode yang Anda tentukan. Anda tidak dapat menentukan metode pengurutan ketika menggunakan token. Anda juga tidak dapat mengonfigurasi parameter offset ketika menggunakan token. Data dikembalikan halaman demi halaman secara berurutan, yang dapat menghasilkan kueri lambat.
Indeks pencarian yang berisi bidang Nested tidak mendukung pra-pengurutan indeks. Jika Anda memerlukan paging dan menggunakan indeks pencarian yang berisi bidang Nested untuk mengkueri data, Anda harus menentukan metode pengurutan dalam kondisi kueri untuk mengembalikan data dalam urutan yang ditentukan. Jika tidak, Tablestore tidak mengembalikan nextToken ketika hanya sebagian data yang memenuhi kondisi kueri dikembalikan.
private static void readMoreRowsWithToken(SyncClient client) {
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setGetTotalCount(true);// Tentukan bahwa jumlah total baris yang memenuhi kondisi kueri dikembalikan.
// Tentukan nama tabel data. Contoh: sampleTable. Lalu, tentukan nama indeks pencarian. Contoh: sampleSearchIndex. Untuk mendapatkan nama indeks pencarian, Anda dapat mengkueri daftar indeks pencarian di konsol Tablestore atau menggunakan Tablestore SDK. Jika Anda mengkueri daftar indeks pencarian di konsol Tablestore, Anda dapat melihat daftarnya di tab Indeks halaman Kelola Tabel.
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
SearchResponse resp = client.search(searchRequest);
if (!resp.isAllSuccess()) {
throw new RuntimeException("not all success");
}
List<Row> rows = resp.getRows();
while (resp.getNextToken()!=null) { // Jika nilai nextToken dalam respons adalah null, semua data telah dibaca.
// Kueri nilai nextToken.
byte[] nextToken = resp.getNextToken();
{
// Jika Anda perlu menyimpan nextToken atau mentransfer nextToken ke halaman frontend, Anda dapat menggunakan Base64 untuk mengkodekan nextToken menjadi string.
// Token bukan string. Jika Anda menggunakan new String(nextToken) untuk mengkodekan token menjadi string, informasi tentang token hilang.
String tokenAsString = Base64.toBase64String(nextToken);
// Dekode string menjadi byte.
byte[] tokenAsByte = Base64.fromBase64String(tokenAsString);
}
// Setel token dalam permintaan ini ke nilai nextToken dalam respons sebelumnya.
searchRequest.getSearchQuery().setToken(nextToken);
resp = client.search(searchRequest);
if (!resp.isAllSuccess()) {
throw new RuntimeException("not all success");
}
rows.addAll(resp.getRows());
}
System.out.println("RowSize: " + rows.size());
System.out.println("TotalCount: " + resp.getTotalCount());// Tentukan bahwa jumlah total baris yang cocok, bukan jumlah baris yang dikembalikan, ditampilkan.
}FAQ
Referensi
Ketika menggunakan indeks pencarian untuk mengkueri data, Anda dapat menggunakan metode kueri berikut: kueri tepat, kueri terms, kueri match all, kueri match, kueri match phrase, kueri prefix, kueri range, kueri wildcard, kueri geo, kueri vektor KNN, kueri Boolean, kueri nested, dan kueri exists. Setelah membuat indeks pencarian, Anda dapat menggunakan metode kueri yang disediakan oleh indeks pencarian untuk mengkueri data dari berbagai dimensi berdasarkan kebutuhan bisnis Anda.
Anda dapat mengurutkan atau membagi halaman baris yang memenuhi kondisi kueri menggunakan fitur pengurutan dan paging. Untuk informasi lebih lanjut, lihat Lakukan Pengurutan dan Paging.
Anda dapat menggunakan fitur collapse (distinct) untuk meruntuhkan set hasil berdasarkan kolom tertentu. Dengan cara ini, data tipe yang ditentukan muncul hanya sekali dalam hasil kueri. Untuk informasi lebih lanjut, lihat Collapse (distinct)
Jika Anda ingin menganalisis data dalam tabel, Anda dapat memanggiloperasi Search untuk menggunakan fitur agregasi atau menggunakan fitur kueri SQL. Sebagai contoh, Anda dapat mengkueri nilai maksimum dan minimum, jumlah nilai, dan jumlah baris. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.
Jika Anda ingin mendapatkan semua baris yang memenuhi kondisi kueri tanpa perlu mengurutkan baris, Anda dapat memanggil operasi ParallelScan dan ComputeSplits untuk menggunakan fitur pemindaian paralel. Untuk informasi lebih lanjut, lihat Pemindaian Paralel.