<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mostafa Ahmadi</title>
        <link>https://virgool.io/feed/@mostafaahmadi462</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 04:52:52</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/46712/avatar/ys33X5.png?height=120&amp;width=120</url>
            <title>Mostafa Ahmadi</title>
            <link>https://virgool.io/@mostafaahmadi462</link>
        </image>

                    <item>
                <title>الستیک سرچ: ابزار قدرتمند جستجو و تحلیل داده‌ها</title>
                <link>https://virgool.io/@mostafaahmadi462/%D8%A7%D9%84%D8%B3%D8%AA%DB%8C%DA%A9-%D8%B3%D8%B1%DA%86-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%82%D8%AF%D8%B1%D8%AA%D9%85%D9%86%D8%AF-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D9%88-%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-hultlpcbntdr</link>
                <description>من در این نوشته سعی کردم مقدماتی درباره‌ی ساختار الستیک سرچ داشته باشیم و سپس به نحوه‌ی کارکردن با آن بپردازیم و انواع کوئری‌هایی که بیشترین استفاده‌هارو دارن با هم ببینیم. معرفیالستیک سرچ یک موتور جستجوی توزیع‌شده و متن‌باز است که برای ذخیره‌سازی، جستجو و تحلیل داده‌ها با سرعت و دقت بالا طراحی شده. این ابزار بر پایه کتابخانه معروف لوسین ساخته شده و یکی از پرکاربردترین ابزارها برای کار با داده‌های بزرگ و متنوع به شمار می‌رود.کاربردهای الستیک سرچجستجوی متنی:اگر در وب‌سایت یا اپلیکیشن خود به جستجوی پیشرفته نیاز دارید، الستیک سرچ انتخابی مناسب است.تحلیل لاگ‌ها:برای جمع‌آوری و تحلیل لاگ‌های سیستم‌ها استفاده می‌شود. این قابلیت به شما کمک می‌کند مشکلات را سریع شناسایی و برطرف کنید.مانیتورینگ و تحلیل:با استفاده از ابزارهای جانبی مثل کیبانا و apm، می‌توانید عملکرد سیستم‌ها و سرورها را نظارت کنید.تحلیل داده‌های جغرافیایی:الستیک سرچ امکان کار با داده‌های جغرافیایی را فراهم می‌کند. این ویژگی برای تحلیل موقعیت مکانی یا مسیریابی بسیار کاربردی است.ویژگی‌های کلیدی الستیک سرچ۱. توزیع‌پذیری و مقیاس‌پذیری:‌الستیک سرچ طوری طراحی شده که در قالب یک کلاستر (خوشه) کار کند. کلاستر از چند نود (گره) تشکیل می‌شود و هر نود می‌تواند یک سرور مستقل باشد. داده‌ها در قالب شاردهایی تقسیم می‌شوند که این شاردها بین نودها توزیع می‌شوند. با افزودن نودهای جدید به کلاستر، ظرفیت سیستم افزایش پیدا می‌کند و عملکرد بهبود می‌یابد.۲. جستجوی سریع:‌یکی از نقاط قوت الستیک سرچ سرعت بالای آن در جستجوهای پیچیده است. به دلیل استفاده از تکنیک شاخص‌گذاری معکوس، چه داده‌های متنی، عددی یا ساختارنیافته، نتیجه را بسیار سریع دریافت خواهید کرد.۳. انعطاف‌پذیری در ذخیره‌سازی داده‌ها:‌انواع مختلف داده مثل متن، عدد، تاریخ، موقعیت جغرافیایی و حتی داده‌های باینری را می‌توانید در این ابزار ذخیره و مدیریت کنید.۴. ارتباط آسان با رابط‌های ساده:‌تمام عملیات الستیک سرچ از طریق درخواست‌های اینترنتی ساده (HTTP) قابل انجام است. این ویژگی کار با سیستم‌های دیگر را بسیار آسان می‌کند.۵. تحلیل داده‌ها:‌الستیک سرچ فقط برای جستجو طراحی نشده است؛ بلکه قابلیت انجام تحلیل‌های پیچیده را نیز دارد. مثلاً می‌توانید داده‌ها را گروه‌بندی کنید یا گزارش‌های دقیق و جزئی تهیه کنید.جستجو با الستیک سرچحالا بذار از اولش برات توضیح بدم که چطوری کار می‌کنه و داستانش چیه.ورود داده (Indexing)وقتی یه داده‌ای رو می‌خوایم وارد الستیک کنیم، این داده توی چیزی به اسم &quot;ایندکس&quot; ذخیره می‌شه. ایندکس رو می‌تونی یه جورایی مثل یه کشوی فایل در نظر بگیری که همه‌ی اطلاعات مربوط به یه موضوع خاص اونجا ذخیره شده.قبل از این که داده وارد بشه، یه فرآیند به اسم آنالیز (Analyze) روش انجام می‌شه.آنالیزر و فیلترهاآنالیزر، داده رو می‌گیره و خردش می‌کنه به تیکه‌های کوچیک‌تر که بهشون می‌گن توکن (Token). مثلاً جمله‌ی «من الستیک سرچ دوست دارم» رو می‌شکنه به این تیکه‌ها:من ـ‌ الستیک - سرچ - دوست - دارمبعد از این مرحله، فیلترها وارد بازی می‌شن. فیلترها می‌تونن کارای مختلفی انجام بدن، مثلاً:لوور کیس (Lowercase filter): همه‌ی کلمات رو کوچیک می‌کنه (مثل تبدیل &quot;Search&quot; به &quot;search&quot;).استاپ ورد (Stopword filter): یه سری کلمات بی‌اهمیت مثل &quot;و&quot;، &quot;از&quot;، &quot;به&quot;،&quot;the&quot;،&quot;in&quot; رو حذف می‌کنه.سنونیم (Synonym filter - Expansion): مترادف‌ها و کلمه های مرتبط رو اضافه می‌کنه، مثلاً &quot;ماشین&quot; و &quot;خودرو&quot; رو یکی در نظر می‌گیره.(البته نیاز به کانفیگ های دقیق تری داره)استیمینگ (Stemming) : کلمات مختلف با شکل‌های گرامری یا صرفی متفاوت (مثل زمان، جمع، شناسه‌ها) همگی به یه شکل ساده‌تر تبدیل بشن و در جستجوها به‌عنوان یکسان شناخته بشن. مثلا گفته‌ایم → گفت -  می‌گویم → گو - می‌روند → رو - رفته بود → رفتجستجو (Querying)وقتی کاربر یه چیزی سرچ می‌کنه، اون چیزی که سرچ کرده هم دقیقاً از همون مسیری که داده‌ها وارد شدن، رد می‌شه (یعنی آنالیز و فیلتر می‌شه). بعد الستیک میاد اون توکن‌ها رو با داده‌هایی که ذخیره کرده مقایسه می‌کنه و بر اساس یه سری الگوریتم رتبه‌بندی (مثل TF-IDF یا BM25) نتایج رو مرتب می‌کنه.جمع‌آوری نتیجه (Scoring and Results)اینجاست که نتایج پیدا شده یه امتیاز (Score) می‌گیرن. این امتیاز نشون می‌ده هر نتیجه چقدر به چیزی که کاربر سرچ کرده نزدیکه.در نهایت، الستیک سرچ یه لیست مرتب از نتایج رو برمی‌گردونه که می‌تونی به کاربر نشون بدی. مثلاً وقتی تو گوگل سرچ می‌کنی، نتایجی که اول می‌بینی امتیاز بالاتری گرفتن.ساختار و اجزای اصلیهر کلاستر یک نود اصلی یا مستر نود دارد که مسئول مدیریت شاردها و هماهنگی بین نودها است. سایر نودها می‌توانند به عنوان نودهای داده یا نودهای مخصوص تحلیل و پردازش استفاده شوند. این ساختار توزیع‌شده باعث می‌شود که حتی در صورت خرابی یک نود، داده‌ها از طریق نسخه‌های کپی (رپلیکا) قابل بازیابی باشند.مستر نود:‌مدیریت کلاستر، نظارت بر نودها، تخصیص شاردها و حفظ تعادل در کلاسترکوردینیت نود: دریافت درخواست های جستجو و ایندکس، توزیع درخواست ها بین نودها و جمع‌آوری نتایجدیتا نودها: ذخیره‌سازی داده‌ها، اجرای عملیات جستجو و تحلیل روی شاردها، نگهداری از شاردهای اصلی و رپلیکا شار‌د‌هاشاخص‌ها:داده‌ها در قالب شاخص‌ها ذخیره می‌شوند. هر شاخص برای یک موضوع خاص طراحی شده است.اسناد:هر داده به شکل یک سند ذخیره می‌شود که شامل فیلدها و مقادیر مرتبط است. معمولاً این اسناد در قالب JSON ذخیره می‌شوند.شاردها:برای مدیریت بهتر داده‌ها، هر شاخص به بخش‌های کوچکتری به نام شارد تقسیم می‌شود که می‌توانند روی سرورهای مختلف قرار گیرند.رپلیکا‌ها:برای افزایش پایداری و جلوگیری از از دست رفتن داده‌ها، از نسخه‌های کپی شاردها به نام رپلیکا استفاده می‌شود.انواع داده‌ها در الستیک‌سرچالستیک‌سرچ انواع مختلفی از داده‌ها را برای پشتیبانی از انواع مختلف اطلاعات ارائه می‌دهد:انواع داده‌های اصلینوع string منسوخ شده و با دو نوع مجزا جایگزین شده است: text، keywordمتن (Text): برای محتوای جستجوی کامل‌متن (رشته‌های تجزیه‌شده)کلمه کلیدی (Keyword): برای جستجوی تطبیق دقیق (رشته‌های بدون تجزیه)عددی (Numeric): شامل عدد صحیح، عدد بلند، شناور، دبلتاریخ (Date): زمان‌ها و تاریخ‌های تقویمیبولین (Boolean): مقادیر درست/نادرستباینری (Binary): مقادیر باینری رمزگذاری‌شده با Base64محدوده (Range): شامل integer_range، float_range، long_range، double_range، date_range، ip_rangeانواع داده‌های پیچیدهشیء (Object): برای اشیاء JSON تو در توتو در تو (Nested): برای آرایه‌های اشیایی که باید به‌طور مستقل جستجو شوندنقاط جغرافیایی Geo-point: برای جفت‌های عرض و طول جغرافیاییشکل جغرافیایی Geo-shape: برای اشکال جغرافیایی پیچیدهیا shape و point برای داده‌های لزوما غیر جغرافیاییانواع جستجوها در الستیک‌سرچالستیک‌سرچ انواع مختلفی از جستجوها را برای سناریوهای مختلف جستجو ارائه می‌دهد:جستجوهای کامل‌متنجستجوی تطبیق (Match Query): جستجوی استاندارد کامل‌متنجستجوی تطبیق عبارت (Match Phrase Query): جستجوی عبارت‌های دقیقجستجوی چندگانه (Multi-match Query): جستجو در چندین فیلدجستجوی رشته کوئری (Query String Query): پشتیبانی از نحو جستجوی پیچیدهجستجوی Regex (Regex Query): جستجو با استفاده از عبارت‌های منظم برای تطبیق الگوهای پیچیده در متنجستجوی wildcard (Wildcard Query): جستجو با استفاده از کاراکترهای wildcard (* برای چندین کاراکتر، ? برای یک کاراکتر)جستجوهای در سطح کلمه (Term Level Queries)جستجوی کلمه (Term Query): تطبیق دقیق یک کلمه خاصجستجوی چند کلمه (Terms Query): تطبیق چندین کلمهجستجو‌های محدوده‌ای و existsجستجوی محدوده (Range Query): پیدا کردن اعداد یا تاریخ‌ها در یک محدودهجستجوی وجود (Exists Query): پیدا کردن اسنادی که در آن‌ها یک فیلد وجود داشته باشدجستجوهای ترکیبی (Compound Queries)جستجوی بولین (Bool Query): ترکیب چندین جستجو با منطق بولیجستجوی Dis Max (Dis Max Query): بازگشت اسنادی که با هر جستجو مطابقت دارند و در عین حال نتیجه‌ای که بالاترین امتیاز را دارد، ترجیح داده می‌شودجستجوی امتیاز تابعی (Function Score Query): تغییر امتیازها با استفاده از توابعجستجوهای تخصصیجستجوهای جغرافیایی (Geo Queries): جستجو بر اساس موقعیت‌های جغرافیاییمشابه این (More Like This): پیدا کردن اسناد مشابهجستجوی اسکریپت (Script Query): جستجوهای سفارشی با استفاده از اسکریپت‌هاهر نوع جستجو هدف خاصی دارد و می‌توان آن‌ها را ترکیب کرد تا الگوهای جستجوی پیچیده‌ای ایجاد کنند که با استفاده‌های خاص هماهنگ باشد.مثال‌های از کوئری‌هابلاک کد تمیز پیدا نکردم تو ویرگول، باقیشو تو قسمت های بعدی میگم :/نسخه کامل تر و انگلیسی در نوشن https://ink-elephant-38e.notion.site/Elastic-Search-Introductio%E2%80%94175c14f6c49f8024ab2fd08351fc90de?pvs=4 </description>
                <category>Mostafa Ahmadi</category>
                <author>Mostafa Ahmadi</author>
                <pubDate>Fri, 17 Jan 2025 15:17:54 +0330</pubDate>
            </item>
                    <item>
                <title>اسپرینگ فریم ورک و تزریق وابستگی</title>
                <link>https://virgool.io/CodeLovers/%D8%A7%D8%B3%D9%BE%D8%B1%DB%8C%D9%86%DA%AF-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-%D9%88-%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C-vixishfykbss</link>
                <description>spring application contextظرفی است که اسپرینگ برای ایجاد و مدریت کامپوننت‌ها‌ی یک برنامه ارائه می‌دهد.این کامپوننت‌ها و bean ها درون این ظرف با متصل شدن به یک دیگر(وابستگی هایی که به یکدیگر دارند) یک اپلیکیشن کامل را تشکیل می دهند.این متصل شدن کامپونت ها یه یک دیگر براساس یک الگوی شناخته شده به نام dependency injection می‌باشد.در یک کامپونتت وقتی نیاز به یک کامپونتت دیگر داریم یا به اصطلاح یک کامپونتت به یک کامپونتت دیگر وابستگی دارد به جای اینکه شی‌ای از یک کامپونتت را درون کامپونتت دیگر بسازیم و نگهداری کنیم. از قانون تزریق وابستگی استفاده می کنیمبرای مثال وقتی کلاس A درون خود به یک شی از کلاس B نیاز دارد به جای اینکه یک شی از کلاس B را درون خود ایجاد کرده و استفاده کندمی توانیم به صورت زیر یک شی از کلاس B را به عنوان یکی از آرگومان های سازنده کلاس A پاس بدهیم.public class A{B b;public A(B b){this.b = b;}}ایده اصلی Dependency Injection این می باشد که اتصالات و وابستگی را بصورت جدا از هم ایجاد کند، بصورتی که کلاس مادر یا شی ایجاد شده به راحتی قابل آزمایش و اجرا باشد.اصولا مشکل زمانی پیش خواهد آمد که ما یک کلاس را ایجاد کرده باشیم و در آینده بخوایم در یک شی تغییراتی ایجاد کنیم، این تغییرات بسیار دشوار می باشد چرا که اگر از تزریق وابستگی استفاده نکرده باشیم باید تمام نونه های آن شی را تغییر دهیم.همانطور که در شکل زیر مشاهده می کنید . قبلا برای معرفی کردن این وابستگی ها به spring باید این ارتباط ها را در قالب یک فایل XML معرفی میکردیم. و در نسخه های اخیر spring می توانیم با ایجاد کلاس های پیکربندی بر اساس کد جاوا و علامت گذاری آن‌ها با انوتیشن @Configuration و معرفی کامپوننت ها و وابستگی آن‌ها با استفاده از انوتیشن @Bean به اسپرینگ.Automatic configurationپیکربندی خودکار شاخه در تکنیک هایی دارد که به اسم های component scanning و autowiring شناخته می‌شوند با component scanning  اسپرینگ به صورت خودکار کامپوننت ها را از classpath تشخیص داده و به عنوان یک bean در spring application  context قرار می‌دهد و با autowiring اسپرینگ یک کامپوننت را در صورت نیاز آن در یک کامپوننت دیگر به صورت خودکار inject یا به اصطلاح تزریق می‌کنداما!!!!!?در نسخه های اخیر اسپرینگ با معرفی spring boot پیکربندی خودکار چیزی فراتر از component scanning و autowiring رفته.اسپرینگ بوت خیلی از کارهای برنامه نویس ها رو کمتر و اسونتر میکنه به گونه ای که شما دیگر فایل های خاصی برای کانفیگ بین ها و کامپوننت ها نمی بینید (البته میتوانید از کانفیگ های مورد نظر در صورت علاقه?استفاده کنید )در بخش های بعدی به ادامه ی داستان میپردازیم موفق باشید❤️</description>
                <category>Mostafa Ahmadi</category>
                <author>Mostafa Ahmadi</author>
                <pubDate>Fri, 01 Jan 2021 13:43:05 +0330</pubDate>
            </item>
            </channel>
</rss>