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

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" در GoogleboostGET /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 درست برعکس آن است، و به معنای این است که هردو شرط برقرار نباشنداینم از این مقالهامیدوارم استفاده کنید❤️