Ali Zeiynali
Ali Zeiynali
خواندن ۵ دقیقه·۱ سال پیش

هر آنچه باید در مورد دیتابیس الاستیک سرچ بدانید - 3

elasticsearch DATABASE
elasticsearch DATABASE

توی این پست میخوایم اصل ماجرا رو جمع و جور کنیم تا توی پست بعدی بریم سراغ اسکریپت نویسی و آنالایزر ها


اول این چند تا دستور رو ببینیم تاهم مرور بشه هم چند تا چیز جدید یاد بگیریم:

GET firstindex/_count GET /firstindex/_doc/1 GET firstindex/_doc/1/_source GET /firstindex/_search { &quotquery&quot: { &quotterm&quot: { &quotusername&quot: &quotAli&quot } }} GET /firstindex/_search
{
&quotquery&quot: {
&quotrange&quot : {
&quotid&quot : {
&quotgte&quot : 20
}}}
GET /firstindex/_search
{
&quotquery&quot: {
&quotrange&quot : {
&quotid&quot : {
&quotlte&quot : 20
}
}}}

خب، همین قدر بسه، بریم ببینیم این ها چی هستن

اولین کد همونجور که معلومه، تعداد doc های index رو نشون میده

دومی، اطلاعات doc 1 رو برمیگردونه و سومی هم فقط فیلد های doc 1

چهارمی هم هر Username ای که علی باشه

و اما پنجمی، پنجمی از یک range id استفاده میکنه، یعنی چند تا id، و gte هم یعنی مساوی یا کوچک تر از عدد 20

ششمی هم همونه، فقط بزرگ تر یا مساوی 20

دقت کنید که روی آی دی های عددی کار میکنه

و حالا اگریگیشن(aggregation):

و اما اگریگیشن چیست؟

اگریگیشن که در الاستیک به صورت aggs نوشته میشود، برای به دست آوردن لیستی از doc ها با یک فیلد یکسان است، یعنی چی؟

مثلا من میخوام ببینم چند تا قمی دارم، چند تا تهرانی، و چند تا اصفهانی، میخواهم به آن هایی که بیشتر هستند یک کد تخفیف بدهم یا مثلا برنامه ام را در شهر آنها اجرا کنم

پس یک اگریگیشن روی city user ها میزنم و دسته ها را به دست می آورم

یک مثال ساده

GET /firstindex/_search
{
&quotaggs&quot: {
&quotcitys&quot: {
&quotterms&quot: {
&quotfield&quot: &quotcity&quot,
&quotsize&quot: 10000
}}}}

اینجا ما روی فیل city aggs زدیم و 10000 تای اول رو خواستیم

سایز دیفالت 10 هست، پس اینو در نظر داشته باشین تا به مشکل نخورین

نکته مهم:
aggs فقط روی فیلد های keyword کار میکنه و روی فیلد های string جواب نمیده، اما چرا؟
چون keyword ها یک مقدار ثابت و کلیدی هستند، اما استرینگ ها حالت متن و اطلاعات محتوایی دارند، مانند این است که روی متن مقالات اگریگیشن بزنید.

اسم citys هم فقط یک اسم است، برای قاطی نشدن با بقیه اگریگیشن ها (که الان توضیح میدم) باید اسم تعیین کرد
اسم میتواند هر چیزی باشد و اصلا اهمیتی ندارد

و حالا 2 تا اگریگیشن با هم:

GET /users/_search
{
&quotaggs&quot: {
&quotcitys&quot: {
&quotterms&quot: {
&quotfield&quot: &quotcity&quot,
&quotsize&quot: 10000
}
},
&quotten_years&quot: {
&quotterms&quot: {
&quotfield&quot: &quotage&quot
} } } }

چند تا sort

POST /users/_search
{
&quotaggs&quot: {
&quotcitys&quot: {
&quotterms&quot: {
&quotfield&quot: &quotcity&quot,
&quotsize&quot: 20
},
&quotaggs&quot: {
&quotpageination&quot: {
&quotbucket_sort&quot: {
&quotsort&quot: [
{
&quotsort_field_1&quot: {
&quotorder&quot: &quotasc&quot
}
},
{
&quotsort_field_2&quot: {
&quotorder&quot: &quotdesc&quot
}
},
&quotsort_field_3&quot
]}}}}}}

در اینجا از bucket_sort استفاده کرده ایم، میتوان با آن چند sort انجام داد، ما به ترتیب اولویت های sort را sort_fiel_1 و 2 و 3 به ترتیب گذاشته ایم (میتوانند فیلد های مجازی هم باشند)

default order هر order desc هست و نیازی به تعریف آن نیست

و حالا بحث مرتب سازی

مرتب سازی در الاستیک سرچ بحث بزرگی دارد، اما یک مثال ساده اش این میشود:

GET /users/_search
{
&quotquery&quot: {
&quotrange&quot: {
&quotid&quot: {
&quotlte&quot: 20
}} },
&quotsort&quot: [
{
&quotage&quot: {
&quotorder&quot: &quotdesc&quot
}}]}

در این کد، ما تمام آی دی های بیشتر از 200 یا مساوی 200 را گرفته ایم و آنها را بر اسا فیلد age از بزرگ به کوچک مرتب کرده ایم

desk در order به معنای از بزرگ به کوچک است و برعکس آن، asc است

و حالا sort در اگریگیشن:

POST /users/_search
{
&quotaggs&quot: {
&quotcitys&quot: {
&quotterms&quot: {
&quotfield&quot: &quotcity&quot,
&quotsize&quot: 20
},
&quotaggs&quot: {
&quotpageination&quot: {
&quotbucket_sort&quot: {
&quotfrom&quot: 10,
&quotsize&quot: 10
}}}}}}

و اما بحث فیلد های مجازی

فیلد های مجازی چی هستند؟

فیلد های مجازی، فیلد هایی در داک ما هستند که واقعا وجود ندارند، این فیلد ها برای مرتب سازی، و... استفاده میشوند، فیلد های مجازی فقط در لحظه اجرای اسکریپت وجود دارند و مانند فیلد های عادی هستند، با این فرق که در doc ما ذخیره نمیشوند

در مبحث اسکریپت ها بیشتر فیلد های مجازی رو بررسی میکنیم، ولی فعلا اینجا میخوایم یک مثال ساده اش رو با هم توی اگریگیشن ببینیم

یک مثال ساده

POST /users/_search
{
&quotaggs&quot: {
&quota1&quot: {
&quotterms&quot: {
&quotfield&quot: &quotage&quot,
&quotorder&quot: {&quot_Sort&quot: &quotdesc&quot}
},
&quotaggs&quot:{
&quot_Sort&quot:{
&quotsum&quot:{
&quotfield&quot:&quotage, age&quot
}}}}}}

ما اینجا sort را بر اساس فیلد _Sort گذاشته ایم، اما واقعا در doc مان فیلد _Sort نداریم و این یک فیلد مجازی هست.

البته شما در "field":"age, age" به جای , نقطه قرار دهید

فیلد های مجازی برای اگری ها، در یک اگری درونی دخیره میشود، آن هم یک اسم دلخواه میگیرد که ما نام آن را _Sort گذاشته ایم

بهتر است، اول اسم فیلد های مجازی، _ (underline) قرار دهیم تا با فیلد های عادی قاطی نشود

در این فیلد، ما یک عمل sum انجام داده ایم که بر روی فیلد های age, age انجام گرفته، یعنی این دو فیلد را با هم جمع کرده ایم تا یک فیلد مجازی بسازیم.

به جای استفاده از sum، میتوان از avg و max و min هم استفاده کرد، max به معنای هرکدام که بزرگ تر بود، min هر کدام کوچک تر بود و avg هم میانگین آن ها

جستجو

GET /users/_search
{
&quotquery&quot: {
&quotmatch_phrase&quot: {
&quotcontent&quot: &quotAli&quot
}
}
}

این جستجوی ساده، عبارت Ali را دقیقا در content جستجو میکند، یعنی کلمه Ali باید دقیقا در آن با فاصله باشد، مانند "word" در Google

boost

GET /users/_search
{
&quotquery&quot: {
&quotmatch_phrase&quot: {
&quotcontent&quot: {
&quotquery&quot: &quotسبک زندگی اسلامی&quot,
&quotboost&quot: 10
}}}}

هنگام داشتن چند تا query، امتیاز هر کوئری 1 در نظر گرفته میشود، اگر در یک index، 2 کوئری درست شوند، امتیاز آن ایندکس 2 میشود، هر چند الاستیک سرچ دقیقا 1 نمیدهد و عدد ممیزی خاصی میدهد.

با Boost میتوانید حداکثر امتیاز را بیشتر کنید تا اولویت آن کوئری را بالا ببرید

و آخرین نکته این مقاله

POST qanonindex-v03/_search
{
&quotsize&quot: 4,
&quotfrom&quot: 4,
&quot_source&quot: [&quotusername&quot, &quotage&quot],
&quotquery&quot: {
&quotbool&quot: {
&quotmust_not&quot: [
{
&quotterm&quot: {
&quotusername&quot: &quotAli&quot
}
},
{
&quotmatch&quot: {
&quotage&quot: &quot23&quot } }]}}}

در پست قبل must را توضیح دادیم

اگر یادتان نیست باید بهتر میخواندید!
بهتر بود یادداشت هم بردارید

Must_not درست برعکس آن است، و به معنای این است که هردو شرط برقرار نباشند


جلسه ی بعد

https://virgool.io/@Ali_Z/%D9%87%D8%B1-%D8%A2%D9%86%DA%86%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%DB%8C%DA%A9-%D8%B3%D8%B1%DA%86-%D8%A8%D8%AF%D8%A7%D9%86%DB%8C%D8%AF-4-ksxa27rqych0





❤️💬

الاستیک سرچquotسبک زندگی
یک برنامه نویس (نه چندان) نویسنده؟ https://coffeete.ir/Azeiynali
شاید از این پست‌ها خوشتان بیاید