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

Elasticsearch DATABASEتوی پست قبل ساخت ایندکس به صورت ساده رو بررسی کردیم، توی این پست میخوایم این کار رو به صورت حرفه ای تر یاد بگیریم و بعد از این که کمی در مورد data type ها در الاستیک صحبت کردیم، میخوایم ریختن توی یک Index رو با هم مورد بررسی قرار بدیم و بعدم از ایندکس حذف کنیم و سپس با هم چند تا کوئری ساده برای سرچ میزنیم.اول بریم یک ساخت ایندکس دیگه رو هم ببینیم:PUT detail-v01 { &quotmappings&quot: { &quotdate_detection&quot: false }, &quotsettings&quot: { &quotnumber_of_shards&quot: &quot1&quot, &quotnumber_of_replicas&quot: &quot0&quot } }توی این کد، ما یک دیتابیس detail-v01ایجاد میکنیم که date_detection آن را فالس قرار می دهیم، اما چرا؟الاستیک به صورت خودکار، اگر در نام یک فیلد کلمه date قرار دهیم، آن فیلد را به صورت data type date در نظر می گیرد، به همین دلیل در صورت ریختن چیزی که تاریخ نباشد، خطا می دهد، این کد جلوی این اتفاق را خواهد گرفت.managemant in Elasticsearchالاستیک سرچ، قابلیت کنترل چند سرور و قسمت قسمت کردن یک دیتابیس را به صورت خودکار دارد یعنی شما با کمی ور رفتن تنظیمات پیکربندی، می توانید پس از نصب الاستیک در چند سرور، الاستیک ها را به هم متصل کنید تا خودشان دیتابیس ها را بخش بخش(shard) کرده و از هر بخش پشتیبان(replicas) بگیرند.برای درک بهتر این تصویر را ببینید:مثالی از shards و replicas ها در الاستیکهر Node یک سرور است، Index1 (shard1, 2, 3) بخش های این ایندکس هستند، یعنی number_of_shardsاین ایندکس 3 تا است و سه بخش شده، همچنین برای هر بخش یک پشتیبان در نظر گرفته شده تا در صورت از دست رفتن یک سرور، مشکلی ایجاد نشود DataTypes in Elasticsearchدیتا تایپ های الاستیک خیلی زیاد هستند، از نقطه مکانی گرفته تا مربع و مثلت و دایره و شکل های دیگر برای تعیین مکان یک محل، اما ما اینجا مهمترین دیتا تایپ ها را مورد بررسی قرار می دهیمالاستیک آرایه (لیست) و مقدار واحد برایش تفاوتی ندارند، یعنی نوع داده ای به اسم array نداریم، وقتی شما یک فیلد را با نوع متن ذخیره می کنید، می توانید آرایه ای از متن تحویلش بدهیداولین نوع داده string است که جای بحث ندارد و همه میدانیم چیست.بعدش هم integer و boolean است که آن هم برای همه آشنا است و نیازی به توضیح بیشتر نیستقبل از این که keyword را تعریف کنم، باید یه توضیح کوچکی در مورد نحوه جستجو و کار الاستیک در مورد string بگم.تفاوت string و keyword چیست؟جستجوی الاستیک سرچ به صورت امتیازی است، یعنی هنگامی که متنی را در متنی دیگر جستجو میکنید، او اول متن را با space split(جدا) میکند و بر اساس دوری و نزدیکی هر کلمه و هزار الگوریتم دیگر، یک امتیاز به یافته ها میدهد و آن ها را مرتب میکند، برای جستجو 2 راه اصلی وجود دارد، یکی راه اول است(که متنی را در متنی دیگر جستجو میکنیم) و یکی راهی است که میتوانیم بگوییم آن داده ای در ایندکس که کل متن فیلد شهرش Tehran است را بده، در این حالت الاستیک ارور میدهد و میگوید نمیتوانم 2 استرینگ عین هم را جستجو کنم، پس اینجا بحث keyword پیش میاد، keyword ها دیتاتایپ هایی هستند که هنگام جستجو، الاستیک کل متن داخل یک فیلد keyword را یکی میبیند، حتی اگر چند کلمه باشد.دیتاتایپ بعدی float است که اعداد اعشاری 32 بیتی را در خود ذخیره میکند، برای اعداد 64 بیتی، باید از دیتا تایپ double استفاده کرد.همچنین Integer فقط از -2 به توان 23تا دو به توان 23 منهای 1را در خود ذخیره میکند، اما تایپ long عدد 64 بیتی از منفی 2 به توان 63 تا دو به توان 63 منهای 1 را در خود ذخیره میکندبعدی scaled_float ها هستند، آنها ترکیبی از تایپ long و double هستند و هر دو مقدار را در خود جای میدهند، در صورتی که عددتان اعشاری بودنش معلوم نیست و عدد بزرگی است، این نوع دیتاتایپ به دردتان میخورد.حالا چطور به Index مون Insert Data و Delete Data کنیم؟راحت ترین راه اینه:POST firstindex/_doc { &quotmessage&quot: &quotHello_world!&quot }در اینجا ما یک doc به firstindex اضافه کردیم و فیلد پیام را سلام دنیا! قرار دادیمبه هر دیتایی(row در SQL) که به دیتابیس insert می شود، doc میگوینددر اینجا response دارای یک id است، این آی دی doc ما است، برای دسترسی، جستجو و... در این doc به این آی دی نیاز داریم.همچنین میتوانیم آی دی doc را دستی تعریف کنیم:POST firstindex/_doc/es_1 { &quotmessage&quot: &quotHello_world!&quot }آی دی های الاستیک لزوما عددی نیستند و نیازی هم به افزودن es در اول آنها نیست.در صورتی که این آی دی وجود داشته باشد، محتوای قبلی آپدیت میشود، اما کامل حذف نمیشود، مثلا فیلد هایی که در این insert نبوده و در insert قبلی بوده اند سرجای خود میمانند، یا اگر در Insert قبلی یک array insert شده باشد محتوای جدید به درون array add میشود و....حالا چطور این محتوا و بعدم کل این ایندکس رو delete کنیم؟:DELETE firstindex/_doc/es_1 DELETE firstindexبه همین سادگی!و حالا سرچ...راحت ترین سرچی که میتونید بزنید:POST firstindex/_search{ &quotquery&quot: { &quotmatch_all&quot: {} } }این جستجو همان طور که از متنش پیدا است، تمامی doc ها را برمی گرداند.(البته این size دیفالت دارد که در مرحله بعد بهش میپردازیم)حالا یک query پیچیدهPOST firstindex/_search{ &quotsize&quot: 4, &quotfrom&quot: 4, &quot_source&quot: [ &quotusername&quot, &quotage&quot ], &quotquery&quot: { &quotmatch_all&quot: {} }}در این query گفته شده که 4 تا از تمامی داک ها از داک 4 ام به بعد را و فقط فیلد های username و age اش را برگردانمیخواستم اینجا پست رو تموم کنم ولی بذار اینم بهتون توضیح بدم:POST qanonindex-v03/_search { &quotsize&quot: 4, &quotfrom&quot: 4, &quot_source&quot: [&quotusername&quot, &quotage&quot], &quotquery&quot: { &quotbool&quot: { &quotmust&quot: [ { &quotterm&quot: { &quotusername&quot: &quotAli&quot } }, { &quotmatch&quot: { &quotage&quot: &quot23&quot } } ] } } }size و from که معلومه، اما bool و must و term و match چیه؟اول از همه bool ها برای برقرار کردن "و" یا "یا" استفاده میشوند.مثل && و || در jsیا and و or در pythonحالا must همان & یا | اش را مشخص میکند، ماست به معنای & است و یک آرایه است که تمامی شرط های موجود در آن باید صحیح باشد تا یک doc برگردانده شود.در این مثال همه ali ها با سن 23 برگردانده میشوند.match و term نیز برای جستجو هستند اما:تفاوت Match و Term چیست؟متچ برای بررسی بودن یک چیز در یک متن است(همون جستجوی معمولی خودمان با شامل شدن الگوریتم ها و...)اما term برای جستجوی دقیق است، یعنی از یک سری analyzer ها(که در جلسات بعد بهشان میرسیم) استفاده نمیکند و عین متن جستجو را در عین متن اصلی میگردد.البته استفاده شون در اینجا هیچ فرقی نداشت و فقط برای اینکه یاد بگیرید گفتم :) ❤️