This commit is contained in:
mustafa 2025-04-09 09:37:23 +03:30
commit 3be7c41c29
64 changed files with 63106 additions and 0 deletions

View File

@ -0,0 +1,359 @@
<div align="JUSTIFY" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>
## آنچه در این مطلب به دنبال آن هستیم:
* مزایای Elasticsearch
* تفاوتهای Elasticsearch با sql
* ضرورت روی آوری به Elasticsearch
برای درک ضرورت استفاده از دیتابیس الاستیک سرچ لازم است ابتدا آشنایی اجمالی با انواع دیتابیس ها داشته باشید
# مقایسه انواع سیستم مدیریت پایگاه داده
در این مقاله ما 9 سیستم مدیریت پایگاه داده را که معروف ترین ها هستند برای مقایسه انتخاب کرده ایم که عبارت اند از MySQL ،MariaDB ،Oracle ،PostgreSQL ،MSSQL ،MongoDB ،Redis ،Cassandra و Elasticsearch. با تمرکز بر روی مزایای مربوط به هر پروژه یک مورد از این دیتابیس ها برای استفاده بهترین است و ما این مزایا را بررسی خواهیم کرد.
هنگامی که در حال توسعه یک اپلیکیشن هستید یکی از اولین سوالات این است چگونه داده های خود را ذخیره کنید. سیستم مدیریت پایگاه داده(DBMS) نرم افزاری است که با پایگاه داده، برنامه ها و رابط کاربری برای بدست آوردن اطلاعات و تجزیه و تحلیل آن ها ارتباط برقرار می کند. همچنین DBMS شامل ابزارهای کاربردی برای کنترل پایگاه داده است.
باید این نکته را بدانید که پایگاه های داده تنها بخشی از نگهداری و مدیریت داده ها هستند. در مقالات بعدی بیشتر در مورد این موضوعات صحبت خواهیم کرد.
# دیتابیس های ارتباطی و غیر ارتباطی
به طور کلی دو مدل دیتابیس وجود دارد ارتباطی و غیر ارتباطی که همان سیستم های SQL و NO-SQL هستند. این سیستم ها از نظر بازیابی و توزیع و پردازش داده ها متفاوت هستند.
## دیتابیس ارتباطی
از آنجایی که زبان Query هسته اصلی این سیستم ها را تشکیل می دهد(Structured Query Language) به این نوع سیستم ها SQL نیز گفته می شود. در این مدل پایگاه داده ها، اطلاعات به صورت جداول در سطرها و ستون ها و با ساختاری دقیق و و وابستگی های واضح ذخیره می شوند.
باتوجه به ساختار یکپارچه و سیستم ذخیره داده ها، پایگاه های داده SQL برای نگهداری و محافظت نیازی به تلاش مهندسی ندارند. آنها انتخاب خوبی برای توسعه و پشتیبانی از راه حل های نرم افزاری پیچیده هستند، جایی که هرگونه تعامل پیامدهای مختلفی را بر عهده دارد. یکی از اصول اولیه SQL مطابقت با ACID است. (مثلا اگر در زمینه تجارت الکترونیک و برنامه های مالی را توسعه می دهید سازگاری با ACID یک گزینه ترجیحی است.)
با این حال موضوع مقیاس پذیری می تواند در ساختمان های داده SQL یک چالش باشد. مقیاس بندی پایگاه داده SQL بین سرورهای متعدد(مقیاس بندی افقی) به مهندسی بیشتری نیاز دارد. در عوض پایگاه های داده SQL معمولا به صورت عمودی، یعنی با افزودن قدرت محاسباتی بیشتر به سرور، مقیاس بندی می شوند. در این مقاله ما چندین پایگاه داده SQL را مورد بررسی قرار می دهیم:
* MySQL
* MariaDB
* Oracle
* PostgreSQL
* MSSQL
## دیتابیس غیرارتباطی
از آنجایی که این مدل ساختمان های داده محدود به ساختار جدول نیستند،‌ NoSQL نامیده می شوند. این نوع سیستم مدیریت پایگاه داده به صورت سندگرا در نظر گرفته می شود. داده های بدون ساختار مانند مقالات،‌ عکس ها،‌ فیلم ها و موارد دیگر در یک سند جمع آوری می شوند. جست و جو کردن در داده ها ساده است اما مانند یک پایگاه داده SQL همیشه در ردیف ها و ستون ها ذخیره نمی شوند.
پایگاه های داده NoSQL معمولا با افزودن سرورها به صورت افقی مقیاس بندی می شوند. از آنجایی که پایگاه داده های NoSQL امکان رزرو انواع مختلف داده ها را با یکدیگر و مقیاس بندی آنها با رشد در سرورهای متعدد فراهم می کند،‌ محبوبیت آنها روز به روز در حال افزایش است. NoSQL نیازی به آماده سازی قبل از استقرار ندارد و بروزرسانی سریع و بدون تاخیر در ساختار داده را آسان تر می کند.
در این مقاله ساختمان های داده NoSQL زیر را بررسی خواهیم کرد:
* MongoDB
* Redis
* Cassandra
* Elasticsearch
در ادامه نگاه عمیق تری به اینکه رایج ترین سیستم های پایگاه داده در SQL و NoSQL کدام هستند؟ و مزایا و معایت اصلی آنها چیست و چگونه باید در پروژه ها استفاده شوند؟ خواهیم داشت.
* مقایسه انواع سیستم مدیریت پایگاه داده
* مقایسه ساختمان های داده
* پایگاه داده MySQL
این نوع یکی از مشهورترین سیستم پایگاه داده ارتباطی است. MySQL در حال حاضر متعلق به شرکت اوراکل می باشد. امروزه MySQL پایه نرم افزار کاربردی LAMP می باشد. این نوع سیستم با توجه به ارتباطی که با زبان های C++/C دارد به خوبی با سیستم عامل های لینوکس، ویندوز و مک و بقیه سیستم عامل ها کار می کند. در ادامه مزایای MySQL را خواهیم دید.
## از جمله مزایای دیتابیس MySQL میتوان به موارد زیر اشاره کرد:
* نصب رایگان: نسخه MySQL Community برای دانلود رایگان است و همچنین مجموعه ای اساسی از ابزارها برای استفاده غیر تجاری به همراه دارد. این نسخه گزینه خوبی برای شروع است. البته نسخه های غیر رایگان دیگری مانند Enterprise یا Cluster با عملکرد غنی تر وجود دارد. به هر حال اگر پروژه شما توانایی پرداخت هزینه برای این ساختمان داده را ندارد می توانید از نسخه رایگان استفاده کنید.
* توسعه بسیار ساده: ساختار و سبک MySQL بسیار ساده است. حتی توسعه دهندگان این ساختمان داده را با زبانی شبیه زبان انسان می دانند. از آنجایی که این ساختمان داده همزمان با زبان برنامه نویسی مانند PHP استفاده می شوند و دارای منحنی یادگیری ملایم هست. نیازی به یک توسعه دهنده ماهر برای مدیریت پایگاه داده خود نخواهید داشت و همچنین استفاده از آن بسیار ساده است. به عنوان مثال اکثر دستورات را می توان در خط فرمان اجرا کرد و مراحل توسعه را کاهش داد.
* سازگاری با فضای ابری: MySQL از نظر ماهیت تجاری در اصل برای وب توسعه یافته است و توسط محبوب ترین ارايه دهندگان فضای ابری پشتیبانی می شود. در پلتفرم های برجسته ای مانند آمازون و مایکروسافت در دسترس است و این امر MySQL را جذاب می کند و همچنین به مشاغلی که از آن استفاده می کنند فضای زیادی برای رشد می دهد.
## همچنین این پایگاه داده برخی معایب نیز دارد که عبارتند از:
* چالش های مقیاس پذیری: پایگاه داده های MySQL مقیاس پذیری کمی دارند. در واقع اصلا برای مقیاس پذیری ساخته نشده اند. اگر چه شما می توانید این مدل پایگاه داده ها را مقیاس بندی کنید اما نسبت به بقیه پایگاه داده ها مشکلات بیشتری را به همراه خواهند داشت. بنابراین اگر پیش بینی می کنید روزی پروژه شما نیاز به پایگاه داده بزرگتری دارد بهتر است از همین ابتدا گزینه دیگری را انتخاب کنید.
* پیروی محدود از استاندارد های SQL: زبان SQL استانداردهای خاصی دارد. ساختمان داده MySQL به صورت کامل از این استانداردها پیروی نمی کند. یعنی MySQL هیچ پشتیبانی از برخی ویژگی های استاندارد SQL ارایه نمی دهد. از سوی دیگر حتی می توان گفت این پایگاه داده دارای برخی ویژگی های متمایز نسبت به زبان SQL است. این موضوع برای برنامه ها و پروژه های کوچک مشکلی ندارد اما اگر قرار به استفاده های بزرگ و توسعه داده ها باید ممکن است برای شما مشکل ساز شود.
* موارد استفاده: اگر داده های کمی برای پردازش دارید انتخاب پایگاه داده MySQL انتخاب خوبی برای شما خواهد بود. به عنوان مثال برای ساخت یک فروشگاه اینترنتی کوچک و محلی این پایگاه داده می تواند بسیار مفید باشد.
# دیتابیس MariaDB
این پایگاه داده یک شاخه منبع باز از پایگاه داده MySQL است که پشتیبانی تجاری دارد. این پایگاه داده تحت مجوز GNU فعالیت می کند و دارای دستورات، API ها و کتابخانه های مشابه MySQL است.
## از جمله مزایای دیتابیس MariaDB میتوان به موارد زیر اشاره کرد:
* رمزنگاری قوی: اوپن سورس بودن به معنای ناامن بودن نیست. این پایگاه داده علاوه بر امنیت داخلی و بررسی رمز عبور،‌ ویژگی هایی مانند احراز هویت PAM، Kerberos و LDAP و نقش های کاربری را ارایه می دهد. این پایگاه داده یک لایه محافظ رمزنگاری شده قوی برای داده ها ایجاد می کند. علاوه بر همه این ها این پایگاه داده بروزرسانی های امنیتی زیادی منتشر می کند.
* عملکرد بالا: اگر چه MariaDB از موتور MySQL استفاده می کند اما از نظر عملکرد بسیار پیشرفت کرده است. ویژگی های بهینه سازی گسترده، مدیریت Thread pool و پردازش داده ها را بهبود می بخشد. بنابراین هنگامی که جداول از سیستم مدیریت داده ها حذف می شوند سیستم عامل بلافاصله به فضای آزاد دسترسی پیدا می کند و شکاف ها را پر می کند. علاوه بر آن سیستم مدیریت پایگاه داده آمار جدول را با استفاده از موتور خود در دسترس شما قرار می دهد و با کمک این ویژگی جست و جو در میان داده ها ساده خواهد شد و بهینه سازی داده ها نیز راحتتر می شود.
جامعه توسعه دهندگان این سیستم مدیریت پایگاه داده هنوز در حال گسترش است. از آنجایی که از زمان تاسیس و ساخت این سیستم زمان زیادی نمیگذرد تعداد متخصصان آن کمتر از بقیه سیستم
های مدیریت پایگاه داده می باشد.
## از جمله معایب آن می تواند موارد زیر باشد:
* اختلاف زیاد با MySQL: اگرچه تیم MariaDB سعی می کند به صورت مداوم خود را به طور مداوم با کدهای پایگاه داده MySQL هماهنگ کند اما هنوز هم اختلافات و شکاف های زیادی بین این دو سیستم مدیریت پایگاه داده وجود دارد. این موضوع باعث ایجاد مشکلاتی هنگام مهاجرت از MariaDB به MySQL می شود.
* موارد استفاده: از آنجایی که این سیستم مدیریت داده ها مانند MySQL است می توان از آن برای کار با برنامه های مبتنی بر وب استفاده کرد. علاوه بر این ها ذخیره سازی و بهینه سازی داده ها و مقیاس پذیری بهبود یافته است.
# ضرورت استفاده از الاستیک سرچ:
به طور خلاصه آنچه که از معایب دیتابیس های ارتباطی گفته شده در حقیقت همان علت و ضرورت استفاده از دیتابیس های غیر ارتباطی نظیر الاستیک سرچ است.
در ادامه با این نوع دیتابیس بیشتر آشنا خواهید شد.
# مقایسه‌ی دیتابیس‌های SQL با NoSQL
تا این‌جا با دیتابیس‌های رابطه‌ای آشنا شدیم. پیش از مقایسه‌ی این نوع دیتابیس‌ها با دیتابیس‌های NoSQL به بررسی مفهوم دیتابیس‌های NoSQL خواهیم پرداخت.
دیتابیس‌های NoSQL
این نوع دیتابیس‌ها همان‌طور که از نام‌شان پیداست به مفهوم دیتابیس‌های غیر SQL یا غیر رابطه‌ای اشاره می‌کنند؛ یعنی داده‌ها را با فرمتی غیر از فرمت دیتابیس‌های رابطه‌ای ذخیره می‌کنند. اما منظور از این فرمت‌ها چیست؟
<p align="center">
<img src="img/nosql1.png" />
NoSQL
</p>
همان‌طور که در تصویر مشاهده می‌کنید، دیتابیس‌های NoSQL به چهار دسته‌ی کلی زیر تقسیم‌بندی می‌شوند:
* دیتابیس‌های کلید و مقدار (Key-Value)
* دیتابیس‌های ستونی (Column-Oriented)
* دیتابیس‌های سندی (Document)
* دیتابیس‌های گرافی (Graph)
دیتابیس‌های کلید و مقدار
ایده‌ی اصلی این نوع دیتابیس‌ها، جدول‌های هش (Hash Tables) هستند که یک کلید منحصر‌به‌فرد را به یک مقدار وصل می‌کنند. از معروف‌ترین این نوع دیتابیس‌ها می‌توان Redis را نام برد. برای درک بهتر این نوع دیتابیس، به مثال زیر دقت کنید:
<p align="center">
<img src="img/nosql2.png" />
</p>
در مثال بالا، کلید id است و مقدار 123.
دیتابیس‌های سندی
این دیتابیس‌ها را می‌توان نسل بعدی دیتابیس‌های کلید و مقدار دانست. این دیتابیس‌ها اجازه می‌دهند تا مقدار تو‌در‌تو برای هر کلید دلخواه قرار گیرد. در این دیتابیس‌ها، داده‌ها در فرمتی ساختاریافته (مانند JSON یا XML) ذخیره می‌شوند. برای درک بهتر این قضیه، به مثال زیر توجه کنید:
<p align="center">
<img src="img/nosql3.png" />
JSON
<br>
</p>
مثالی که مشاهده کردید، یک سند در این‌گونه دیتابیس‌ها است.
از معروف‌ترین دیتابیس‌های سندی، می‌توان MongoDbوElasticsearch را نام برد.
دیتابیس‌های ستونی
این نوع دیتابیس‌ها همان‌طور که از نام‌شان مشخص است، به‌جای نگه‌داری داده‌ها در سطر، این‌کار را در ستون‌ها انجام می‌دهند، برای درک بهتر این قضیه به مثال زیر توجه کنید:
<p align="center">
<img src="img/nosql4.png" />
</p>
جدول بالا، جدولی در یک دیتابیس رابطه‌ای است. جداول مبتنی بر ردیف هستند. همین جدول در دیتابیس‌های مبتنی بر ستون به‌صورت زیر است. در دیتابیس‌های ستونی، جداول دارای فضایی تحت عنوان keyspace هستند. در keyspace ، تمامی داده‌ها به شکل ستون‌های مختلف ذخیره می‌شوند که با column family ها از یکدیگر جدا می‌شوند. شکل زیر، مثالی از یک column family است:
<p align="center">
<img src="img/nosql5.png" />
<br>
column
<br>
</p>
همان‌طور که در تصویر بالا مشاهده می‌کنید، یک column family به نام users وجود دارد که در آن ردیف‌هایی شامل داده‌ها در ستون‌های مجزا قابل دسترسی هستند. در این حالت، abolfazl و nima اصطلاحاً کلید ردیف‌ها هستند و باید منحصر‌به‌فرد باشند. مقدار favorite برای nima تعریف نشده است. این یکی از خواص دیتابیس‌های ستونی است.
از معروف‌ترین این نوع دیتابیس‌ها می‌توان Cassandra را نام برد.
دیتابیس‌های گرافی
این دیتابیس‌ها با مفهوم گراف‌ها شکل گرفته‌اند و به‌جای جداول، داده‌ها را در قالب گراف ذخیره می‌کنند. شکل زیر، نمایی را از این نوع دیتابیس‌ها نمایش می‌دهد:
<p align="center">
<img src="img/nosql6.png" />
<br>
دیتابیس گرافی
<br>
</p>
از معروف‌ترین این نوع دیتابیس‌ها می‌توان Neo4j را نام برد.
تفاوت دیتابیس‌های SQL و NoSQL
از مهم‌ترین تفاوت‌های دیتابیس‌های SQL با NoSQL می‌توان به نیازمندی دیتابیس‌های SQL به یک ساختار مشخص برای نگه‌داری داده‌ها اشاره کرد. این نیاز در دیتابیس‌های NoSQL وجود ندارد. هم‌چنین دیتابیس‌های SQL فقط مبتنی بر جداول هستند، اما دیتابیس‌های NoSQL انواع مختلفی از نظر نحوه‌ی ذخیره‌سازی داده‌ها دارند.
دیتابیس‌های SQL و NoSQL تفاوت‌های بیشتری نیز دارند که در فصل‌های بعدی به آن‌ها می‌پردازیم. انتخاب دیتابیس متناسب با نیاز شما، مهارت و تجربه‌ی کافی در کار با دیتابیس‌های مختلف را می‌طلبد.
<p align="center">
<img src="img/what-is-elasticsearch-1.jpg" />
</p>
# هر آنچه باید درباره الاستیک سرچ بدانید
همانطور که قبلاً هم در این سایت توضیح داده ام، الاستیک سرچ یکی از بهترین بانکهای اطلاعاتی سندمحور (منظور از سند، داده‌ای است که به شکل جی‌سان نمایش داده می‌شود) و همچنین جزء بهترین کتابخانه های جستجوی متن است که بر پایه کتابخانه معروف لوسین بنا شده است و علاوه بر سرعت بسیار بالا در پاسخگویی به انواع پرس و جوهای موردنیاز، توزیع شوندگی راحت در شبکه و سهولت بسیار زیاد در ورود داده، امروزه با افزودن داشبورد مدیریتی کیبانا و امکانات یادگیری ماشین و نیز ماژول هایی مانند LogStash و HeartBeat که به جمع آوری اطلاعات و لاگ ها از سرورهای مختلف می پردازد به یک گزینه بسیار ایده آل برای ذخیره و پردازش و مانیتورینگ داده های در جریان سیستم های عملیاتی معاصر تبدیل شده است.
اگر به لیست بانکهای اطلاعاتی برتر دنیا هم در سایت [db-engines](https://db-engines.com/en/ranking) نگاهی بیندازید، این بانک را جزء ده بانک اطلاعاتی مطرح امروزین خواهید یافت.
<p align="center">
<img src="img/db-engines.png" />
</p>
الاستیک سرچ چیست و چه کاربردی دارد؟ چرا باید از Elasticsearch استفاده کنیم؟ در این مطلب از بلاگ ابر زس به این سوال پاسخ می‌دهیم و به مزایا و معایب الاستیک سرچ اشاره می‌کنیم.
با رشد و توسعه دنیا فناوری، هر روز حجم زیادی از داده‌ها تولید می‌شوند. انواع این داده‌ها به صورت متنی، عددی، ساختاری و یا بدون ساختار هستند. افراد برای درک این اطلاعات به ابزارهای تحلیلی نیار دارند، اینجاست که الاستیک سرچ وارد می‌شود.
## Elasticsearch چیست؟
الاستیک سرچ یک موتور جست‌وجو، تحلیل‌گر دیتابیس، یک نوع ابزار ایندکس و راهکاری برای مدیریت کلان‌داده است که سرعت بلایی دارد و مقیاس‌پذیر است. بسته به این‌که تا چه میزان با این تکنولوژی آشنایی داشته باشید، این تعاریف می‌تواند شما را با Elasticsearch آشناتر کند یا حتی از نظرتان گیج‌کننده باشد. اما شاید برایتان سوال باشد که به زبان ساده‌تر، الاستیک سرچ چیست؟
Elasticsearch یک سیستم جستجو و تجزیه‌وتحلیل منبع‌باز بوده که روی آپاچی لوسن طراحی شده است. این سیستم جستجو در جاوا توسعه‌یافته و از زبان‌های مختلف ازجمله PHP ،Python ،C و Ruby پشتیبانی می‌کند. به همین دلیل روی سیستم‌عامل‌های مختلف اجرا می‌شود و می‌تواند حجم زیادی از داده‌ها را در کوتاه‌ترین زمان ممکن جستجو و تجزیه و تحلیل کند.
الاستیک سرچ از ساختاری مبتنی بر اسناد به‌جای جداول و الگوها استفاده می‌کند و دارای API REST گسترده‌ای برای ذخیره و جستجوی داده‌ها است. می‌توانید الاستیک سرچ را به‌عنوان سروری در نظر بگیرید که قادر است درخواست‌های JSON را پردازش کند و داده‌های JSON را به شما برگرداند.
# Elasticsearch چگونه کار می‌کند؟
در این قسمت از مقاله الاستیک سرچ چیست می‎‌خواهیم به بررسی نحوه عملکرد آن بپردازیم. الاستیک سرچ داده‌ها را در اسناد (documents) سازمان‌دهی می‌کند. اسناد، شامل داده‌هایی تحت فرمت JSON هستند و تحت فایل‌های JSON، موجودیت‌ها (entities) نگهداری می‌شوند. اسناد، بر اساس مشخصات‌شان به صورت فهرست‌هایی (indices) دسته‌بندی می‌شوند. الاستیک سرچ برای جستجوی کارآمد، از شاخص‌های معکوس استفاده می‌کند که ساختارهایی از داده هستند که مکان کلمات در هر سند را مشخص می‌کنند.
<p align="center">
<img src="img/what-is-elasticsearch-2.jpg" />
</p>
# الاستیک سرچ چیست؟
معماری توزیع‌شده الاستیک سرچ، این ابزار را قادر می‌سازد که جستجو‌ها را سریع انجام دهد و برای تحلیل حجم عظیمی از داده‌ها، کارایی بالا و تقریبا بلادرنگی داشته باشد. الاستیک سرچ علاوه بر این که امکان رپلیکیشن (ایجاد کپی‌هایی از داده‌ها برای اطمینان بالاتر) را فراهم می‌کند به صورت مقیاس‌پذیری طراحی شده است. به این ترتیب با افزایش بار کاری، می‌توان میزان منابع سرورها را افزایش داد. برای این‌که بهتر درک کنیم که Elasticsearch چیست، در ادامه به مفاهیم اساسی آن می‌پردازیم.
# درک مفاهیم اساسی Elasticsearch
در این بخش از مقاله Elasticsearch چیست، بیایید نگاهی به مفاهیم اساسی داشته باشیم تا بیشتر با معماری آن آشنا شویم.
## JVM
همان‌طور که در قسمت الاستیک سرچ چیست توضیح دادیم، این سیستم جست‌وجو به زبان جاوا نوشته شده است و از ماشین مجازی جاوا (JVM) استفاده می‌کند. JVM یک موتور اجرا است که بایت کد را در بسیاری از پلتفرم‌های سیستم‌عامل اجرا می‌کند.
## اسناد
سند، واحد اصلی و اساسی موجودیت اطلاعات در الاستیک سرچ است و در قالب JSON (مخفف JavaScript Object Notation) نمایش داده می‌شود. اسناد را می‌توان ذخیره و ایندکس کرد. یک ایندکس دارای یک یا چند سند و یک سند دارای یک یا چند فیلد است. جستجو فقط در بین فیلدهای ایندکس شده امکان‌پذیر است و بازیابی محتوای اصلی فیلد فقط در فیلدهایی که به‌عنوان stored در Mapping تعریف شده‌اند امکان‌پذیر است.
## فهرست (Indice)
Indice یا شاخص‌ها، به مفهوم فهرست یا ایندکس‌ها هستند. ایندکس به مجموعه‌ای از اسناد گفته می‌شود که دارای ساختار و ویژگی مشابهی هستند و برای ذخیره و خواندن اسناد از آن استفاده می‌شود. در واقع ایندکس معادل یک پایگاه‌داده در RDBMS (سیستم مدیریت پایگاه‌داده رابطه‌ای) است. هر Index با یک نام منحصربه‌فرد شناسایی می‌شود که تمامی حروف آن کوچک است و زمانی که عمل جستجو، به‌روزرسانی یا حذف را انجام می‌دهید از آن استفاده می‌کنید.
استفاده از ایندکس معکوس بسیار شبیه جستجوی صفحه کتابی است که حاوی یک کلمه کلیدی خاص است و به‌جای اسکن صفحات از ابتدا تا انتها، باید فهرست کلمات کلیدی درج شده در انتهای کتاب را اسکن کنید. این ایندکس معکوس، Elasticsearch را قادر می‌سازد تا داده‌ها را به‌سرعت و کارآمد بازیابی کند.
## شارد (Shard)
شارد در الاستیک سرچ چیست و چه کاربردی دارد؟ shard کوچک‌ترین موجودیت در الاستیک سرچ است. Elasticsearch قابلیتی را فراهم می‌کند که با کمک آن ایندکس‌ها به اجزای کوچک‌تری به نام شارد تقسیم می‌شوند. هر شارد یک ایندکس مستقل و با کارایی کامل است که می‌تواند در هر نود داخل هر کلاستر، میزبانی شود. در الاستیک سرچ دو نوع shard وجود دارد:
* primary shards: شاردهای واقعی که داده‌ها را نگه می‌دارند.
* replica shards: از شاردهای اصلی کپی شده‌اند.
## گره (Node)
گره یک سرور است که جزئی از یک کلاستر محسوب می‌شود. یک نود، داده‌ها را ذخیره کرده و در فرایند فهرست‌بندی و جستجوی کلاستر مشارکت می‌کند.
نودهای الاستیک سرچ می‌توانند به ۳ روش مختلف پیکربندی شوند:
* نود مَستر: که کلاستر الاستیک سرچ را کنترل می‌کند و مسئولیت تمامی قابلیت‌های کلاستر از جمله ایجاد یا حذف یک ایندکس و نیز افزودن یا حذف نودها را به عهده دارد.
* نود دیتا: داده‌ها را نگهداری کرده و عملیاتی مرتبط با داده از جمله جستجو و ترکیب آنها را انجام می‌دهد.
* نود کلاینت: درخواست‌های کلاستر را به سمت نود مستر ارسال می‌کند و علاوه بر این درخواست‌های مرتبط با دیتا را به نودهای دیتا می‌فرستد.
## خوشه یا کلاستر (Cluster)
یک کلاستر از یک یا چند گره تشکیل می‌شود که به هم متصل شده‌اند. قابلیت‌هایی که به یک کلاستر Elasticsearch قدرت می‌بخشند، شامل توزیع تسک‌ها، جستجو و ایندکس شدن در تمامی نودهای یک کلاستر هستند.
## رپلیکا (Replica)
سوالی که ممکن است برای خیلی از کاربران ایجاد شود این است که رپلیکا در الاستیک سرچ چیست؟ رپلیکا مکانیسمی است که Elasticsearch برای رسیدگی به خرابی‌هایی مانند آفلاین شدن گره بدون ازدست‌دادن داده‌ها استفاده می‌کند. علاوه بر این، رپلیکا‌ها کمک می‌کنند ظرفیت سرویس‌دهی برای جستجو یا بازیابی یک سند، افزایش یابد.
به زبان ساده‌تر باید این‌گونه توضیح داد که هر سند در هر ایندکس،‌ متعلق به یک شارد اصلی است. رپلیکا، یک کپی از شارد اصلی محسوب می‌شود که می‌تواند مشابه شارد اصلی برای جستجو مورد استفاده قرار گیرد یا هنگامی که شارد اصلی با مشکل مواجه شد، جای آن را بگیرد.
## بخش‌‌ها (Segments)
مفهوم سگمنت در Elasticsearch یک مفهوم در سطح لوسن است که نشان‌دهنده تکه‌های یک شارد هستند. هر ایندکس لوسن حاوی یک یا چند Segments است. الاستیک سرچ گزینه‌هایی را برای مدیریت اندازه‌های سگمنت و نحوه پیکربندی ارائه می‌کند که بر عملکرد ایندکس سازی تأثیر خواهد گذاشت.
مزایای الاستیک سرچ چیست؟
اکنون که با این موضوع آشنا شدیم که الاستیک سرچ چیست، در این بخش به بررسی مزایا و اهمیت استفاده از آن می‌پردازیم. در مقایسه با بیشتر پایگاه‌های داده NoSQL، این فناوری بیشتر روی قابلیت‌های جستجو تمرکز دارد و مجهز به یک API قدرتمند HTTP RESTful است. این قابلیت به شما کمک می‌کند تا حجم زیادی از داده‌ها را در زمان کوتاهی جستجو و آنالیز کنید. مهم‌ترین مزایای استفاده از الاستیک سرچ عبارت‌اند از:
## عملکرد بالا
ماهیت توزیع‌شده Elasticsearch آن را قادر می‌سازد تا حجم زیادی از داده‌ها را به‌صورت موازی پردازش کند و به‌سرعت بهترین پاسخ را برای درخواست‌های شما پیدا کند. در واقع الاستیک سرچ داده‌ها را به‌صورت همزمان با Shard و Replica در چندین نود یا گره پردازش می‌کند. این امر باعث افزایش عملکرد و بازیابی اطلاعات می‌شود. همچنین پردازش موازی نودها به استفاده موثر از حافظه کمک می‌کند.
## موتور جستجوی متن کامل
سیستم‌های مدیریت پایگاه‌داده SQL سنتی، برای جستجوی متن کامل در بین حجم زیادی از داده‌ها طراحی نشده‌اند. ازآنجایی‌که Elasticsearch روی Lucene ساخته شده است، یکی از قدرتمندترین قابلیت‌های جستجوی متن کامل را ارائه می‌دهد و با استفاده از آن می‌توانید انواع جستجوها از ساختاریافته تا بدون ساختار و از جغرافیایی تا متریک را انجام دهید و ترکیب کنید.
## ابزارها و پلاگین‌ها
الاستیک سرچ با کیبانا به یک ابزار تجسم و گزارش محبوب و یکپارچه تبدیل شده‌اند. همچنین ادغام با Beats و Logstash را ارائه می‌دهد و به شما کمک می‌کند تا داده‌های منبع را به‌راحتی تبدیل کرده و آن‌ها را در کلاستر Elasticsearch خود بارگذاری کنید.
## عملیات نزدیک به ریل تایم
عملیات خواندن یا نوشتن داده‌ها در Elasticsearch، معمولاً کمتر از یک ثانیه طول می‌کشد. این امر به شما امکان می‌دهد از این سیستم جستجو برای مواردی مانند نظارت بر برنامه و تشخیص ناهنجاری استفاده کنید.
## مقیاس‌پذیری
از ویژگی‌های مهم الاستیک سرچ، مقیاس‌پذیری است. معماری Elasticsearch این امکان را فراهم می‌کند تا با افزایش حجم داده‌ها، همچنان عملکرد با کیفیت خود را حفظ کند. الاستیک سرچ همچنین می‌تواند داده‌ها را به طور خودکار تکرار کند تا در صورت خرابی گره، از نابود شدن آنها جلوگیری کند.
## سازگار با بسیاری از زبان‌ها
الاستیک سرچ دارای کتابخانه برای بسیاری از زبان‌های برنامه‌نویسی مانند جاوا، جاوا اسکریپت، PHP، روبی، پایتون، #C و… است. دردسترس‌بودن این کتابخانه‌ها، ادغام با Elasticsearch را برای برنامه‌نویسان بسیار آسان می‌کند.
## جامعه کاربران گسترده
در انجمن کاربران می‌توانید تقریبا برای هر سوال خود، پاسخی پیدا کنید یا حتی سوالات جدید خود را بپرسید تا یک کاربر مشتاق، پاسخی به شما دهد.
## استفاده از API
یکی از دلایل اصلی افزایش محبوبیت الاستیک سرچ، API آن است که با اسناد آموزشی متعددی نیز همراه شده‌ است. دردسترس‌بودن API، این امکان را برای توسعه‌دهندگان فراهم می‌کند تا با آن یکپارچه شوند. تقریباً هر ارسال‌کننده گزارش یا کتابخانه ثبت گزارش، دارای ابزارهایی برای ارسال داده به Elasticsearch است. علاوه بر ابزارهای مختلفی که می‌توانند داده‌ها را از طریق API به الاستیک سرچ وارد کنند، ابزارهایی مانند کیبانا و گرافانا نیز وجود دارند که هدف آنها کاوش، تجزیه‌وتحلیل و نمایش داده‌های این موتور جست‌وجو است.
# معایب الاستیک سرچ چیست؟
الاستیک سرچ علاوه بر مزایایی که ارائه می‌دهد، معایبی نیز دارد که در ادامه به برخی از مهم‌ترین آنها اشاره می‌کنیم:
## نیاز به منابع بالا
برای استفاده و بهره‌وری کامل از الاستیک سرچ به سرورهایی با حافظه رم ۶۴ گیگابایت نیاز دارید. در غیر این صورت با مشکلات احتمالی روبرو خواهید شد. از طرف دیگر، سرعت انجام درخواست‌ها در SDD نسبت به هارددیسک بیشتر است. از آنجایی که هزینه SDD بالاتر است، در نتیجه برای ایجاد این زیرساخت باید هزینه بیشتر را در نظر بگیرید.
## مشکل split-brain
از دیگر معایب الاستیک سرچ مشکل split-brain است. این مشکل زمانی به وجود می‌آید که سرورها بدون مشکل، مشغول به کار هستند اما ارتباط بین آنها قطع می‌شود. در نتیجه هر کدام از آنها خود را تنها در یک کلاستر می‌بینند و خود را به عنوان مَستر انتخاب می‌کنند. در چنین شرایطی، کلاستر با دو مستر روبرو می‌شود.
## مشکل چندزبانی
برای مدیریت درخواست‌ها و پاسخ‌ها، Elasticsearch تنها از فرمت JSON استفاده می‌کند، در حالیکه سیستم‌های دیگر از فرمت‌هایی مانند CSV و XML نیز پشتیبانی می‌کنند.
## فرایند یادگیری پیچیده
الاستیک سرچ قابلیت‌های متنوعی را ارائه می‌کند اما مکانیزم کوئری پیچیده‌ای دارد؛ به ویژه اگر با مفاهیم دیتابیس یا SQL آشنایی نداشته باشید.
## رایگان نبودن
الاستیک سرچ از سال ۲۰۲۱ به بعد دیگر رایگان نیست اما می‌توان پلن‌های مختلف آن را برای مدت محدود به صورت رایگان آزمایش کرد.
موارد استفاده از Elasticsearch چیست؟
به‌عنوان یک سیستم جستجو Elasticsearch بسیار مقیاس‌پذیر است و قابلیت‌های جستجو در لحظه را ارائه می‌دهد. الاستیک سرچ به دلیل ماهیت همه‌کاره آن در مدیریت داده‌ها و جفت‌شدن با ابزارهای دیگر محبوب است. شرکت‌هایی مانند ویکی‌پدیا،‌ نیویورک‌تایمز،‌ گیت‌هاب، نت‌فلیکس، والمارت، ای‌بِی و فیسبوک همگی از این موتور جست‌‌وجو برای موارد مختلف استفاده می‌کنند.
# مهم‌ترین کاربردهای الاستیک سرچ
در ادامه به برخی از مهم‌ترین کاربردهای الاستیک سرچ اشاره شده است:
## جستجوی اپلیکیشن
برای اپلیکیشن‌هایی که به شدت به سرچ‌ها و گزارش های سنگین وابسته هستند، الاستیک سرچ از گزینه‌های مناسب است.
## جستجوی وب‌سایت
وب‌سایت‌هایی که حاوی محتوای زیادی هستند می‌توانند از این ابزار برای جستجوهای دقیق و کارآمد استفاده کنند.
## جستجوهای سازمانی
Elasticsearch در سازمان‌ها می‌تواند برای جستجوی اسناد، محصولات مبتنی بر تجارت الکترونیک، جستجوی بلاگ، افراد و … کاربرد داشته باشد.
## ثبت و تحلیل لاگ‌ها
یکی از مرسوم‌ترین کاربردهای این ابزار، تحلیل لاگ‌ها تقریبا به صورت بلادرنگ است که می‌تواند بینش‌های عملیاتی مهمی را در مورد گزارش‌ها ارائه کند.
## مانیتورینگ کانتینر و متریک‌های زیرساختی
بسیاری از سازمان‌ها از استک ELK برای تحلیل متریک‌های متنوع از جمله پارامترهای مربوط به کارایی تجهیزات سرورها و نیز سرویس‌های مبتنی بر کانتینر بهره می‌برند.
## تحلیل‌های امنیتی
لاگ‌های دسترسی و سایر رویدادهایی که نگرانی‌های امنیتی در مورد آنها مطرح است می‌توانند به کمک استک ELK به صورت بلادرنگ و در لحظه، تحلیل شوند.
## تحلیل‌های تجاری
بسیاری از قابلیت‌هایی که با استک ELK همراه شده‌اند، ابزارهایی عالی برای تحلیل سازمان‌ها محسوب می‌شوند.
به این نکته توجه داشته باشید که الاستیک سرچ می‌تواند هم روی سرور اختصاصی و هم روی سرور ابری اجرا شود.
# سخن پایانی
در این مقاله، به این موضوع پرداختیم که الاستیک سرچ چیست، چگونه کار می‌کند و چه مزایا، معایب و کاربردهایی دارد. به طور خلاصه Elasticsearch یک موتور جستجوی بسیار سریع و مقیاس‌پذیر است و در قلب اکوسیستم آن ابزارهای قرار دارد که با هم می‌توانند برای مواردی از جمله جستجو، تجزیه‌وتحلیل و پردازش داده‌ها مورداستفاده قرار گیرند.
<p align="center" dir="rtl">صلوات</p>
</div>

View File

@ -0,0 +1,76 @@
<div align="right" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>
# دانلود و راه اندازی سرور الاستیک سرچ و کیبانا
قبل از هر چیز باید الاستیک سرچ و کیبانا را به صورت جداگانه دانلود کرده، آنها را از حالت زیپ خارج و با تنظیمات پیش فرض اجرا کنید.
[الاستیک سرچ](https://www.elastic.co/downloads/elasticsearch)
[کیبانا](https://www.elastic.co/downloads/kibana)
قبل از هر چیز، مطمئن شوید که نسخه ۸ (نسخه ۸ الاستیک نیاز به نسخه ۱۱ به بعد جاوا دارد) جاوا روی سیستمتان نصب و متغیر محیطی JAVA_HOME در ویندوز هم تنظیم شده است. برای نصب جاوا به [این آدرس](https://soft98.ir/software/692-sun-java-se-runtime-environment.html) و برای تنظیم متغیر محیطی فوق به [این مقاله](https://hitos.ir/190/environment-variables)، مراجعه کنید.
دو فایل دانلود شده فوق را از حالت زیپ درآورید . سپس با ورود به پوشه اصلی الاستیک سرچ، پوشه bin را باز کرده، بر روی elasticsearch.bat کلیک کنید (فایل دوم ).
اگر مشکلی رخ ندهد که معمولاً اگر رم کمی داشته باشید ممکن است، اجرای الاستیک با مشکل مواجه شود، تصویر زیر را خواهید دید (اگر پنجره ای باز شود و از شما سوال کرد که به این فایل اجازه دسترسی به شبکه را بدهد گزینه Allow را انتخاب کنید) :
<p align="center">
<img src="img/install/1.png" />
<br>
صفحه شروع به کار الاستیک سرچ
<br>
</p>
بهتر است ابتدا خط فرمان ویندوز (Command Prompt) را باز کرده ، به پوشه bin در الاستیک رفته و با تایپ elasticsearch.bat و زدن اینتر، الاستیک را اجرا کنید تا اگر خطایی پیش آمد، بتوانید با بررسی آن و جستجو در گوگل ، مشکل خود را حل کنید.
#### "توجه"
در پوشه confing و در فایل elasticsearch.yml یک سری تنظیمات به صورت پیشفرض در حالت True قرار دارد، اگر درحال آموزش اولیه هستید و میخواهید به صورت آزمایشی با الاستیک سرچ کار کنید پیشنهاد میشود که این تنظیمات را روی حالت False قرار دهید مانند تصویر زیر:
<p align="center">
<img src="img/install/7.jpg" />
</p>
برای اطمینان از آماده بودن الاستیک سرچ، در مرورگر آدرس زیر را تاپپ کنید (۹۲۰۰ پورت پیش فرض الاستیک است، http://localhost:9200/) :
با این کار، اطلاعات کلی الاستیک مانند شماره نسخه آن به شما نمایش داده خواهد شد :
<p align="center">
<img src="img/install/2.png" />
</p>
در مرحله بعد، برای کار با الاستیک، با توجه به اینکه الاستیک، از طریق پروتکل HTTP درخواستها را دریافت و آنها را پاسخ می دهد (یعنی API آن از نوع REST است) نیاز به ابزاری برای ارسال درخواستهای HTTP داریم . یکی از بهترین این ابزار، نرم افزار PostMan است که امکانات بسیار کاملی مانند ذخیره تک تک کوئری ها و تنظیمات نمایشی مختلف را داراست (نرم افزار Insomnia هم محیط گرافیکی جذاب و امکانات متنوعی دارد که می توانید از آن هم استفاده کنید.). اما خود محیط کیبانا که داشبورد تحلیل داده الاستیک است، این امکان را در اختیار توسعه گران و تحلیل گران قرار می دهد.ما هم با کیبانا کار خواهیم کرد.
## نکته
در بسیاری از مستندات الاستیک سرچ بخصوص مستندات اصلی الاستیک سرچ، برای ارسال درخواست به الاستیک و مشاهده نتایج از کتابخانه خط فرمان curl استفاده شده است که فایلهای اجرایی آن در ویندوز، در [آدرس ریپوزیتوری گیت هاب این آموزش](https://github.com/smbanaie/ElasticSearchRepo)، موجود است و می توانید با ورود به خط فرمان، دستورات ورود داده این آموزش و همچنین جستجو ها را طبق دستورات این منبع، انجام بدهید. دقت کنید دستورات curl هنگام اجرا در محیط های گرافیکی باید تغییر مختصری بکنند مثلاً به جای XPUT همان PUT باید استفاده شود و نیز به جای d- برای ورود داده ها به صورت جی سان، خود داده ها بدون این پارامتر وارد شوند.
اگر با پاورشل ویندوز کار می‌کنید می توانید به جای curl از این دستور استفاده کنید :
Invoke-RestMethod http://localhost:9200
وارد پوشه کیبانا شده ، درون پوشه bin فایل kibana.bat (فایل اول) را اجرا (ترجیحاً از خط فرمان) کنید. کمی طول خواهد کشید و اگر مشکل رم نداشته باشید، صفحه زیر را مشاهده خواهید کرد :
<p align="center">
<img src="img/install/3.png" />
<br>
صفحه شروع کیبانا
</br>
</p>
همانطور که مشاهده میکنید کیبانا پشت پورت ۵۶۰۱ منتظر پاسخگویی به درخواستهای کاربران است. بنابراین در مرورگر این آدرس را تایپ کنید :
<div align="left" dir="ltr"">
```r
http://localhost:5601
```
</div>
اگر صفحه زیر را مشاهده کردید، همه چیز خوب پیش رفته است :
<p align="center">
<img src="img/install/4.png" />
</p>
با برخی از این امکانات امروز آشنا خواهیم شد. برای شروع و ورود چند داده، بر روی گزینه Console در پنل سمت راست کلیک کنید. ( یا منوی Dev Tools)
<p align="center">
<img src="img/install/5.png" />
</p>
در صفحه فوق که کنسول تحت وب کیبانا برای کار با الاستیک محسوب می شود، دو پنل مشاهده می کنید. پنل سمت چپ برای نوشتن کوئری ها و اجرای آنها با زدن دکمه مثلث سبز رنگ و پنل سمت راست برای مشاهده نتایج است.
اکنون همه چیز برای شروع به کار با الاستیک سرچ آماده است.
<p align="center" dir="rtl">صلوات</p>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@ -0,0 +1,19 @@
PUT /firstindex
// create Index
POST firstindex/_doc
{
"message": "Hello_world!"
}
// Insert Into Index
DELETE firstindex
// Delete Index
// congratulations! You have written your first program!
// تبریک! شما اولین برنامه خود را نوشتید

View File

@ -0,0 +1,21 @@
PUT /firstindex
{
"mappings": {
"properties": {
"username": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
// Creating an index with username field and age field
// DataTypes in elasticsearch:
// text: متن
// keyword: متنی که یک کلمه خاص است، مانند آی دی با حروف یا پسورد
// integer: اعداد عادی و اعشاری
// date: زمان(فرمت های مختلف مثلا ISO8601)
// boolean: True and False
// object: ذخیره یک آبجکت با زبان های شی گرا

View File

@ -0,0 +1,17 @@
POST firstindex/_doc/1
{
"username": "Ali",
"age": 29,
"height": "1.8m"
}
// 1 - > id of doc
// الاستیک سرچ مشکلی با دادن یک قیلد جدید بدون تعریف آن ندارد
POST firstindex/_doc
{
"username": "Ali",
"age": 29,
"height": "1.8m"
}
// ID رندوم

View File

@ -0,0 +1,77 @@
GET firstindex/_count
// تعداد doc های insert شده در index
GET /firstindex/_doc/1
// گرفتن اطلاعات doc با id 1
GET firstindex/_doc/1/_source
// گرفتن مقادیر داخل doc با id 1
GET /firstindex/_search
{
"_source": ["field1", "username", "age"], // فیلدهای مورد نظر خود را در اینجا قرار دهید
"query": {
// your query, Exaple:
"match_all": {}
}
}
// با این کار field های 1 و فیلد یوسر نیم و age همه برگردانده میشود
// با توجه به این که فیلدی به نام field1 نداریم، اروری دریافت نمیشود
GET /firstindex/_search
{
"query": {
"match": {
"username": "123"
}
}
}
// هرکجا که username Ali باشد را برمیگرداند
// این جستجوی دقیق نیست و از پردازش متن و دیگر settings ها استفاده میکند
// در ضمن مقادیری مانند Aliases نیز بر گردانده میشوند
// چون جستجو است 404 نمیدهد
GET /firstindex/_search
{
"query": {
"term": {
"username": "Ali"
}
}
}
// هرکجا که username Ali باشد را برمیگرداند
// این جستجوی دقیق است و از پردازش متن و دیگر settings ها استفاده نمیکند
// مثلا برعکس دستور قبلی، Aliases را نمیگیرد
GET /firstindex/_search
{
"query": {
"range" : {
"id" : {
"gte" : 20
}
}
}
}
// کلمه id میگوید میخواهم با آی دی سرچ کنم
// کلمه gte به معنای بیشتر یا مساوی است
// یعنی معنای این query میشود هر id که بیشتر یا مساوی با عدد 20 باشد
GET /index_name/_search
{
"_source": "*",
"query": {
"match_all": {}
}
}
// تمام فیلد ها

View File

@ -0,0 +1,12 @@
//
POST firstindex/_delete_by_query
{
"query": {
"match_all": {}
}
}
// Delete all from the index
// POST <index>/_delete_by_query
// این کد از یک query استفاده میکند تا چیز های درون یک Index را حذف کند
// از آنجایی که در query match_all آمده، همه چی در index حذف میشود

View File

@ -0,0 +1,54 @@
// Test _ 1
PUT /users
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
// Create Index
POST /users/_doc
{
"name": "Ali",
"age": 30
}
POST /users/_doc
{
"name": "mohammad",
"age": 20
}
POST /users/_doc/0
{
"name": "hamed",
"age": 50
}
// Insert Into Index
GET /users/_doc/_count
// count of index
Delete /users/_doc/0313123
// Delete of Index
GET /users/_doc/_count
// count of index
Delete /users
// Delete Index

View File

@ -0,0 +1,5 @@
Delete firstindex/_doc/1
// Delete doc of the index By Id

View File

@ -0,0 +1,74 @@
///
POST firstindex/_search
{
"size": 4,
"from": 4,
"_source": [
"username",
"age"
],
"query": {
"match_all": {}
}
}
// size : 4
// فقط 4 تا از اولی ها را برگردان
// from: 4
// از 4 شروع کن
// فقط فیلد های age و username را بر گردان
POST qanonindex-v03/_search
{
"size": 4,
"from": 4,
"_source": ["username", "age"],
"query": {
"bool": {
"must": [
{
"term": {
"username": "Ali"
}
},
{
"match": {
"age": "23"
}
}
]
}
}
}
// bool
// استفاده از query های ترکیبی(فلان شرط و فلان شرط - فلان شرط یا فلان شرط)
// must -> array
// مجموعه ای از شرط ها که همه شان باید برقرار باشد تا برگردد
GET /firstindex/_search
{
"query" : {
"ids" : {
"values": ["User1", "User12", "User13"]
}
}
}
// بر گرداندن تمام آی دی های تعریف شده(این دستور سرچ است و 404 نمیدهد)
// Note: به ترتیب نیستند
GET /firstindex/_search
{
"query": {
"range" : {
"id" : {
"lte" : 20
}
}
}
}
// کلمه id میگوید میخواهم با آی دی سرچ کنم
// کلمه lte به معنای کمتر یا مساوی است
// یعنی معنای این query میشود هر id که کمتر یا مساوی با عدد 20 باشد
// برعکس gte

View File

@ -0,0 +1,41 @@
//
GET /firstindex/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 10000
}
}
}
}
// citys - > name
// میگوید بر اساس "field": "city" دسته بندی کند - > 10 تا تهران، 20 تا قم و....
// "size": 10000 - > فقط 10000 تای اول
// size default 10 هست
GET /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 10000
}
},
"ten_years": {
"terms": {
"field": "age"
}
}
}
}
// هر دو را میگوید
// !!!!!
// Note: aggs روی فیلد های text کار نمیکند
// برای استفاده در فیلد های text, type field باید keword باشد

View File

@ -0,0 +1,64 @@
// Test _ 2
PUT /users
{
"mappings": {
"properties": {
"username": {
"type": "text"
},
"age": {
"type": "integer"
},
"password": {
"type": "integer"
}
}
}
}
// Create Index
POST /users/_doc
{
"username": "admin",
"age": 15,
"password": 123
}
// Add a admin User
POST /users/_doc
{
"username": "Ali",
"age": 20,
"password": 32432
}
// Add a new User
POST /users/_doc
{
"username": "reza",
"age": 35,
"password": 907897568
}
// Add a new User
GET /users/_count
// This site is for teenagers and we want to remove all people over 20
// این سایت برای نوجوانان است و ما می خواهیم همه افراد بالای 20 سال را حذف کنیم
POST /users/_delete_by_query
{
"query": {
"range" : {
"age" : {
"gte" : 20
}
}
}
}
// Deleting all users over the age of 20
GET /users/_count

View File

@ -0,0 +1,46 @@
//
PUT /users
{
"mappings": {
"properties": {
"city": {
"type": "keyword"
}}}
}
POST /users/_doc/User1
{
"username": "admin",
"age": 20,
"ip": "192.168.0.0",
"city": "Tehran"
}
POST /users/_doc/User2
{
"username": "Ali",
"age": 45,
"ip": "162.148.0.0",
"city": "qom"
}
POST /users/_doc/User3
{
"username": "reza",
"age": 12,
"ip": "112.178.104.0",
"city": "Tehran"
}
// میخواهیم ببینیم بیشترین تعداد شهر در کاربرانمان چیست
POST /users/_search
{
"aggs": {
"Tehraniha": {
"terms": {
"field": "city",
"size": 1
}
}
}
}

View File

@ -0,0 +1,107 @@
//
GET /users/_search
{
"query": {
"range": {
"id": {
"lte": 20
}
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
// مرتب سازی بر اساس فیلد age
// از زیاد به کم
// برای کم به زیاد از asc در order استفاده کنید
POST /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 20
},
"aggs": {
"pageination": {
"bucket_sort": {
"from": 10,
"size": 10
}
}
}
}
}
}
// گرفتن 10 تای دوم در aggs
// از 10 شروع کن
// تا 10 برو
POST /users/_search
{
"aggs": {
"a1": {
"terms": {
"field": "age",
"order": {"_Sort": "desc"}
},
"aggs":{
"_Sort":{
"sum":{
"field":"age.age"
}
}
}
}
}
}
// در خط "order": {"_Sort": "desc"} گفته میشود بر اساس فیلد _Sort مرتب کن
// فیلد _Sort یک فیلد مجازی است که با aggs ساخته شده
// در فیلد _Sort گفته میشود یک عملیات جمع انجام بده و فیلد age را با فیلد age چمع کن
// یعنی هر نتیجه ای که حاصل معادلعه فیلد _Sort اش بیشتر باشد، اول نمایش داده میشود
// با تغییر desc به asc نیز از آخر مرتب میشود
// میتوان به جای sum.. min, max و avg هم میتوان گذاشت
POST /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 20
},
"aggs": {
"pageination": {
"bucket_sort": {
"sort": [
{
"sort_field_1": {
"order": "asc"
}
},
{
"sort_field_2": {
"order": "desc"
}
},
"sort_field_3"
]
}
}
}
}
}
}
// تعیین اولویت برای sort
// اول بر اساس sort_field_1 از کم به زیاد، اگر مساوی بودند بر اساس sort_field_2 و بعد هم sort_field_3
// order دیفالت desc هست و حتمنا نیازی به تعریف آن نیست

View File

@ -0,0 +1,55 @@
///
GET /users/_search
{
"query": {
"match_phrase": {
"username": "Ali"
}
}
}
// match_phrase --> عین عبارت را جستجو کند
GET /users/_search
{
"query": {
"match_phrase": {
"content": {
"query": "سبک زندگی اسلامی",
"boost": 10
}
}
}
}
// boost ---> نشان دهنده امتیاز
// elasticsearch برای هر چیزی که پیدا شود با یک سری الگوریتم یک امتیاز در نظر میگیرد
// برای هر کوئری (match, match_phrase ...) امتیاز 1 در نظر گرفته شده
// مثلا اگر دو تا متچ داشته باشیم و هر دو پیدا شوند، امتیاز 2 به چیز پیدا شده تعلق میگیرد
// برای اینکه امتیاز یک کوئری را بیشتر کنیم از boost استفاده میکنیم
POST qanonindex-v03/_search
{
"size": 4,
"from": 4,
"_source": ["username", "age"],
"query": {
"bool": {
"must_not": [
{
"term": {
"username": "Ali"
}
},
{
"match": {
"age": "23"
}
}
]
}
}
}
// must_not -> array
// برعکس must -> تمامی شرط های توی آرایه نباید برقرار باشند

View File

@ -0,0 +1,88 @@
//
GET qanonindex-v03/_search
{
"size": 4,
"from": 0,
"_source": [
"ref_key"
],
"query": {
"bool": {
"should": [
{
"match_phrase": {
"content": {
"query": "سبک زندگی اسلامی",
"boost": 10
}
}
},
{
"match": {
"content": "سبک زندگی اسلامی"
}
}
]
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
// highlight --> هایلایت کردن دور متون پیدا شده
// به صورت دیفالت در اول هر متنی که در کوئری پیدا شود یک <em> و در آخرش یک </em> قرار میدهد
// fields -> نشان دهنده فیلد هایی که متن در آنها هایلایت میشود
// در fields فقط میتوان فیلد هایی را مشخص کرد که متن در آنها جستجو شده است
GET /users/_search
{
"query": {
"match_phrase": {
"content": {
"query": "سبک زندگی اسلامی",
"boost": 10
}
}
},
"highlight": {
"pre_tags": [
"<span class='text__orange'>"
],
"post_tags": [
"</span>"
],
"fields": {
"content": {}
},
"fragment_size": 200,
"number_of_fragments": 3
}
}
// pre_tags --> متنی که در اول متنی که باید هایلایت شود میآید
// post_tags --> متنی که بعدش میاید
// number_of_fragments
// میگوید متن هایلیایت شده را به 3 قسمت تقسیم کن که بال هم فاصله دارند
// fragment_size
// میگوید تعدااد حروف هر قسمت 200 تا باشد
GET /users/_search
{
"query": {
"match_phrase": {
"content": "سبک زندگی اسلامی"
}
},
"highlight": {
"require_field_match": false,
"fields": {
"Title": {}
}
}
}
// require_field_match : false
// میگوید متن را در فیلد هایی که در آن ها جستجو نشده است هم هایلایت کند(فقط فیلد های متنی)

View File

@ -0,0 +1,18 @@
PUT detail-v01
{
"mappings": {
"date_detection": false
},
"settings": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
}
// date_detection --> الاستیک سرچ در حالت عادی از روی اسم فیلد هعا نوع داده را تشخیص میدهد
// مثلا اگر اسم فیلد date باشد حتی اگر تایپش text تعریف شده باشد، سعی میکند date4 در نظر بگیرد و در صورت استاندارد نبودن date به خطا میخورد
// "date_detection": false جلوی این مشکل را میگیرد
// number_of_shards --> گیت هاب یک سیستم کنترل ابری سرور بزرگ دارد که قسمت هایی از داده های شما را بین سرور ها پخش میکند، این تعداد بخش هایی است
// که جدا میشوند
// number_of_replicas --> این تعداد تکرار بخش های تعریف شده است
// Note: دیفالت number_of_shards 1 نیست

View File

@ -0,0 +1,12 @@
# PainLess Programing Language
زبان پینلس یک زبان برنامه نویسی مخصوص دیتابیس elasticsearch است، این زبان بر اساس زبان برنامه نویسی java ساخته شده و پیشنهاد elastic برای نوشتن script ها این زبان است، اما برتری این زبان نسبت به بقیه زبان های برنامه نویسی چیست؟
## امنیت:
تضمین امنیت خوشه شما از اهمیت بیشتری برخوردار است. به این منظور، Painless از یک لیست سفید مجاز با دقت بالا استفاده می‌کند که تا اعضای یک کلاس نیز به صورت دقیق در آن در نظر گرفته شده است. هر چیزی که جزء لیست مجاز نباشد، منجر به خطای کامپایل می‌شود. برای مشاهده لیست کاملی از کلاس‌ها، متدها و فیلدهای قابل دسترس در هر متن اسکریپتی، به مرجع API Painless مراجع کنید.
## کارایی:
زبان Painless مستقیماً در بایت کد JVM کامپایل می شود تا از تمام بهینه سازی های ممکن که JVM ارائه می دهد، استفاده کند. همچنین، Painless معمولاً از ویژگی‌هایی که به بررسی‌های کندتر اضافی در زمان اجرا نیاز دارند، اجتناب می‌کند.
## سادگی:
Painless یک سینتکس را با آشنایی طبیعی برای هر کسی که تجربه اولیه کدنویسی دارد پیاده سازی می کند. Painless از زیرمجموعه ای از نحو جاوا با برخی بهبودهای اضافی برای افزایش خوانایی و حذف واضحات استفاده می کند.

View File

@ -0,0 +1,90 @@
//
PUT my-index
PUT my-index/_doc/1
{
"my_field": 5
}
GET my-index/_search
{
"script_fields": {
"my_doubled_field": {
"script": {
"source": "doc['my_field'].value * params['multiplier']",
"params": {
"multiplier": 2
}
}
}
}
}
// ساخت یک فیلد مجازی به نام my_doubled_field
// اجرای اسکریپت
// script -> source ==> مقدار داخل فیلد
// doc['my_field'].value * params['multiplier']
// از این doc, فیلد my_field را بگیر و مقدارش را ضرب بر پارامتر multiplier بکن
// نتیجه: my_doubled_field -> 10
// به صورت
// doc['my_field'].value * params.get('multiplier')
// هم میتوان نوشت
POST _scripts/calculate-score
{
"script": {
"lang": "painless",
"source": "Math.log(_score * 2) + params['my_modifier']"
}
}
// elasticsearch یک index دارد به نام _scripts
// میتوانید در این ایندکس script ذخیره کنید تا بعدا استفاده کنید
// calculate-score -> آی دی script
// Math.log(_score * 2) -> لوگاریتم امتیاز * 2
// + params['my_modifier'] --> + پارامتر my_modifier
GET _scripts/calculate-score
// گرفتن اسکریپت
GET my-index/_search
{
"query": {
"script_score": {
"query": {
"match": {
"my_field": 5
}
},
"script": {
"id": "calculate-score", // id of saved script
"params": {
"my_modifier": 2
}
}
}
}
}
// change score to Math.log(_score * 2) + params['my_modifier']
DELETE _scripts/calculate-score
// DELETE a script
POST my-index/_doc/1
{
"colors": [
"blue",
"red",
"green",
"yellow"
]
}
// Insert a Array

View File

@ -0,0 +1,82 @@
PUT my-index/_doc/1
{
"counter": 1,
"tags": [
"red"
]
}
POST my-index/_update/1
{
"script": {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params": {
"count": 4
}
}
}
// ctx -> doc
// ctx._source -> مقادیر داخل doc
// ctx._source.counter -> مقدار counter در doc
// نتیجه: counter برابر با 5 میشود
POST my-index/_update/1
{
"script": {
"source": "ctx._source.tags.add(params['tag'])",
"lang": "painless",
"params": {
"tag": "blue"
}
}
}
// نتیجه: به tags مفدار blue add میشود
POST my-index/_update/1
{
"script": {
"source": "if (ctx._source.tags.contains(params['tag'])) { ctx._source.tags.remove(ctx._source.tags.indexOf(params['tag'])) }",
"lang": "painless",
"params": {
"tag": "blue"
}
}
}
// if (ctx._source.tags.contains(params['tag'])) --> آیا tags مقدار tag را دارد؟(blue)
// ctx._source.tags.remove(ctx._source.tags.indexOf(params['tag'])) --> حذف مقدار tag(blue)
POST my-index/_update/1
{
"script" : "ctx._source.new_field = 'value_of_new_field'"
}
// افزودن فیلد
POST my-index/_update/1
{
"script" : "ctx._source.remove('new_field')"
}
// حذف فیلد
POST my-index/_update/1
{
"script": {
"source": "if (ctx._source.tags.contains(params['tag'])) { ctx.op = 'delete' } else { ctx.op = 'none' }",
"lang": "painless",
"params": {
"tag": "green"
}
}
}
// if (ctx._source.tags.contains(params['tag'])) --> آیا tags green را دارد؟
// op -> opration: انجام عملیات
// اگر دارد آن را حذف کن
// اگر نداشت هیچی

View File

@ -0,0 +1,13 @@
POST my-index/_update/1
{
"script": {
"source": "String newVar = 'HI!'; ctx._source.message = newVar",
"lang": "painless",
"params": {
"tag": "blue"
}
}
}
// تعریف متغیر newVar به صورت String و مقدار HI!
Get my-index/_doc/1/_source

View File

@ -0,0 +1,140 @@
POST mainindex/_update_by_query
{
"script": {
"source": "ctx._source.allwords = ctx._source.allwords.replace('', ';');ctx._source.allwords = ctx._source.allwords.replace('', ';');ctx._source.allwords = ctx._source.allwords.replace('،', ';');ctx._source.allwords = ctx._source.allwords.replace(',', ';');",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field":"allwords"
}
}
],
"must_not": [
{
"bool": {
"should": [
{
"term": {
"allwords.keyword": {
"value": ""
}
}
},
{
"term": {
"allwords.keyword": {
"value": ";"
}
}
}
]
}
}
]
}
}
}
// query:
// گزینه اول: فیلد allwords باید وجود داشته باشد
// گزینه دوم: allwords.keyword نباید خالی باشد یا ; باشد
// Script:
// جایگزینی کاراکتر های - و , و ، با ;
// نتیحه: هر کجا که فیلد allwords وجود داشته باشد و خالی یا ; نباشد، کاراکتر هایی در آن ریپلیس خواهند شد
POST my-index/_update_by_query
{
"script": {
"source": "ctx._source.color.add('pink') ",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "color"
}
}
]
}
}
}
// add To a array
POST my-index/1/_update_by_query
{
"script": {
"source": "ctx._source.array.add(['entity_id' :1, 'entity_title' : 'Title,'realation_type' : 'realation_type']); ",
"lang": "painless"
}
}
// ساخت آرای ای از آبجکت ها
POST my-index/1/_update_by_query
{
"script": {
"source": "try {String year = ''; if(ctx._source.eb_year != null) year =ctx._source.eb_year.trim().replace('/', '').replace('هـ', ''); int d = Integer.parseInt(year);ctx._source.eb_year = d;} catch (NumberFormatException nfe) {ctx._source.remove('eb_year'); }",
"lang": "painless"
}
}
// این اسکریپت در صورتی که فیلد eb_year int نباشد آن را حذف میکند
POST mainindex/_update_by_query
{
"script": {
"source": " String allwords = ctx._source.allwords; def a_chars = allwords.toCharArray(); int chars_len = a_chars.length; ArrayList result = new ArrayList(); int last_dot = chars_len; for(int i = chars_len -1; i>=-1; i--) { if (i == -1 || a_chars[i] == (char) ';' ){ String t1 = allwords.substring(i+ 1, last_dot).trim(); if(t1 != '') result.add(t1); last_dot = i; } } ctx._source.tags = result; ",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field":"allwords"
}
}
],
"must_not": [
{
"bool": {
"should": [
{
"term": {
"allwords.keyword": {
"value": ""
}
}
},
{
"term": {
"allwords.keyword": {
"value": ";"
}
}
}
]
}
}
]
}
}
}
// اگر فیلد allwords وجود داشته باشد، اسکریپت اجرا میشود
// String allwords = ctx._source.allwords; def a_chars = allwords.toCharArray(); int chars_len = a_chars.length;
// chars_len = تعداد کاراکتر های allwords
// ArrayList result = new ArrayList(); int last_dot = chars_len;
// result --> یک آرایه
// for(int i = chars_len -1; i>=-1; i--) { if (i == -1 || a_chars[i] == (char) ';' ){String t1 = allwords.substring(i+ 1, last_dot).trim(); if(t1 != '') result.add(t1);last_dot = i;
// این کد allwords را از آخر به اول میخواند و با ; اسپلیت میکند و در آرایه result میریزد
// البته میتوان از
// a_chars,split(';')
// نیز استفاده کرد

View File

@ -0,0 +1,27 @@
POST _reindex
{
"source": {
"index": "mainindex",
"_source": ["tags", "allwords", "subject", "keywords", "verb"]
},
"dest": {
"index": "suggestindex"
}
}
// reindex یک نوع ایندکس برای انتقال داده ها از یک ایندکس به ایندکس دیگر است
// source -> ایندکسی که باید برود
// dest -> ایندکسی که اطلاعات به آن وارد میشود
// _source -> فیلد هایی که انتقال میابند
POST _reindex?wait_for_completion=false
// انجام عملیات reindex زمان بر است و معمولا با خطای time out روبه رو میشود
// برای جلوگیری، wait_for_completion را فالس قرار دهید
// بعد از فالس کردن wait_for_completion، در بدنه پاسخ به شما یک task_id داده میشود که میتوان با آن بررسی کرد فرایند انتقال تا کجا پیش رفته
GET _tasks/isijdisajdsl
// بررسی وضعیت تسک

View File

@ -0,0 +1,102 @@
// ------------------------------------------------------------------------------------- bollean
// تعریف فیلد
PUT my-index
{
"mappings": {
"properties": {
"is_published": {
"type": "boolean"
}
}
}
}
// افزودن سند
POST my-index/_doc/1?refresh
{
"is_published": true
}
// جستجو اسناد
GET my-index/_search
{
"query": {
"term": {
"is_published": true
}
}
}
// ------------------------------------------------------------------------------------- keyword
// تعریف فیلد
PUT my-index
{
"mappings": {
"properties": {
"kwd": {
"type": "keyword"
}
}
}
}
// افزودن سند
POST my-index/_doc/1
{
"tags": ["foo", "bang", "bar", "baz"]
}
// جستجو اسناد
GET my-index/_search
{
"query": {
"match": {
"tags": "foo"
}
}
}
// ------------------------------------------------------------------------------------- text
// تعریف فیلد
PUT my-index
{
"mappings": {
"properties": {
"kwd": {
"type": "text"
}
}
}
}
// افزودن سند
PUT my-index/_doc/1
{
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
}
// جستجوی اسناد
GET my-index/_search
{
"query": {
"match": {
"text": "jumped"
}
}
}
// ------------------------------------------------------------------------------------- Numeric
// انواع دیتا تایپ های عددی:
// long: عدد 64 بیتی از منفی 2 به توان 63 تا دو به توان 63 منهای 1
// integer مثل بالایی ولی تا دو به توان 23 منهای 1
// float: عدد اعشاری 32 بیتی
// double: عدد اعشازری 64 بیتی
// scaled_float : هم لانگ هم دابل

View File

@ -0,0 +1,51 @@
///
PUT /users
{
"mappings": {
"properties": {
"Title": {
"type": "string",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
// فیلد های داخلی فیلد هایی هستن زیر مجموعه فیلد های دیگر
// فیلد های داخلی خودشان بر اساس فیلد اصلی پر میشوند
// فیلد keyword میشود نوع کیورد فیلد اصلی نت برای بعضی حالات به کار رود
// ignore_above -> تعدادی از فیلد اصلی، یعنی فیلد اصلی هر چقدر بود، ignore_above تاشو بردار و به عنوان کیورد ذخیره کن
// برای دسترسی به این فیلد -> Title.keyword
// اگر کل متنتان را میخواهید به عنوان قابلیت های keyword نیز استفاده کنید، نیازی به تعریف فیلد keyword نیست
// میتوانید کد زیر را بنویسید
// "Title": {
// "type": "string",
// "fielddata": true
// }
Put /users
{
"mappings": {
"properties": {
"subject": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "text",
"fielddata": true
}
}
}
}
}
}
// در این ایندکس فیلد یک تایپ مشخص نیست، بلکه یک object است
// برای خود فیلد میتوانید پراپرتیس تعریف نمایید که مانند Title,keyword استفاده میشود
// حالا میتوانید از subject.id و subject.title استفاده کنید

View File

@ -0,0 +1,169 @@
// یک نمونه واقعی و عملی از mapping
PUT /crawl-details
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"person_code": {
"type": "keyword"
},
"research_code": {
"type": "keyword"
},
"meet_code": {
"type": "keyword"
},
"Allwords": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"author": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"branch": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"meet_no": {
"type": "integer"
},
"subject": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "text",
"fielddata": true,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"subtitle": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"tags": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"keywords": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"verb": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"format": {
"type": "text",
"fielddata": true,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"begin_year": {
"type": "integer",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 20
}
}
},
"begin_date": {
"type": "keyword"
},
"end_date": {
"type": "keyword"
},
"amplify": {
"type": "text"
},
"ralation": {
"type": "keyword"
},
"city": {
"type": "keyword"
},
"place": {
"type": "keyword"
},
"address": {
"type": "text"
},
"films": {
"type": "integer"
},
"voices": {
"type": "integer"
},
"photos": {
"type": "integer"
},
"audience": {
"type": "text",
"fielddata": true
},
"attendees": {
"type": "text"
}
}
}
}

View File

@ -0,0 +1,18 @@
# Analyzers in elasticsearch
آنالایزر ها، قابلیت های پرکابردی هستند که برای جستجو نقشی حیاتی را ایفا میکنند
هنگام جستجو ممکن است کاربر حروف فارسی یا عربی وارد کند که با هم متفاوت هستند و یا حروف متفاوت اننگلیسی و فارسی و عربی
<br
آنالایزر ها در چند جا استفاده میشوند و میتوان به هر کدام یک آنالایزر جدا اختصاص داد
1. متن عادی، دیتا های را نرمال میکند
2. جستجوی کاربر، متن جستجوی کاربر را نرمال میکند
3. بخش جستجویی کاربر در کوتیشن، نرمال خاص خودش
<br>
<br>
انواع آنالایزر ها داریم، نوع اول: نوع فیلتر است که کلمات را به کلمات دیگر کانورت میکند
خود این نوع نیز چند زیر نوع دارد
1. synonym: کلمات مترادف
2. stop: کلمات بیهوده مانند در، و ، این، است....
3. stemmer: کلمات هم ریشه

View File

@ -0,0 +1,83 @@
PUT /firstindex
{
"settings": {
"index": {
"analysis": {
"filter": {
"MyName": {
"type": "synonym",
"lenient": true,
"_comment": "نعيم, حميد => نعيم",
"synonyms": [
"آب زي, آبزي => آب زي",
"آرامش بخش, آرامش‌بخش => آرامش بخش",
"شوقي, شوق => شوق",
"مقصودشان, مقصود => مقصود",
"عفاهما, عفا => عفا",
"عفاتك, عفا => عفا",
"عقالاته, عقال => عقال"
]
}
}
}
}
}
}
// Type: synonym
// کلمات مترادف
// کلمات نعیم و حمید با هم مترادف هستند و باهم جایگزین میشوند(حمید بغا نعیم جایگزین میشود)
// MyName -> your name
PUT /firstindex
{
"settings": {
"index": {
"analysis": {
"filter": {
"arabic_stop": {
"type": "stop",
"stopwords": [
"1",
"2",
"3",
"ص",
"4",
"و",
"5",
"ج",
"6",
"a"
]
}
}
}
}
}
}
// کلماتی که حذف میشود
PUT /firstindex
{
"settings": {
"index": {
"analysis": {
"char_filter": {
"persian_char_filter": {
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4"
]
}
}
}
}
}
}
// تبدیل کاراکتر ها

View File

@ -0,0 +1,120 @@
//
PUT /firstindex
{
"settings": {
"index": {
"analysis": {
"index": {
"analysis": {
"analyzer": {
"My-analyzer-Name": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [],
"filter": [
"My-Normalizer-Name"
]
}
}
}
},
"filter": {
"My-Normalizer-Name": {
"type": "synonym",
"lenient": true,
"_comment": "نعيم, حميد => نعيم",
"synonyms": [
"آب زي, آبزي => آب زي",
"آرامش بخش, آرامش‌بخش => آرامش بخش",
"شوقي, شوق => شوق",
"مقصودشان, مقصود => مقصود",
"عفاهما, عفا => عفا",
"عفاتك, عفا => عفا",
"عقالاته, عقال => عقال"
]
}
}
}
}
}
}
// آنالایزر های خود را در analyzer تعریف کنید.
// "type": "custom" --> نوع آناایزر
// "tokenizer": "standard" --> هنگام تبدیل کلمات به کلمات دیگر، باید کلمات را بر یک اساسی جدا کرد، برای این کار از tokenizer استفاده میکنیم
// بعضی زبان ها یک سری کارکتر برای جدا کردن کلمات دارند و از standard tokenizer استفاده نمیکند
// char_filter --> اسم نرمالایزر های شما برای کاراکتر ها
// filter --> اسم نرمالایزر های فیلتری شما
PUT /firstindex
{
"settings": {
"properties": {
"mintro": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
}
}
}
}
},
"index": {
"analysis": {
"index": {
"analysis": {
"analyzer": {
"My-analyzer-Name": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [],
"filter": [
"My-Normalizer-Name"
]
}
}
}
},
"filter": {
"My-Normalizer-Name": {
"type": "synonym",
"lenient": true,
"_comment": "نعيم, حميد => نعيم",
"synonyms": [
"آب زي, آبزي => آب زي",
"آرامش بخش, آرامش‌بخش => آرامش بخش",
"شوقي, شوق => شوق",
"مقصودشان, مقصود => مقصود",
"عفاهما, عفا => عفا",
"عفاتك, عفا => عفا",
"عقالاته, عقال => عقال"
]
}
}
}
}
}
// "mintro": {
// "type": "text",
// "fields": {
// "fa": {
// "type": "text",
// "analyzer": "normal_analyzer_persian",
// "search_analyzer": "normal_analyzer_persian",
// "search_quote_analyzer": "phrase_analyzer_persian"
// }
// }
// }
// mintro --> نام فیلد
// fields > fa --> فیلد های داخلی، مثلا برای جستجو فارسی
// analyzer --> آنالایزر روی داده هایی که به این فیلد ارسال میشوند
// search_analyzer --> آنالایز بر متنی که با آن روی این فیلد سرچ میشود
// search_quote_analyzer --> آنالایزر بر متنی که هنگام سرچ درون کوتیشن قرار دارد

View File

@ -0,0 +1,601 @@
// این یک مثال واقعی از ساخت ایندکس است
// بخشی از آن با مرحله قبل یکی است
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"person_code": {
"type": "keyword"
},
"research_code": {
"type": "keyword"
},
"meet_code": {
"type": "keyword"
},
"Allwords": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"author": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"branch": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"meet_no": {
"type": "integer"
},
"subject": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "text",
"fielddata": true,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"subtitle": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"tags": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"keywords": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"verb": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"format": {
"type": "text",
"fielddata": true,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"begin_year": {
"type": "integer",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 20
}
}
},
"begin_date": {
"type": "keyword"
},
"end_date": {
"type": "keyword"
},
"amplify": {
"type": "text"
},
"ralation": {
"type": "keyword"
},
"city": {
"type": "keyword"
},
"place": {
"type": "keyword"
},
"address": {
"type": "text"
},
"films": {
"type": "integer"
},
"voices": {
"type": "integer"
},
"photos": {
"type": "integer"
},
"audience": {
"type": "text",
"fielddata": true
},
"attendees": {
"type": "text"
},
"report_tmp": {
"properties": {
"address": {"type": "integer"},
"mindex": {"type": "integer"},
"mintro": {"type": "integer"},
"sanad_data1": {"type": "integer"},
"sanad_data2": {"type": "integer"}
}
},
"mindex": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
},
"ar": {
"type": "text",
"analyzer": "normal_analyzer_arabic",
"search_analyzer": "normal_analyzer_arabic",
"search_quote_analyzer": "phrase_analyzer_arabic"
},
"ph": {
"type": "text",
"analyzer": "phrase_analyzer_persian",
"search_analyzer": "phrase_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
}
}
},
"mintro": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
},
"ar": {
"type": "text",
"analyzer": "normal_analyzer_arabic",
"search_analyzer": "normal_analyzer_arabic",
"search_quote_analyzer": "phrase_analyzer_arabic"
},
"ph": {
"type": "text",
"analyzer": "phrase_analyzer_persian",
"search_analyzer": "phrase_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
}
}
},
"sanad_data1": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
},
"ar": {
"type": "text",
"analyzer": "normal_analyzer_arabic",
"search_analyzer": "normal_analyzer_arabic",
"search_quote_analyzer": "phrase_analyzer_arabic"
},
"ph": {
"type": "text",
"analyzer": "phrase_analyzer_persian",
"search_analyzer": "phrase_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
}
}
},
"sanad_data2": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
},
"ar": {
"type": "text",
"analyzer": "normal_analyzer_arabic",
"search_analyzer": "normal_analyzer_arabic",
"search_quote_analyzer": "phrase_analyzer_arabic"
},
"ph": {
"type": "text",
"analyzer": "phrase_analyzer_persian",
"search_analyzer": "phrase_analyzer_persian",
"search_quote_analyzer": "phrase_analyzer_persian"
}
}
},
"sanad_type1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 20
}
}
},
"sanad_type2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 20
}
}
},
"next_page": {
"type": "integer"
},
"completion" : {
"type" : "completion",
"analyzer" : "simple",
"preserve_separators" : true,
"preserve_position_increments" : true,
"max_input_length" : 50
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"phrase_analyzer_persian": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"persian_char_filter"
],
"filter": []
},
"phrase_analyzer_arabic": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"arabic_char_filter"
],
"filter": []
},
"normal_analyzer_persian": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"persian_char_filter"
],
"filter": [
"persian_synonym",
"persian_stop"
]
},
"normal_analyzer_arabic": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"persian_char_filter"
],
"filter": [
"arabic_synonym",
"arabic_stop"
]
}
},
"filter": {
"persian_synonym": {
"type": "synonym",
"lenient": true,
"_comment": "نعيم, حميد => نعيم",
"synonyms": [
"آب زي, آبزي => آب زي",
"آرامش بخش, آرامش‌بخش => آرامش بخش",
"شوقي, شوق => شوق",
"مقصودشان, مقصود => مقصود",
"عفاهما, عفا => عفا",
"عفاتك, عفا => عفا",
"عقالاته, عقال => عقال"
]
},
"arabic_synonym": {
"type": "synonym",
"lenient": true,
"_comment": "نعيم, حميد => نعيم",
"synonyms": [
"آب زي, آبزي => آب زي",
"آرامش بخش, آرامش‌بخش => آرامش بخش",
"شوقي, شوق => شوق",
"مقصودشان, مقصود => مقصود",
"عفاهما, عفا => عفا",
"عفاتك, عفا => عفا",
"عقالاته, عقال => عقال"
]
},
"persian_stop": {
"type": "stop",
"stopwords": [
"یا",
"را",
"این",
"با",
"آن",
"و",
"در",
"به",
"که",
"از",
"طی",
"پس",
"چه",
"اگر",
"نه",
"آنها",
"هر",
"او",
"ما",
"من",
"تا",
"نیز",
"اما",
"یک",
"بر",
"هم",
"برای",
"کن",
"کرد",
"کردن",
"باش",
"بود",
"بودن",
"شو",
"شد",
"شدن",
"‏دار",
"داشت",
"داشتن",
"‏خواه",
"خواست",
"خواستن",
"‏گوی",
"گفت",
"گفتن",
"‏گیر",
"گرفت",
"گرفتن",
"‏آی",
"آمد",
"آمدن",
"‏توان",
"توانستن",
"‏یاب",
"یافتن",
"‏آور",
"آورد",
"آوردن",
"1",
"2",
"3",
"ص",
"4",
"و",
"5",
"ج",
"6",
"a",
"top",
"href",
"pageno"
],
"char_filter": [
"my_char_filter"
]
},
"arabic_stop": {
"type": "stop",
"stopwords": [
"1",
"2",
"3",
"ص",
"4",
"و",
"5",
"ج",
"6",
"a",
"top",
"href",
"pageno",
"الصفحة_0",
"7",
"١",
"من",
"في",
"أن",
"ما",
"لا",
"إلى",
"به",
"أو",
"قد",
"يا",
"مع",
"بها",
"لو",
"أم",
"عليه",
"له",
"ذلك",
"إذا",
"إن",
"إلا",
"أنه",
"فيه",
"حتى",
"هو",
"منه",
"كل",
"بعد",
"أي",
"غير",
"كما",
"بين",
"إليه",
"فيها",
"عند",
"ثنا",
"لما",
"قبل",
"التي",
"ليس",
"كانت",
"أيضا",
"لهم",
"لها",
"لي",
"إنما",
"فيما",
"عز",
"عليهم",
"يكن",
"عليها",
"الذين",
"بني",
"مما",
"لك",
"إذ",
"هي",
"بل",
"أما",
"نا",
"حين",
"ألا",
"معه",
"قالت",
"إني",
"أنت",
"عنها",
"هل",
"لنا",
"أنها",
"ان"
],
"char_filter": [
"my_char_filter"
]
},
"arabic_stemmer": {
"type": "stemmer",
"name": "arabic"
}
},
"char_filter": {
"persian_char_filter": {
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9",
"ک => ك",
"ی => ي",
"ة => ه",
"إ => ا",
"أ => ا",
"آ => ا",
"ء => ا",
"َ => ",
"ُ => ",
"ِ => ",
"ّ => ",
"ً => ",
"ٌ => ",
"ٍ => ",
"ْ => "
]
},
"arabic_char_filter": {
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9",
"ک => ك",
"ی => ي"
]
}
}
},
"number_of_shards": "1",
"number_of_replicas": "0"
}
}
}

View File

@ -0,0 +1,350 @@
<div align="JUSTIFY" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>
<p align="center">
<img src="img/index.png" />
</p>
# فیلتر رمز مترادف
فیلتر نشانه مترادف اجازه می دهد تا به راحتی مترادف ها را در طول فرآیند تجزیه و تحلیل مدیریت کنید. مترادف ها با استفاده از یک فایل پیکربندی پیکربندی می شوند.
## به عنوان مثال:
<div align="left" dir="ltr" style="background-color:black;">
```json
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
}
```
</div>
مورد بالا یک فیلتر مترادف را با یک مسیر analysis/synonym.txt (که بایستی در مسیر پیکربندی elasticsearch قرار گیرد یعنی:/etc/elasticsearch/) پیکربندی می کند.
سپس تحلیلگر مترادف با فیلتر پیکربندی می شود.
نکته:
الاستیک سرچ به طور پیش فرض شاخه ی کانفیگ خود را می شناسد، پس نمی توان شاخه دلخواه خود را اعمال کرد.
این فیلتر مترادف‌هایی را با هر توکنایزر و فیلترهای نشانه‌ای که قبل از آن در زنجیره ظاهر می‌شوند، تبدیل می‌کند.
تنظیمات اضافی عبارتند از:
- expand (defaults to true).
- lenient (defaults to false)
lenient اگر true باشد هنگام تجزیه پیکربندی مترادف، استثناها را نادیده می گیرد. توجه به این نکته مهم است که فقط آن دسته از قوانین مترادف که نمی توانند تجزیه شوند نادیده گرفته می شوند. به عنوان مثال درخواست زیر را در نظر بگیرید:
<div align="left" dir="ltr" style="background-color:black;">
```json
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "standard",
"filter": [ "my_stop", "synonym" ]
}
},
"filter": {
"my_stop": {
"type": "stop",
"stopwords": [ "bar" ]
},
"synonym": {
"type": "synonym",
"lenient": true,
"synonyms": [ "foo, bar => baz" ]
}
}
}
}
}
}
```
</div>
با درخواست بالا، کلمه bar حذف می شود، اما یک مپینگ(mapping) foo => baz همچنان اضافه می شود.
با این حال، اگر mapping که اضافه می‌شود foo بود، baz => bar هیچ چیز به لیست مترادف اضافه نمی‌شد.
این به این دلیل است که کلمه هدف برای mapping به خودی خود حذف می شود زیرا یک کلمه stop word بود.
به طور مشابه، اگر نگاشت "bar، foo، baz" بود و Expand روی false تنظیم می شد، هیچ نگاشت اضافه نمی شد، همانطور که وقتی expand=false نگاشت هدف اولین کلمه است.
با این حال، اگر expand=true باشد، نگاشت های اضافه شده معادل foo، baz => foo، baz یعنی همه نگاشت ها به غیر از کلمه stop word خواهد بود.
## tokenizer و ignore_case منسوخ شده اند:
پارامتر tokenizer، tokenizer را که برای توکن کردن مترادف استفاده می شود کنترل می کند، این پارامتر برای سازگاری با شاخص هایی است که قبل از 6.0 ایجاد شده اند.
پارامتر ignore_case فقط با پارامتر tokenizer کار می کند.
دو فرمت مترادف پشتیبانی می شوند: Solr، WordNet.
## مترادف Solr(Solr synonyms):
فرمت زیر نمونه ای از فایل است:
<div align="left" dir="ltr" style="background-color:black;">
```bash
# Blank lines and lines starting with pound are comments.
# Explicit mappings match any token sequence on the LHS of "=>"
# and replace with all alternatives on the RHS. These types of mappings
# ignore the expand parameter in the schema.
# Examples:
i-pod, i pod => ipod
sea biscuit, sea biscit => seabiscuit
# Equivalent synonyms may be separated with commas and give
# no explicit mapping. In this case the mapping behavior will
# be taken from the expand parameter in the schema. This allows
# the same synonym file to be used in different synonym handling strategies.
# Examples:
ipod, i-pod, i pod
foozball , foosball
universe , cosmos
lol, laughing out loud
# If expand==true, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod
# Multiple synonym mapping entries are merged.
foo => foo bar
foo => baz
# is equivalent to
foo => foo bar, baz
```
</div>
همچنین می‌توانید مترادف‌هایی را برای فیلتر مستقیماً در فایل پیکربندی تعریف کنید (به استفاده از مترادف‌ها به جای synonyms_path توجه کنید):
<div align="left" dir="ltr" style="background-color:black;">
```json
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"synonyms": [
"i-pod, i pod => ipod",
"universe, cosmos"
]
}
}
}
}
}
}
```
</div>
با این حال، توصیه می شود مترادف های بزرگ را در یک فایل با استفاده از synonyms_path تعریف کنید، زیرا تعیین آنها به صورت درون خطی باعث افزایش بی مورد اندازه خوشه می شود.
مترادف های WordNet (WordNet synonyms):
مترادف های مبتنی بر قالب WordNet را می توان با استفاده از فرمت اعلام کرد:
<div align="left" dir="ltr" style="background-color:black;">
```json
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"format": "wordnet",
"synonyms": [
"s(100000001,1,'abstain',v,1,0).",
"s(100000001,2,'refrain',v,1,0).",
"s(100000001,3,'desist',v,1,0)."
]
}
}
}
}
}
}
```
</div>
استفاده از synonyms_path برای تعریف مترادف های WordNet در یک فایل نیز پشتیبانی می شود.
## تجزیه فایل های مترادف:
Parsing synonym files:
Elasticsearch از فیلترهای توکن قبل از فیلتر مترادف در یک زنجیره نشانه ساز برای تجزیه ورودی های یک فایل مترادف استفاده می کند. بنابراین، به عنوان مثال، اگر یک فیلتر مترادف بعد از یک استمر قرار داده شود، آنگاه استمر به ورودی های مترادف نیز اعمال می شود. از آنجا که ورودی‌های نقشه مترادف نمی‌توانند موقعیت‌های انباشته داشته باشند، برخی از فیلترهای نشانه ممکن است در اینجا مشکلاتی ایجاد کنند. فیلترهای رمزی که چندین نسخه از یک نشانه را تولید می‌کنند، ممکن است انتخاب کنند که کدام نسخه از نشانه را هنگام تجزیه مترادف‌ها منتشر کند، به عنوان مثال asciifolding فقط نسخه تاشده رمز را تولید می‌کند. دیگران، به عنوان مثال مالتی پلکسر، word_delimiter_graph یا ngram یک خطا ایجاد می کنند.
اگر نیاز به ساخت آنالایزرهایی دارید که هم فیلترهای چند نشانه ای و هم فیلترهای مترادف را شامل می شوند، از فیلتر مالتی پلکسر استفاده کنید که فیلترهای چند نشانه ای در یک شاخه و فیلتر مترادف در شاخه دیگر قرار دارند.
## مثال تحریر:
فایلهای زیر را در شاخه الاستیک سرچ یعنی(/etc/elasticsearch) کپی کنید:
<br>
[syn_all.txt](files/syn_all.txt)
<br>
[syn_halfspace.txt](files/syn_halfspace.txt)
کدهای زیر را در محیط Dev Tools کیبانا اجرا کنید:
<div align="left" dir="ltr" style="background-color:black;">
```json
DELETE test_index
POST test_index/_search
{
"query": {
"match": {
"content.fa": "پخته"
}
},
"highlight": {
"fields": {"content.fa": {}}
}
}
POST test_index/_doc
{
"title": "بازی کردن",
"content": "آب دیده روان شد"
}
PUT /test_index
{
"mappings": {
"date_detection": false,
"properties": {
"title": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "normal_analyzer_persian"
}
}
},
"content": {
"type": "text",
"fields": {
"fa": {
"type": "text",
"analyzer": "normal_analyzer_persian",
"search_analyzer": "normal_analyzer_persian",
"search_quote_analyzer": "normal_analyzer_persian"
}
}
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"normal_analyzer_persian": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [],
"filter": [
"fa_halfspace",
"fa_synonym"
]
}
},
"filter": {
"fa_halfspace": {
"type": "synonym",
"lenient": true,
"synonyms_path": "../../home/gateway/common/syn_halfspace.txt"
},
"fa_synonym": {
"type": "synonym",
"lenient": true,
"synonyms_path": "../../home/gateway/common/syn_all.txt"
}
}
}
}
}
}
```
</div>
[منبع](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-synonym-tokenfilter.html#_solr_synonyms)
<p align="center" dir="rtl">صلوات</p>
</div>

View File

@ -0,0 +1,179 @@
<div align="JUSTIFY" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>
<p align="center">
<img src="img/index.png" />
</p>
# جستجو با مترادف
مترادف کلمات یا عباراتی هستند که معنی یکسان یا مشابه دارند. آنها یک جنبه مهم جستجو هستند، زیرا می توانند تجربه جستجو را بهبود بخشند و دامنه نتایج جستجو را افزایش دهند.
## مترادف ها به شما اجازه می دهند:
* ارتباط جستجو را با یافتن اسناد مرتبطی که از عبارات مختلفی برای بیان یک مفهوم استفاده می کنند، بهبود بخشید.
* واژگان خاص دامنه را کاربرپسندتر کنید و به کاربران اجازه دهید از عبارات جستجویی استفاده کنند که با آنها آشنایی بیشتری دارند.
* برای مدیریت شفاف اشتباهات رایج، غلط املایی و غلط املایی رایج را تعریف کنید.
مترادف ها با استفاده از مجموعه های مترادف با هم گروه بندی می شوند. شما می توانید به تعداد مورد نیاز مجموعه مترادف داشته باشید.
## برای استفاده از مجموعه‌های مترادف در Elasticsearch، باید:
* مجموعه مترادف خود را ذخیره کنید
* فیلترهای رمز و تحلیلگر مترادف را پیکربندی کنید
## مجموعه مترادف خود را ذخیره کنید
مجموعه‌های مترادف شما باید در Elasticsearch ذخیره شوند تا تحلیلگرها بتوانند به آنها مراجعه کنند. سه راه برای ذخیره مجموعه های مترادف شما وجود دارد:
## مترادف API
می‌توانید از APIهای مترادف برای مدیریت مجموعه‌های مترادف استفاده کنید. این انعطاف‌پذیرترین رویکرد است، زیرا امکان تعریف و تغییر پویا مجموعه‌های مترادف را فراهم می‌کند.
تغییرات در مجموعه های مترادف شما به طور خودکار تحلیلگرهای مرتبط را بارگیری مجدد می کند.
## فایل مترادف
می توانید مترادف های مجموعه خود را در یک فایل ذخیره کنید.
یک فایل مجموعه مترادف باید در تمام گره های خوشه شما آپلود شود و در فهرست پیکربندی توزیع Elasticsearch شما قرار گیرد. اگر از سرویس Elasticsearch استفاده می‌کنید، می‌توانید فایل‌های مترادف را با استفاده از بسته‌های سفارشی آپلود کنید.
### نمونه فایل مترادف:
<div align="left" dir="ltr" style="background-color:black;">
```bash
# Blank lines and lines starting with pound are comments.
# Explicit mappings match any token sequence on the left hand side of "=>"
# and replace with all alternatives on the right hand side.
# These types of mappings ignore the expand parameter in the schema.
# Examples:
i-pod, i pod => ipod
sea biscuit, sea biscit => seabiscuit
# Equivalent synonyms may be separated with commas and give
# no explicit mapping. In this case the mapping behavior will
# be taken from the expand parameter in the token filter configuration.
# This allows the same synonym file to be used in different synonym handling strategies.
# Examples:
ipod, i-pod, i pod
foozball , foosball
universe , cosmos
lol, laughing out loud
# If expand==true in the synonym token filter configuration,
# "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod
# Multiple synonym mapping entries are merged.
foo => foo bar
foo => baz
# is equivalent to
foo => foo bar, baz
```
</div>
برای به روز رسانی مجموعه مترادف های موجود، فایل های جدید را در خوشه خود آپلود کنید. فایل های مجموعه مترادف باید در هر گره خوشه ای همگام نگه داشته شوند.
وقتی یک مجموعه مترادف به روز می شود، تحلیلگرهای جستجویی که از آن استفاده می کنند باید با استفاده از API تحلیلگر جستجوی بارگذاری مجدد به روز شوند.
این همگام‌سازی و بارگیری مجدد دستی، این رویکرد را نسبت به استفاده از مترادف‌های API انعطاف‌پذیرتر می‌کند.
## درون خطی
می‌توانید مترادف‌های خود را با افزودن مستقیم آن‌ها در تعریف فیلتر رمز خود آزمایش کنید.
مترادف های درون خطی برای استفاده در تولید توصیه نمی شوند. تعداد زیادی از مترادف های درون خطی اندازه خوشه را بی دلیل افزایش می دهد و می تواند منجر به مشکلات عملکرد شود.
## فیلترهای رمز و تحلیلگر مترادف را پیکربندی کنید
هنگامی که مجموعه های مترادف شما ایجاد شد، می توانید شروع به پیکربندی فیلترها و تحلیلگرهای رمز خود کنید تا از آنها استفاده کنید.
Elasticsearch از مترادف ها به عنوان بخشی از فرآیند تحلیل استفاده می کند. شما می توانید از دو نوع فیلتر رمز برای گنجاندن مترادف ها استفاده کنید:
* نمودار مترادف: توصیه می شود از آن استفاده کنید، زیرا می تواند مترادف های چند کلمه ای را به درستی مدیریت کند ("با عجله"، "در عجله").
* مترادف: در صورت نیاز به استفاده از مترادف های چند کلمه ای توصیه نمی شود.
اسناد فیلتر نشانه مترادف را برای جزئیات پیکربندی و دستورالعمل های اضافه کردن آن به یک تحلیلگر بررسی کنید.
## آنالایزر خود را تست کنید
می توانید پیکربندی تحلیلگر را بدون تغییر تنظیمات فهرست خود آزمایش کنید. از تجزیه و تحلیل API برای آزمایش زنجیره تحلیلگر خود استفاده کنید:
<div align="left" dir="ltr" style="background-color:black;">
```json
GET /_analyze
{
"tokenizer": "standard",
"filter" : [
"lowercase",
{
"type": "synonym_graph",
"synonyms": ["pc => personal computer", "computer, pc, laptop"]
}
],
"text" : "Check how PC synonyms work"
}
```
</div>
## مترادف ها را در زمان فهرست یا جستجو اعمال کنید
آنالایزرها را می توان در زمان فهرست یا زمان جستجو به کار برد.
شما باید تصمیم بگیرید که چه زمانی مترادف های خود را اعمال کنید:
* زمان فهرست: زمانی که اسناد در Elasticsearch نمایه می شوند، مترادف ها اعمال می شوند. این یک جایگزین کمتر انعطاف پذیر است، زیرا تغییرات در مترادف های شما نیاز به فهرست بندی مجدد دارد.
* زمان جستجو: زمانی که جستجو انجام می شود، مترادف ها اعمال می شوند. این یک رویکرد انعطاف‌پذیرتر است که نیازی به فهرست‌بندی مجدد ندارد. اگر فیلترهای رمز با "قابل به روز رسانی" پیکربندی شده باشند: درست است، هنگامی که در مترادف های خود تغییراتی ایجاد می کنید، تحلیلگرهای جستجو می توانند دوباره بارگیری شوند.
مجموعه‌های مترادف ایجاد شده با استفاده از مترادف‌های API فقط در زمان جستجو قابل استفاده هستند.
می‌توانید تحلیل‌گری را که حاوی مترادف‌هایتان است، به‌عنوان تحلیل‌گر زمان جستجو یا تحلیل‌گر زمان شاخص تعیین کنید.
مثال زیر my_analyzer را به عنوان تحلیلگر جستجو به فیلد عنوان در نگاشت شاخص اضافه می کند:
<div align="left" dir="ltr" style="background-color:black;">
```json
"mappings": {
"properties": {
"title": {
"type": "text",
"search_analyzer": "my_analyzer",
"updateable": true
}
}
}
```
</div>
[منبع](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-with-synonyms.html)
<p align="center" dir="rtl">صلوات</p>
</div>

View File

@ -0,0 +1,165 @@
<div align="JUSTIFY" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>
<p align="center">
<img src="img/index.png" />
</p>
تحلیلگرهای جستجوی فهرست و منابع آنها را دوباره بارگیری می کند. برای جریان‌های داده، API تحلیلگرهای جستجو و منابع شاخص‌های پشتیبان جریان را دوباره بارگیری می‌کند.
<div align="left" dir="ltr" style="background-color:black;">
```json
POST /my-index-000001/_reload_search_analyzers
POST /my-index-000001/_cache/clear?request=true
```
</div>
پس از بارگیری مجدد تحلیلگرهای جستجو، باید کش درخواست را پاک کنید تا مطمئن شوید که حاوی پاسخ های مشتق شده از نسخه های قبلی تحلیلگر نیست.
## درخواست:
<div align="left" dir="ltr" style="background-color:black;">
```json
POST /<target>/_reload_search_analyzers
GET /<target>/_reload_search_analyzers
```
</div>
## :پیش نیازها
اگر ویژگی‌های امنیتی Elasticsearch فعال هستند، باید امتیاز مدیریت فهرست را برای جریان داده، فهرست یا نام مستعار هدف داشته باشید.
توضیح:
می‌توانید از API تحلیل‌گرهای جستجوی بارگذاری مجدد برای دریافت تغییرات فایل‌های مترادف استفاده شده در مترادف_گراف یا فیلتر نشانه مترادف یک تحلیلگر جستجو استفاده کنید. برای واجد شرایط بودن، فیلتر توکن باید دارای یک پرچم قابل به روز رسانی درست باشد و فقط در تحلیلگرهای جستجو استفاده شود.
### نکته:
این API برای هر قطعه از یک شاخص بارگذاری مجدد انجام نمی دهد. در عوض، بارگذاری مجدد را برای هر گره حاوی خرده های شاخص انجام می دهد. در نتیجه، تعداد کل خرده‌های بازگردانده شده توسط API می‌تواند با تعداد خرده‌های شاخص متفاوت باشد.
از آنجایی که بارگذاری مجدد بر هر گره دارای یک قطعه شاخص تأثیر می گذارد، مهم است که قبل از استفاده از این API، فایل مترادف را در هر گره داده در خوشه، از جمله گره هایی که حاوی ماکت قطعه نیستند، به روز کنید. این تضمین می‌کند که فایل مترادف در همه جای خوشه به‌روزرسانی می‌شود تا در صورت جابجایی خرده‌ها در آینده.
## پارامترهای مسیر
<target>
(Required, string) فهرستی از جریان‌های داده، شاخص‌ها و نام‌های مستعار جدا شده با کاما برای محدود کردن درخواست. از حروف عام (_) پشتیبانی می کند. برای هدف قرار دادن تمام جریان‌ها و شاخص‌های داده، از _ یا \_all استفاده کنید.
Query پارامترهای:
allow_no_indices :
- (Optional, Boolean) اگر false باشد، اگر هر عبارت عام، نام مستعار نمایه یا \_all فقط شاخص‌های بسته یا گم شده باشد، درخواست خطا برمی‌گرداند. این رفتار حتی اگر درخواست سایر شاخص های باز را هدف قرار دهد اعمال می شود. به عنوان مثال، درخواستی که foo*,bar* را هدف قرار می دهد، اگر فهرستی با foo شروع شود اما هیچ فهرستی با نوار شروع نشده باشد، خطایی را برمی گرداند.
- پیش فرض true است.
expand_wildcards:
- (Optional, string)نوع شاخصی که الگوهای عام می توانند مطابقت داشته باشند. اگر درخواست بتواند جریان های داده را هدف قرار دهد، این آرگومان تعیین می کند که آیا عبارات عبارات با جریان داده های پنهان مطابقت دارند یا خیر. از مقادیر جدا شده با کاما مانند open,hidden پشتیبانی می کند. مقادیر معتبر عبارتند از:
- all
هر جریان یا شاخص داده، از جمله موارد پنهان را مطابقت دهید.
- open
با شاخص های باز و غیر پنهان مطابقت دهید. همچنین با هر جریان داده غیر پنهانی مطابقت دارد.
- closed
مطابقت با شاخص های بسته و غیر پنهان. همچنین با هر جریان داده غیر پنهانی مطابقت دارد. جریان های داده را نمی توان بسته کرد.
- hidden
جریان های داده های پنهان و شاخص های پنهان را مطابقت دهید. باید با open, closed, یا هردو باشد.
- none
الگوهای عامیانه پذیرفته نمی شوند.
- پیش فرض open است.
ignore_unavailable:
- (Optional, Boolean) اگر false باشد، درخواست اگر نمایه گمشده یا بسته را هدف قرار دهد، یک خطا برمی‌گرداند. پیش فرض به false.
مثال ها
از[ ایجاد API شاخص](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html) برای ایجاد یک فهرست با یک تحلیلگر جستجو استفاده کنید که حاوی فیلتر مترادف قابل به روز رسانی است.
استفاده از analyzer زیر به عنوان analyzer index منجر به خطا می شود.
<div align="left" dir="ltr" style="background-color:black;">
```json
PUT /my-index-000001
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_synonyms": {
"tokenizer": "whitespace",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym_graph",
"synonyms_path": "analysis/synonym.txt",
"updateable": true
}
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "my_synonyms"
}
}
}
}
```
</div>
- شا\*مل یک فایل مترادف است.
- فیلتر توکن را به‌عنوان قابل به‌روزرسانی علامت‌گذاری می‌کند.
- آنالیزور را به عنوان تحلیلگر جستجو علامت گذاری می کند.
پس از به روز رسانی فایل مترادف، از [API بارگذاری مجدد تحلیلگر](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html) برای بارگیری مجدد تحلیلگر جستجو و دریافت تغییرات فایل استفاده کنید.
<div align="left" dir="ltr" style="background-color:black;">
```json
POST /my-index-000001/\_reload_search_analyzers
```
</div>
API پاسخ زیر را برمی گرداند.
<div align="left" dir="ltr" style="background-color:black;">
```json
{
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"reload_details": [
{
"index": "my-index-000001",
"reloaded_analyzers": ["my_synonyms"],
"reloaded_node_ids": ["mfdqTXn_T7SGr2Ho2KT8uw"]
}
]
}
```
</div>
[منبع](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html#indices-reload-analyzers)
<p align="center" dir="rtl">صلوات</p>
</div>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,118 @@
# Elasticsearch
[README انگلیسی در اینجا](./README.md)
+ جستجوی متنی کامل: Elasticsearch قابلیت جستجوی پیشرفته متنی را فراهم می‌کند، به شما امکان می‌دهد بر اساس مطابقت متنی و امتیازدهی به مطابقت، سند‌های مرتبط را جستجو و بازیابی کنید.
+ توزیع‌شده و قابل مقیاس: Elasticsearch برای توزیع و قابل مقیاس بودن طراحی شده است، به شما امکان می‌دهد حجم بزرگی از داده را در سرورها و خوشه‌های متعدد ذخیره و پردازش کنید.
+ داده نزدیک به زمان واقعی: Elasticsearch قابلیت نزدیک به زمان واقعی برای فرایند ایندکس‌گذاری و جستجو را فراهم می‌کند، به شما اجازه می‌دهد تقریباً به صورت فوری داده را ایندکس و جستجو کنید.
+ محورمند به سند: Elasticsearch داده را به عنوان سند‌های ساختارمند JSON در نظر می‌گیرد، که این امکان را برای شما فراهم می‌کند که انواع مختلفی از داده را ایندکس، جستجو و تجزیه و تحلیل کنید.
+ چند‌مستندی: Elasticsearch از چند‌مستندی پشتیبانی می‌کند، به شما امکان می‌دهد داده‌ها را از کاربران یا برنامه‌های مختلف در یک خوشه‌ مشخص جدا کنید و امنیت ببخشید.
+ تجزیه و تحلیل و آمارها: Elasticsearch قابلیت تجزیه و تحلیل قدرتمند برای انجام آمار و تحلیل بر روی داده‌هایتان را فراهم می‌کند، این قابلیت به شما امکان استخراج بینش‌ها و خلاصه‌سازی داده را در ابعاد مختلف می‌دهد.
+ بدون نیاز به طرح شمایی: Elasticsearch بدون نیاز به طرح شمایی است، به این معنی که می‌توانید داده را بدون تعریف پیش‌فرض طرح شما در آن ایندکس، جستجو و مدیریت کنید. این انعطاف‌پذیری به شما امکان تطبیق آسان با ساختارهای داده‌ای متغیر را می‌دهد.
+ رابط برنامه نویسی RESTful: Elasticsearch رابط برنامه نویسی RESTful را ارائه می‌دهد، که به راحتی می‌توانید با سیستم تعامل کنید و عملیات‌های مختلف مانند ایندکس
‌گذاری، جستجو و مدیریت داده را انجام دهید.
+ جستجوی توزیع‌شده: Elasticsearch به شما امکان می‌دهد عملیات جستجو را در سرورهای متعدد توزیع کنید، این امکان را فراهم می‌کند که پردازش‌های موازی و عملکرد جستجوی سریع‌تری را داشته باشید.
+ ادغام با اکوسیستم: Elasticsearch ادغام خوبی با ابزارها و فناوری‌های دیگر دارد، مانند Logstash و Kibana، که با هم تشکیل پکیج ELK (Elasticsearch، Logstash و Kibana) را برای تحلیل و نظارت بر لاگ‌ها ایجاد می‌کنند.
## اطلاعات:
ورژن فعلی: 8.8<br>
وب سایت: https://elastic.co<br>
لینک دانلود ورژن 8.8: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.2-windows-x86_64.zip<br>
لینک دانلود ورژن 7.17: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.11-windows-x86_64.zip
## دانلود
[راهنمای دانلود فارسی](./Install-fa.md)<br>
[راهنمای دانلود انگلیسی](./Install.md)<br>
## استفاده
``` json
DELETE /firstindex
// Delet a Index
DELETE /firstindex/_doc/1
// Delet a doc by id of the Index
// GET
GET /firstindex/_doc/0
// Get Index By Id 0
GET firstindex/_count
// تعداد doc ها در ایندکس
// POST
POST firstindex/_doc/1
{
"name": "Ali",
"age": 23
}
// Insert Into doc by id 1
POST firstindex/_doc
{
"name": "Ali",
"age": 23
}
// Insert Into new DOC
POST /firstindex/_delete_by_query
{
"query": {
"match_all": {}
}
}
// Delete all
POST /firstindex/_delete_by_query
{
"query": {
"match": {
"_id": "v8eA2IQB5pIgH4LhE2mX"
}
}
}
// Delete doc By id
// Querys
// Example: POST /firstindex/_delete_by_query{"Query"}
//
{
"query": {
"match_all": {}
}
}
// All
```
## مسیر یادگیری
توضیحات وب
_ [نصب کیبانا](https://www.elastic.co/guide/en/kibana/current/windows.html)<br>
_ [ساخت ایندکس](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html)<br>
_ [حذف ایندکس](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html)<br>
_ [گرفتن ایندکس](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html)<br>
_ [افزودن در ایندکس](https://kb.objectrocket.com/elasticsearch/guide-how-to-add-documents-to-an-index-in-elasticsearch)<br>
_ [داکیومنتیشن](https://www.elastic.co/guide/index.html)<br>

View File

@ -0,0 +1,134 @@
# Elasticsearch
[persian README here](./README-fa.md)
Database with powerful search engine.<br>
+ full-Text Search: Elasticsearch provides advanced full-text search capabilities, allowing you to search and retrieve relevant documents based on text matching and relevance scoring.
+ Distributed and Scalable: Elasticsearch is designed to be distributed and scalable, allowing you to store and process large volumes of data across multiple nodes and clusters.
+ Near Real-Time Data: Elasticsearch provides near real-time indexing and search capabilities, allowing you to index and search data almost instantly as it becomes available.
+ Document-Oriented: Elasticsearch treats data as structured JSON documents, making it easy to index, search, and analyze different types of data.
+ Multi-Tenancy: Elasticsearch supports multi-tenancy, allowing you to segregate and secure data from different users or applications within the same cluster.
+ Aggregations and Analytics: Elasticsearch provides powerful aggregation capabilities for performing analytics on your data, allowing you to extract insights and summarize data across various dimensions.
+ Schema-Free: Elasticsearch is schema-free, meaning you can index and search data without defining a predefined schema. This flexibility allows you to easily adapt to changing data structures.
+ RESTful API: Elasticsearch exposes a RESTful API, making it easy to interact with the system and perform various operations such as indexing, searching, and managing data.
+ Distributed Search: Elasticsearch allows you to distribute search operations across multiple nodes, enabling parallel processing and faster search performance.
+ Integration with Ecosystem: Elasticsearch integrates well with other tools and technologies, such as Logstash and Kibana, forming the ELK (Elasticsearch, Logstash, and Kibana) stack for log analysis and monitoring.
## Details:
current version: 8.8<br>
WebSite: https://elastic.co<br>
Link of install Elasticsearch-8.8: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.2-windows-x86_64.zip<br>
Link of install Elasticsearch-7.17: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.11-windows-x86_64.zip
## download
[persian_download_help](./Install-fa.md)<br>
[english_download_help](./Install.md)<br>
## Usage
``` json
PUT /firstindex
// create index
PUT firstindex
{
"mappings": {
"date_detection": false
},
"settings": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
}
// create index by simple setting
DELETE /firstindex
// Delete a Index
DELETE /firstindex/_doc/1
// Delete a doc by id of the Index
// GET
GET /firstindex/_doc/0
// Get Index By Id 0
GET firstindex/_count
// تعداد doc ها در ایندکس
// POST
POST firstindex/_doc/1
{
"name": "Ali",
"age": 23
}
// Insert Into doc by id 1
POST firstindex/_doc
{
"name": "Ali",
"age": 23
}
// Insert Into new DOC
POST /firstindex/_delete_by_query
{
"query": {
"match_all": {}
}
}
// Delete all
POST /firstindex/_delete_by_query
{
"query": {
"match": {
"_id": "v8eA2IQB5pIgH4LhE2mX"
}
}
}
// Delete doc By id
// Querys
// Example: POST /firstindex/_delete_by_query{"Query"}
//
{
"query": {
"match_all": {}
}
}
// All
```
## Training path
web Docs<br>
_ [Install kibana](https://www.elastic.co/guide/en/kibana/current/windows.html)<br>
_ [Create Index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html)<br>
_ [Delete Index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html)<br>
_ [GET Index](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html)<br>
_ [Insert Into Index](https://kb.objectrocket.com/elasticsearch/guide-how-to-add-documents-to-an-index-in-elasticsearch)<br>
_ [Documentation](https://www.elastic.co/guide/index.html)<br>

View File

@ -0,0 +1,27 @@
# نصب الاستیک سرچ در ویندوز
## نصب
```
cd \elasticsearch-8.8.2 --> این مکان نصب است
.\bin\elasticsearch.bat ---> انجام کار های دیتابیس
CMD را نبندید تا بتوانید استفاده کنید
```
## استفاده
شما برای استفاده از Elasticsearch نیاز به یک IDE دارید
محیط های کد زنی زیادی برای استفاده از Elasticsearch وجود دارد که یکی از بهترین آنها kibana است
نصب کیبانا در ویندوز کاری بسی سخت است، پس من از افزونه Elasticsearch for VSCode استفاده میکنم<br>
برای نصب، VSCode را باز کنید و وارد تب extensions شوید و Elasticsearch for VSCode را جستجو کنید<br>
من از ورژن 0.13.31 استفاده میکنم<br>
حال یک فایل با پسوند .es بسازید و کد های request خود را آنجا بنویسید<br>
```
مثلا:
PUT /firstindex
```
حالا بر روی run query کلیک کنید، اگر از شما یک url خواست localhost/9200 را بدهید<br>
پایان!

View File

@ -0,0 +1,33 @@
# Install Elasticsearch in Windows
## Download
```
page : https://www.elastic.co/guide/en/elasticsearch/reference/7.17/zip-windows.html
link : https://www.elastic.co/downloads/elasticsearch
```
## Install
```
cd \elasticsearch-8.8.2 --> Download location
.\bin\elasticsearch.bat ---> Database initialization
Do not close cmd to use the database
```
## Usage
You need an IDE to use Elasticsearch
There are various IDEs, one of which is Kibana
Installing Kibana on Windows is a lot of trouble, so my suggestion is to use the Elasticsearch for VSCode plugin in VSCode<br>
To install this plugin, open VSCode and enter the plugins tab Then search for Elasticsearch for VSCode<br>
I use version 0.13.31<br>
Now create a file with .es extension and write your request codes there<br>
```
example:
PUT /firstindex
```
Now click on the run button, if it asks you for an address, enter localhost/9200<br>
FINISH!

View File

@ -0,0 +1,125 @@
# توضیح پاسخ ها
```
Code:
PUT /firstindex
Result:
"acknowledged": true,
"shards_acknowledged": true,
"index": "firstindex"
```
+ acknowledged: درخواست موفقیت آمیز بوده یا نه
+ shards_acknowledged: تمام بخش ها توسط سرور تایید شده یا نه
+ index: اسم ایندکس
---
```
Code:
PUT /firstindex
Result:
{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [firstindex/mctRe4VYTs28SWLGZ4hEiQ] already exists",
"index_uuid": "mctRe4VYTs28SWLGZ4hEiQ",
"index": "firstindex"
}
],
"type": "resource_already_exists_exception",
"reason": "index [firstindex/mctRe4VYTs28SWLGZ4hEiQ] already exists",
"index_uuid": "mctRe4VYTs28SWLGZ4hEiQ",
"index": "firstindex"
},
"status": 400
}
```
معنی: index از قبل وجود دارد
---
```
Code:
Delete /users/_doc/0313123
Result:
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
}
],
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
},
"status": 404
}
```
معنی: این آی دی تعریف نشده است
---
```
Code:
Delete /Index
Result:
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [firsftindex]",
"resource.type": "index_or_alias",
"resource.id": "firsftindex",
"index_uuid": "_na_",
"index": "firsftindex"
}
],
"type": "index_not_found_exception",
"reason": "no such index [firsftindex]",
"resource.type": "index_or_alias",
"resource.id": "firsftindex",
"index_uuid": "_na_",
"index": "firsftindex"
},
"status": 404
}
```
معنی: این ایندکس وجود ندارد
---
```
Code:
GET _tasks/1
Result:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "malformed task id 1"
}
],
"type": "illegal_argument_exception",
"reason": "malformed task id 1"
},
"status": 400
}
```
معنی: این تسک آی دی وجود ندارد

View File

@ -0,0 +1,157 @@
# result discussion
```
Code:
PUT /firstindex
Result:
"acknowledged": true,
"shards_acknowledged": true,
"index": "firstindex"
```
+ acknowledged: To be successful or not
+ shards_acknowledged: The success or failure of certain sections
+ index: index name
---
```
Code:
PUT /firstindex
Result:
{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [firstindex/mctRe4VYTs28SWLGZ4hEiQ] already exists",
"index_uuid": "mctRe4VYTs28SWLGZ4hEiQ",
"index": "firstindex"
}
],
"type": "resource_already_exists_exception",
"reason": "index [firstindex/mctRe4VYTs28SWLGZ4hEiQ] already exists",
"index_uuid": "mctRe4VYTs28SWLGZ4hEiQ",
"index": "firstindex"
},
"status": 400
}
```
meaning: index already exists
---
```
Code:
Delete /users/_doc/0313123
Result:
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
}
],
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
},
"status": 404
}
```
meaning: This id is not exists
---
```
Code:
Delete /Index
Result:
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [firsftindex]",
"resource.type": "index_or_alias",
"resource.id": "firsftindex",
"index_uuid": "_na_",
"index": "firsftindex"
}
],
"type": "index_not_found_exception",
"reason": "no such index [firsftindex]",
"resource.type": "index_or_alias",
"resource.id": "firsftindex",
"index_uuid": "_na_",
"index": "firsftindex"
},
"status": 404
}
```
meaning: This Index is not exists
---
```
Code:
Delete /users/_doc/0313123
Result:
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
}
],
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_expression",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
},
"status": 404
}
```
meaning: This id is not exists
---
```
Code:
GET _tasks/1
Result:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "malformed task id 1"
}
],
"type": "illegal_argument_exception",
"reason": "malformed task id 1"
},
"status": 400
}
```
meaning: This task id is not exists