Arama dizini sonuçları üzerinde ölçüm hesaplamak ve gruplama yapmak için Tablestore Python SDK'yı kullanın.
Ön Koşullar
Tablestore Python SDK yükleyin ve bir istemci başlatın.
Toplama özelliği SDK 5.2.1 veya sonraki sürümlerini gerektirir. En son SDK sürümünü kullanmanızı öneririz.
Açıklama
Toplama işlemi, arama dizini sorgu sonuçlarından ölçümler hesaplar veya gruplar oluşturur. Ölçüm toplama nesnelerini SearchQuery.aggs listesine, gruplama nesnelerini ise SearchQuery.group_bys listesine ekleyin. İstek içindeki her bir name değeri benzersiz olmalı ve karşılık gelen yanıt sonucunu tanımlamalıdır. Yalnızca toplama sonuçlarını almak için limit parametresini 0 olarak ayarlayın.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Toplama için kullanılan arama dizini alanlarında sıralama ve toplama özelliklerinin etkinleştirilmiş olması gerekir. Desteklenen alan türleri toplama ve gruplama türüne göre değişir. Aynı düzeyde en fazla beş gruplama yapılandırabilirsiniz. Farklı değer sayımı, yüzdelik dilimler ve alana göre gruplama yaklaşık hesaplama kullanır. Çok sayıda toplama veya derin iç içe geçmiş toplamalar istek karmaşıklığını ve gecikme süresini artırır.
Aşağıdaki örnek, price alanının minimum, maksimum ve ortalama değerlerini hesaplar ve satırları category alanına göre gruplar.
search_query = SearchQuery(
MatchAllQuery(),
limit=0,
aggs=[
Min("price", name="min_price"),
Max("price", name="max_price"),
Avg("price", name="avg_price"),
],
group_bys=[
GroupByField("category", name="by_category"),
],
)
response = client.search(
"example_table",
"example_index",
search_query,
)
for result in response.agg_results:
print(result.name, result.value)
for result in response.group_by_results:
print(result.name, result.items)
Parametreler
Arama isteği
search yöntemi aşağıdaki parametreleri içerir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sorgu yapılandırması
search_query parametresi SearchQuery türündedir ve aşağıdaki toplama ile ilgili parametreleri içerir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ölçüm toplamaları
Aşağıdaki nesneleri search_query.aggs listesine ekleyin. field toplama alanıdır, name sonucu tanımlar ve missing_value alan eksik olduğunda kullanılır. missing_value belirtilmezse alanı eksik olan satırlar yoksayılır.
Min, Max ve Avg
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sum
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Count
|
|
|
|
|
|
|
|
|
|
|
|
DistinctCount
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Percentiles
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TopRows
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DistinctCount yaklaşık bir değerdir. 10.000'den az farklı değer için sonuçlar kesin değere yakındır ve 100 milyon değer için hata oranı yaklaşık %2'dir. Percentiles da yaklaşık bir değerdir ve uç yüzdelik dilimler genellikle ortalamadan daha doğrudur. TopRows öğesini yalnızca bir gruplamanın alt toplamasi olarak kullanın.
Gruplama
Aşağıdaki nesneleri search_query.group_bys listesine ekleyin. Her grupta ölçüm alt toplamaları ve alt gruplama yapmak için sub_aggs ve sub_group_bys parametrelerini kullanın.
GroupByField
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByComposite
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByRange
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByGeoDistance
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByFilter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByHistogram
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByDateHistogram
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByGeoGrid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GroupByComposite Tablestore Python SDK 6.4.4 veya sonraki bir sürümü gerektirir. Çok sayıda grup varsa size parametresini belirtin ve her sonuçtan alınan next_token değerini kullanarak belirteç boş kalana kadar sayfalandırma yapın.
Dönüş sütunları
columns_to_get parametresi ColumnsToGet türündedir ve aşağıdaki parametreleri içerir.
|
|
|
|
|
|
|
|
|
|
|
|
Yanıt
search yöntemi SearchResponse döndürür. Aşağıdaki tabloda temel alanlar açıklanmaktadır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
agg_results listesindeki her öğe, bir toplamayı ve değerini tanımlamak için name ve value kullanır. group_by_results listesindeki her öğe, grup anahtarlarını, satır sayılarını, alt toplamaları ve alt gruplamaları döndürmek için name ve items kullanır. Bir GroupByComposite sonucu ayrıca devam eden okumalar için source_group_by_names ve next_token içerir. Her grubun keys değeri, sources ile hizalanmış bir dize listesidir; eksik bir alan değeri None ile temsil edilir.
Tuple uyumlu yanıt
Tablestore Python SDK 5.2.0 sürümünden itibaren arama API'leri tuple yerine yanıt nesneleri döndürür. 5.1.0 ve önceki sürümler doğrudan tuple döndürür. 5.2.1 ve sonraki sürümlerde, önceki sürümlerle uyumlu bir tuple elde etmek için SearchResponse.v1_response() yöntemini çağırabilirsiniz. Yeni kodlarda, yanıt alanları genişletildiğinde paketleme hatalarını önlemek için SearchResponse özniteliklerine doğrudan erişin.
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
Örnekler
Çok alanlı gruplamada sayfalandırma
Aşağıdaki örnek, category ve price alanlarına göre gruplandırma yapar ve sayfa başına iki grup döndürür.
sources = [
GroupByField("category", name="category_source"),
GroupByField("price", name="price_source"),
]
next_token = None
all_items = []
while True:
group_by = GroupByComposite(
sources,
size=2,
next_token=next_token,
name="by_category_and_price",
)
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=[group_by]),
)
result = response.group_by_results[0]
all_items.extend(result.items)
next_token = result.next_token
if not next_token:
break
for item in all_items:
print(item.keys, item.row_count)
Tarih histogramı ve coğrafi ızgara oluşturma
Aşağıdaki örnek günlük bir tarih histogramı oluşturur ve konumları yaklaşık 39 km x 19 km boyutlarında GeoHash ızgaralarına göre gruplandırır.
group_bys = [
GroupByDateHistogram(
"event_date",
DateTimeValue(1, DateTimeUnit.DAY),
field_range=FieldRange("2026-08-01", "2026-08-04"),
name="by_day",
),
GroupByGeoGrid(
"location",
GeoHashPrecision.GHP_39KM_19KM_4,
name="by_geo_grid",
),
]
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=group_bys),
)
for result in response.group_by_results:
print(result.name, result.items)