الستیکسرچ بخش چهارم: کوئریهای تحلیلی
تا اینجا یاد گرفتیم چطور دادههامون رو پیدا کنیم، با کوئریها و فیلترها و مخصوصاً bool query آشنا شدیم.
اما بعد از اینکه دادههامون رو پیدا کردیم چی؟ چطور ازشون تحلیل بگیریم و big picture رو ببینیم؟
اینجاست که قدرت واقعی Elasticsearch خودش رو نشون میده: Aggregationها.
اگه کوئریها جواب این سوال رو میدن که
«کدوم داکیومنتها با شرط من همخوانی دارن؟»
Aggregationها جواب سوالهای خیلی استراتژیکتری رو میدن، مثل:
- فروش سهماههی اخیر چطوری بوده؟
- ۱۰ مشتری برترم از نظر درآمد کیان؟
- میانگین زمان پاسخگویی اپ من در هر ساعت چقدره؟
- رایجترین خطاها توی لاگها چی هستن؟
تو این بخش از «جستجو» به «کشف» میرسیم. یاد میگیریم چطور از دادهی خام، بینش واقعی و قابلاقدام بسازیم.
Aggregation یعنی چی؟
فکرش رو بکن مثل GROUP BY در SQL، اما خیلی قویتر!
در اصل، Aggregation یه چارچوب برای ساخت خلاصهها و تحلیلها روی نتایج جستجوه.
خیلی شبیه همون GROUP BY هست، ولی برای دادههای بدون ساختار یا نیمهساختیافته خیلی انعطافپذیرتره.
Aggregationها روی مجموعهای از داکیومنتها کار میکنن (یا کل ایندکس)، و در نهایت یه ساختار دادهای برمیگردونن به اسم bucket.
میتونی هم روی کل ایندکس Aggregation بزنی، هم فقط روی نتایج یه کوئری خاص. همین ترکیب باعث میشه واقعا کاربردی بشن.
دو نوع اصلی Aggregation: Bucket و Metric
درک تفاوت این دوتا اولین قدم برای حرفهای شدن تو Aggregationهاست.
Bucket Aggregation
کارش اینه که داکیومنتها رو توی گروهها یا همون «باکتها» دستهبندی کنه.
فرض کن یه عالمه فاکتور داری:
یه date_histogram میتونه برای هر روز یه باکت بسازه،
یه terms aggregation میتونه برای هر دسته محصول یه باکت جدا بسازه.
هدف: بخشبندی دادههاست.
Metric Aggregation
اینا میان آمار و ارقام هر باکت رو حساب میکنن.
مثلاً برای باکت «Product Category A»، میانگین قیمت، مجموع فروش، تعداد سفارشها و … رو بهت میدن.
هدف: خلاصهسازی داده در هر بخش.
جادو وقتی اتفاق میافته که این دوتا رو با هم ترکیب کنی — یعنی اول با bucketها دادهت رو گروهبندی کنی، بعد داخل هر گروه با metricها تحلیل انجام بدی.
Aggregationهای مهم
بیایید چندتا از پرکاربردترین aggregationها رو با هم مرور کنیم
۱. Terms Aggregation – ساخت لیست «Top N»
احتمالاً پرکاربردترین aggregationه.
برای هر مقدار یکتا از یه فیلد، یه باکت درست میکنه.
مثلاً: پیدا کردن ۵ دسته محصول پرتکرار در انبار.
GET /products/_search
{
"size": 0,
"aggs": {
"top_categories": {
"terms": {
"field": "category.keyword",
"size": 5
}
}
}
}
نتیجه؟ یه لیست از ۵ دسته برتر با تعداد آیتمهای هرکدوم.
۲. Date Histogram – قهرمان تحلیلهای زمانی
برای دادههای زمانی فوقالعادهست.
براساس بازههای زمانی (ماهانه، روزانه، ساعتی و…) باکت درست میکنه.
مثلاً میخوای درآمد ماهانهت رو ببینی:
GET /orders/_search
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "month"
},
"aggs": {
"monthly_revenue": {
"sum": {
"field": "total_amount"
}
}
}
}
}
}
این اساس هر نوع داشبورد یا تحلیل ترندیه که بعداً میسازی.
۳. Range Aggregation – ساخت دستهبندی دلخواه
وقتی بخوای خودت محدوده تعریف کنی، این ابزار به کارت میاد.
مثلاً میخوای محصولات رو به سه بازهی قیمتی تقسیم کنی: اقتصادی، متوسط، و پریمیوم.
GET /products/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 50.0 },
{ "from": 50.0, "to": 200.0 },
{ "from": 200.0 }
]
}
}
}
}
۴. Metrics Aggregation – آمارهای کلیدی
اینها معمولاً داخل باکتها استفاده میشن تا خلاصهسازی انجام بدن:
avg: میانگینsum: مجموعmin/max: کوچکترین و بزرگترین مقدارstats: یه گزینهی همهکاره که count، min، max، avg و sum رو با هم برمیگردونه
یه مثال واقعی: تحلیل فروش در ۳۰ روز اخیر
فرض کن میخوای ۳ دسته محصول برتر از نظر درآمد رو پیدا کنی، فقط برای سفارشهای ۳۰ روز اخیر.
GET /orders/_search
{
"query": {
"range": {
"order_date": {
"gte": "now-30d/d"
}
}
},
"size": 0,
"aggs": {
"top_categories_by_revenue": {
"terms": {
"field": "product.category.keyword",
"size": 3
},
"aggs": {
"category_revenue": {
"sum": {
"field": "line_items.price"
}
}
}
}
}
}
خروجی بهت سه دسته محصول پرسود ماه اخیر رو نشون میده، با رقم دقیق درآمد هرکدوم.
چند نکتهی کاربردی
- برای فیلدهای متنی همیشه از
.keywordاستفاده کن تا مقدار دقیق رو بگیری. - پارامتر
sizeدرtermsفقط بالاترین N مقدار رو برمیگردونه، اگه بیشتر میخوای زیادش کن. - اگه فقط نتیجهی Aggregation برات مهمه و نه دادهها، مقدار
sizeرو ۰ بذار تا سرعت بهتر بشه (مخصوصا با وضعیت اینترنت این روزا :)). - از
post_filterمیتونی برای ساخت سرچهای فیلترشده استفاده کنی، بدون اینکه روی Aggregation اصلی تأثیر بذاره (مثلاً برای ساخت جستجوی چندبخشی در UI).
جمعبندی
Aggregationها باعث میشن Elasticsearch فقط یه موتور جستجو نباشه، بلکه تبدیل بشه به یه پلتفرم تحلیلی کامل.
باهاش میتونی از دادهی خام فراتر بری و الگوها، ترندها و خلاصههای مفید استخراج کنی.
اگه bucketها و metricها رو خوب یاد بگیری و بتونی تو در تو استفادهشون کنی، میتونی داشبوردها و گزارشهای حرفهای بسازی که واقعاً به تصمیمگیری کمک میکنن.
