در این فصل قصد داریم با analyzer ها در Elasticsearch آشنا شده و با استفاده از آنها به پردازش دادهها متناسب با نیازمندی خود بپردازیم. ابتدا این نکته را یادآوری میکنم که مباحث مربوط به analyzer ها فقط در خصوص فیلدهای از نوع text که در فصل قبل با آنها شدیم، کاربرد دارد و برای سایر datatype ها از قابلیت text analysis (تجزیه و تحلیل متن) استفاده نمیشود.
در مواردی مشابه شرایط زیر به احتمال زیاد شما نیاز دارید تا برای ایندکس خود از analyzer استفاده کرده و آنها را به خوبی تنظیم کنید:
- ایجاد یک موتور جستجو برای محصول خود
- استخراج دادههای بدون ساختار (دادهکاوی)
- تطبیق دادن تنظیمات جستجو برای یک زبان خاص (برای مثال زبان فارسی)
text analysis امکان پیاده سازی جستجوی full-text را به وجود آورده است تا الستیک سرچ بتواند نتایج مرتبط با یک موضوع جستجو شده را علاوه بر موارد کاملا تطبیقشده، در اختیار کاربر خود قرار دهد.
فرایند text analysis در Elasticsearch دو مرحله اصلی را طی میکند:
- Tokenization: در این مرحله متن ورودی تکه تکه شده و به قطعات کوچکتری (معمولا هر قطعه یک کلمه!) تجزیه میشود تا امکان جستجوی full-text فراهم شود. با این کار زمانی که شما عبارت "کدنویسی هنری است که کاری انجام میدهد!" را ایندکس کرده باشید و عبارت "کدنویس یک هنرمند است" را جستجو کنید، عبارت "کدنویسی هنری است که کاری انجام میدهد!" را احتمالا در نتایج جستجو خواهید دید چرا که term های "کدنویس" و "هنر" تطبیق داده خواهد شد؛ در حالی که اگر قرار باشد عبارت بالا به همان شکل اصلی خود ایندکس شود، دیگر چنین امکانی وجود ندارد!
- Normalization: در مرحله Tokenization کلمههای تولید شده تطبیق داده شد، اما این تمام داستان نبوده و اگر دقت کرده باشید کلمهی "کدنویسی" را با کلمهی "کدنویس" انطباق دادیم و همچنین "هنرمند" را با "هنری"!! در حقیقت ریشهی این کلمات یکی است اگرچه ظاهر آنها متفاوت باشد. به عنوان مثالی دیگر در زبان انگلیسی کلمات "developer" و "Developer" تنها در کوچکی و بزرگی حروف متفاوت هستند و به احتمال زیاد در جستجو انتظار میرود که تطبیق داده شوند. این قابلیتها با اصلاح حروف یک term امکانپذیر خواهد شد که در مرحلهی Normalization اتفاق خواهد افتاد.
برای ورود به جزییات دنیای analyzer ها ابتدا باید با جزییات آنها آشنا شویم! Elasticsearch به صورت پیشفرض شامل چندین built-in analyzer است که هرکدام شبیه به یک package عمل کرده و قابلیتی ارائه میدهد. البته که ما محدود به استفاده از آنها نیستیم و میتوانیم اجزای تشکیلدهندهی analyzer ها را با هم ترکیب کرده و موارد دلخواه (custom) ایجاد کنیم.
آشنایی با اجزای تشکیلدهنده Analyzer ها
هر analyzer _ خواه built-in یا custom _ از سه بخش تشکیل میشود:
- character filter :Character filters ها اولین بخش در analyzer هستند که شروع به کار میکنند. هر character filter متن ورودی را دریافت کرده و با حذف، اضافه یا تغییر در حروف(character) آن، باعث ایجاد تغییراتی در رشته متن ورودی میشود. برای مثال تبدیل تمامی حروف آ، اِ، اُ و اَ به ا (الف ساده). یک analyzer ممکن است چندین character filter داشته باشد.
- Tokenizer: بعد از اتمام کارِ character filters، نوبت به tokenizer تعیین شده در analyzer میرسد تا رشتهی متنی را از بخش قبل دریافت کرده و آنها را به مجموعهای از token (term) ها تبدیل کند. برای مثال whitespace tokenizer بر مبنای کاراکتر “ “، رشتهی متنی را به مجموعهای از term ها تبدیل میکند. همچینین tokenizer اطلاعات موقعیت و ترتیب هر term را نیز ذخیره میکند. هر analyzer باید دقیقا یک tokenizer داشته باشد.
- Token filters: پس از ایجاد term ها، نوبت به کار token filter ها میرسد. هر token filter مجموعهای از term را دریافت کرده و ممکن است با حذف، اضافه یا تغییر term ها تغییراتی در مجموعهی دریافت شده از بخش قبل ایجاد کند. token filter ها هرگز اطلاعات مربوط به موقعیت یا ترتیب term ها را تغییر نمیدهند. هر analyzer ممکن است چندین token filter داشته باشد.
بسیار خوب تا اینجا با اجزای کلی یک analyzer آشنا شدیم. اگر به یاد داشته باشید قبلتر اشاره کردیم که analyzer ها در دو محل وارد میدان شده و شروع به پردازش متن میکنند، اول زمانی است که یک document دارای فیلد از نوع text، ایندکس میشود و دوم زمانی که یک درخواست جستجو (search query) در Elasticsearch اجرا شود. معمولا در هر دو این موارد یک نوع analyzer اعمال خواهد شد اما در آینده خواهیم دید در برخی مواقع بهتر است تا از analyzer های متفاوتی برای این دو مورد استفاده شود.
در فصل قبل نیز اشاره شد که تنظیمات analyzer یک فیلد، یکی از پارامترهای mapping آن فیلد است و آن را میتوان به صورت زیر تعیین کرد:
PUT my-index
{
"mappings": {
"properties": {
"my_field": {
"type": "text",
"analyzer": "standard"
}
}
}
}
در مثال بالا analyzer تعیین شده برای فیلد standard ،my_field است که به صورت built-in در Elasticsearch تعریف شده است (با analyzer های built-in در قسمت بعدی آشنا خواهیم شد). چنانچه بخواهیم از یک analyzer دلخواه استفاده کنیم، باید با استفاده از character filter ها و tokenizer و token filter های موجود در Elasticsearch، یک analyzer دلخواه در ایندکس مدنظر تعریف کنیم. برای این کار در کلید settings ایندکس از کلیدی به نام analysis استفاده میکنیم تا اجزای analyzer های دلخواه خود را در آن تعریف کنیم:
PUT my-index
{
"settings": {
"analysis": {
"char_filter": {
…
},
"analyzer": {
…
},
"filter": {
…
}
}
}
}
برای اینکه بتوانیم بخشهای مختلف analyzer خود را به درستی بچینیم، باید با انواع tokenizer ،character filter و token filter در Elasticsearch آشنا شویم. در قسمت آینده به معرفی این موارد و همچنین analyzer های built-in خواهیم پرداخت و در ادامهی فصل در قالب مثالهای عملی شروع به ایجاد analyzer های دلخواه خواهیم کرد.