Elasticsearch بهعنوان یکی از محبوبترین موتورهای جستجو و تحلیل داده، امکان ذخیره و جستجوی سریع اطلاعات در قالب JSON را فراهم میکند. اما برای استفادهی بهینه از آن، ابتدا باید با ساختار دادهها و نحوه استخراج آنها آشنا شویم. در این مقاله، به شما نشان میدهیم چگونه با اجرای کوئریهای پایه، شناخت ساختار دادهها، و اعمال فیلترهای مختلف میتوانید جستجوها و تحلیلهای دقیقتری در Elasticsearch انجام دهید. از معرفی فیلترهای پرکاربرد تا مثالهای عملی که با مطالعهی آن می توانید دادههای مورد نیازتان را سریع و آسان استخراج و تحلیل کنید. یکی از کاربردهای این کوئریها که در ادامه به آنها اشاره میشود استخراج آمار لاگها با یک یا چند وضعیت مشخص در یک بازهی زمانی است. این آمار میتواند به شما در تحلیل وضعیت سرویس کمک کند. از این رو از خروجی این آمار به منظور مانیتورینگ وضعیتها میتوان استفاده کرد. از این کوئریها میتوانید در پلتفرم مانیتورینگ معین در بخش شاخصهای سفارشی استفاده کرده و آمار لحظه به لحظهی لاگهای خود را در معین ثبت و از آن برای تحلیل استفاده کنید.
برای دریافت اطلاعات و زدن کوئری بر روی Elastic Search نیاز است که با ساختار کلی خروجی JSON ذخیره شده در آن آشنا باشیم. برای این منظور نیاز است که یک کوئری کامل با استفاده از /_search?pretty و بدون فیلتر به صورت match_all بر روی Elastic مورد نظر بزنیم تا با تمامی مقادیر و اجزای JSON در خروجی آشنا شویم سپس با شناخت مقادیر و ساختار میتوانیم کوئری دقیق با فیلتر های مورد نظر و حتی با خروجی به صورت شمارنده و تعداد و در بازه های زمانی مختلف داشته باشیم.
به منظور دریافت نمونه خروجی JSON و ساختار کلی می توان از کوئری زیر استفاده کرد و تمامی فیلد های درون محتوای مورد نظر را در خروجی ملاحظه کرد.
curl -u elastic:moein@123 -k -XPOST "http://localhost:9200/filebeat-*/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"size": 2
}'
با اجرای دستور فوق خروجی کامل بدون بازه زمانی خاصی نمایش داده می شود و برای جلوگیری از سنگین شدن کوئری محدودیت size تعیین شده تا از تکرار بی مورد داده ها جلوگیری شود. در نظر داشته باشید که در مسیر ارایه شده در درخواست فوق نام Index پس از پورت بیان شده است. بنابراین در مسیر ارایه شده در درخواست باید index مورد نظر مشخص شود.
امکان دریافت اطلاعات از طریق کوئری های مختلفی در Elastic وجود دارد که رایج ترین آنها مربوط به /_count?pretty و /_search?pretty است.
از /_count?pretty برای ایجاد کوئری شمارنده و از /_search?pretty برای ایجاد کوئری با خروجی کامل استفاده می شود.
برای محدود کردن خروجی و رسیدن به داده مورد نظر از شروط و فیلتر های مختلفی می توان استفاده کرد که در ادامه برخی از رایج ترین آنها معرفی میشود.
Term: معمولا در بلاک filter استفاده می شود و مقدار آن باید دقیقا با value مورد اشاره برابر باشد.
{ "term": { "responseCode": 200 } }
در نظر داشته باشید در حالت هایی که مقادیر غیر عددی و یا رشته های ترکیبی و پیچیده باشد الزاما باید مقدار را درون یک ساختار value فراخوانی کنیم.
{"term": { "clientip": { "value": "130.246.123.197" } }}
Terms: مشابه Term است با این تفاوت که می تواند همزمان چندین مقدار متفاوت را بررسی کند.
{ "terms": { "responseCode": [500, 404] } }
Range: برای بررسی بازه ای از اعداد و همچنین بازه زمانی مشخص از این فیلتر استفاده می شود. و شاخص های به کار رفته در آن به چهار دسته زیر تقسیم می شوند.
برای مثال فیلتر زیر به بازه زمانی 5 دقیقه اخیر اشاره دارد:
{
"range": {
"@timestamp": {
"gte": "now-5m",
"lt": "now"
}}}
Exists: در این ویژگی مقدار (value) وارد شده کافی است جزئی از کلید (key) مربوطه باشد و نیازی نیست دقیقا برابر با آن باشد و معمولا برای اطمینان از وجود یک فیلد در سند به کار می رود.
"exists": { "field": "userId" }
همچنین فیلتر های دیگری از جمله prefix، wildcard، IDs filter و غیره وجود دارد که در صورت نیاز می توان از آنها نیز استفاده کرد.
curl -u elastic:moein@123 -k -XPOST "http://localhost:9200/filebeat-*/_count?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": [
{ "term": { "responseCode": 200 } },
{ "term": { "serviceName": "testservice" } },
{
"range": {
"@timestamp": {
"gte": "now-5m",
"lt": "now"
}
}
}
]
}
}
}'
curl -u elastic:moein@123 -k -XPOST "http://localhost:9200/filebeat-*/_count?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": [
{ "terms": { "responseCode": [500, 404] } },
{ "term": { "serviceName": "testservice" } },
{
"range": {
"@timestamp": {
"gte": "now-15m",
"lt": "now"
}
}
}
]
}
}
curl -u elastic:moein@123 -XPOST "http://localhost:9200/filebeat-*/_count?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": [
{ "term": { "responseCode": 200 } },
{ "term": { "serviceName.keyword": "testservice" } },
{ "range": {
"@timestamp": {
"gte": "now-60m",
"lt": "now-15m"
}
}}
]
}
}
}'
در این مقاله با اصول پایه و کاربردی کوئریزنی در Elasticsearch آشنا شدیم. از مشاهده ساختار JSON و اجرای کوئری match_all برای شناخت دادهها گرفته تا استفاده از فیلترهای term، terms، range و exists برای محدودسازی نتایج. همچنین با مثالهای عملی، نحوه شمارش نتایج و اعمال بازههای زمانی مختلف را بررسی کردیم. با تسلط بر این تکنیکها، میتوانید کوئریهای پیچیدهتری طراحی کرده و اطلاعات دقیقتر و هدفمندتری از Elasticsearch استخراج کنید. در نهایت، این دانش به شما کمک میکند تا جستجو و تحلیل دادهها را سریعتر، دقیقتر و حرفهایتر انجام دهید. نمونهی curlهای ارایه شده در خصوص تعداد لاگها را میتوانید به راحتی در بخش شاخصهای سفارشی معین استفاده کرده و آمار لاگهای خود با ویژگیهای مورد نظر را در معین مانیتور کنید.