در قسمت قبل گفته شد که Elasticsearch دارای چندین analyzer از پیش تعریفشده (built-in) است. در اولین بخش از این قسمت به معرفی مهمترین analyzer های built-in میپردازیم. همچنین Elasticsearch یک API کاربردی برای تست کارکرد analyzer ها ارائه کرده است که میتوانید از آن در محیط dev tools استفاده کرده و خروجی را مشاهده کنید. این API به صورت زیر است:
POST _analyze
{
"analyzer": "whitespace",
"text": "این یک متن برای تست کارکرد تحلیلگرها است"
}
همانطور که در مثال بالا میبینید، در این API از دو پارامتر analyzer و text استفاده شده است. علاوه بر این دو پارامتر، پارامترهای char_filter، tokenizer و filter نیز در این API قابل استفاده هستند تا به جای استفاده از نام یک analyzer، بتوان با ترکیب اجزای analyzer ها نیز از این API استفاده کرد.
خروجی این API لیستی از token ها به همراه اطلاعاتی از موقعیت و نوع آنها است. در مثال بالا، whitespace analyzer بر مبنای کاراکتر “ “ متن را تجزیه کرده و لیستی از کلمات را تولید میکند:
"tokens" : [
{
"token" : "این",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 0
},
{
"token" : "یک",
"start_offset" : 4,
"end_offset" : 6,
"type" : "word",
"position" : 1
},
{
"token" : "متن",
"start_offset" : 7,
"end_offset" : 10,
"type" : "word",
"position" : 2
},
{
"token" : "برای",
"start_offset" : 11,
"end_offset" : 15,
"type" : "word",
"position" : 3
},
{
"token" : "تست",
"start_offset" : 16,
"end_offset" : 19,
"type" : "word",
"position" : 4
},
{
"token" : "کارکرد",
"start_offset" : 20,
"end_offset" : 26,
"type" : "word",
"position" : 5
},
{
"token" : "تحلیلگرها",
"start_offset" : 27,
"end_offset" : 36,
"type" : "word",
"position" : 6
},
{
"token" : "است",
"start_offset" : 37,
"end_offset" : 40,
"type" : "word",
"position" : 7
}
]
مهمترین analyzer های از پیش تعریفشده در Elasticsearch
- Standard analyzer: این analyzer متن را بر اساس کلمات مجزای آن تجزیه کرده، تمامی حروف را به lowercase تبدیل و علائم نگارشی را نیز حذف میکند. همچنین قابلیت حذف کلمات بیاثر (Stop word) را نیز دارد که به صورت پیشفرض غیرفعال است. به عنوان مثال این analyzer متن "آنچه که در جامعه اهمیت داشت، تعاملات فرهنگی-اخلاقی تعریفشده بود!" را به term های زیر تبدیل میکند:
آنچه | که | در | جامعه | اهمیت | داشت | تعاملات | فرهنگی | اخلاقی | تعریفشده | بود
- Whitespace analyzer: این analyzer متن را بر مبنای تشخیص کاراکتر “ “ به term های مجزا تقسیم میکند. این analyzer حروف را lowercase نمیکند! جملهی بالا توسط این analyzer به term های زیر تبدیل میشود:
آنچه | که | در | جامعه | اهمیت | داشت، | تعاملات | فرهنگی-اخلاقی | تعریفشده | بود!
- Simple analyzer: این analyzer متن را بر اساس هر کاراکتر غیر از حروف الفبا (مانند اعداد، حروف ربط، علائم نگارشی، خط تیره و ...) تجزیه کرده و حروف را lowercase میکند. متن بالا بر اساس این analyzer به term های زیر تبدیل میشود:
آنچه | که | در | جامعه | اهمیت | داشت | تعاملات | فرهنگی | اخلاقی | تعریف | شده | بود
نکته: علاوه بر موارد گفته شده، چند analyzer دیگر نیز به صورت built-in وجود دارد که در عمل تنها برای تست یا موارد خیلی ساده کاربردی بوده و معمولا بهترین راه برای زبان فارسی، تعریف analyzer های خاص متناسب با نیازمندیهای مختلف است!
مهمترین character filter ها در Elasticsearch
- HTML Strip character filter: این فیلتر تگهای HTML را در متن ورودی شناسایی کرده و آنها را از متن حذف کرده یا با مقدار decode شدهی آن جایگزین میکند. برای مثال متن "<p>من روز کاری <b>سختی<b/> را گذراندم!<p/>" به "n\من روز کاری سختی را گذراندم! n\" تبدیل میشود.
- Mapping character filter: این فیلتر بر مبنای لیستی از key و valueها، با شناسایی key های موجود در متن، آنها را با مقدار value تنظیم شده جایگزین میکند. برای مثال میتوان با تعریف لیستی از حروف عربی که معادل فارسی متفاوت دارند (مانند ك، ي، ة)، تمامی حروف عربی متن را به معادل فارسی تبدیل کرد.
- Pattern replace character filter: در این فیلتر میتوان با تعریف یک الگوی regular expression، هر موردی که با الگوی مورد نظر تطبیق دارد را با مقداری دیگر جایگزین کرد. برای مثال تمامی اعرابگذاری (ــَـ، ــِـ، ــُـ، ...) را از متن حذف کرد.
مهمترین tokenizer ها در Elasticsearch
- Standard tokenizer: این tokenizer متن مورد نظر را بر اساس کلمات مجزای آن تجزیه کرده و اکثر علائم نگارشی را نیز حذف میکند. دقت کنید کارکرد این tokenizer با standard analyzer که قبلتر معرفی شد، متفاوت است!
- Whitespace tokenizer: این tokenizer متن مورد نظر را بر اساس تشخیص کاراکتر " " تجزیه و به مجموعهای از term ها تبدیل میکند. دقت کنید کارکرد این tokenizer را با whitespace analyzer که قبلتر معرفی شد، متفاوت است!
نکته: تفاوت کارکرد tokenizer های معرفی شده با analyzer های مشابه خود این است که امکان ترکیب این tokenizer ها با character filter و token filter های دیگر وجود دارد درحالیکه برای analyzer ها این امکان وجود ندارد!
- N-gram tokenizer: این tokenizer ابتدا متن را بر اساس لیستی از کاراکترهای معرفی شده برای آن، تجزیه کرده و به مجموعهای از term ها تبدیل میکند. سپس از term های تولید شده N-gram تولید میکند. N-gram همانند یک اسلاید روی کاراکترهای هر term حرکت کرده و دنبالهی پیوستهای از حروف را با طول مشخص شده جدا کرده و term های جدیدی تولید میکند. برای مثال عبارت "موتور جستجو" را با تنظیم مقدار 3 برای طول N-gram، به term های زیر تبدیل میکند:
موت | وتو | تور | جست | ستج | تجو
- Edge N-gram tokenizer: مشابه N-gram tokenizer عمل میکند با این تفاوت که فقط از ابتدای متن شروع به تولید N-gram ها خواهد کرد. برای مثال عبارت "موتور جستجو" با تنظیم مقدار 3 تا 4 برای N-gram، به term های زیر تبدیل میشود:
موت | موتو | جست | جستج
این tokenizer مناسب شرایطی است که بخواهیم عبارت مورد جستجو و در حال تکمیل کاربر را تطبیق دهیم. برای مثال کاربر با نوشتن "نمایشگ" نتایج مربوط به نمایشگاهها را مشاهده کند!
- Pattern tokenizer: این tokenizer بر مبنای الگوی regular expression تعیین شده، متن مورد نظر را به term ها تجزیه میکند. برای مثال اگر بخواهیم متن مورد نظر بر اساس هر یک از کاراکترهای "," و "/" و "\" به term های مجزا تبدیل شود.
مهمترین token filter ها در Elasticsearch
- Lowercase token filter: حروف term های دریافت شده را به صورت lowercase درمیآورد.
- Uppercase token filter: حروف term های دریافت شده را به صورت uppercase درمیآورد.
- N-gram token filter: از نظر کارکرد مشابه N-gram tokenizer که قبلتر اشاره شد، عمل میکند اما به عنوان یک token filter قابل ترکیب با سایر token filter ها است.
- Edge N-gram token filter: از نظر کارکرد مشابه Edge N-gram tokenizer که قبلتر اشاره شد، عمل میکند اما به عنوان یک token filter قابل ترکیب با سایر token filter ها است.
- Unique token filter: این فیلتر term های تکراری را حذف میکند.
- Shingle token filter: این فیلتر مشابه N-gram token filter عمل میکند با این تفاوت که N-gram های تولید شده بر روی حروف term ها نبوده بلکه بر روی term های مجاور انجام میشود. برای مثال با تنظیم مقدار 2 برای تعداد term ،N-gram های "بهترین"، "برنامهنویس"، "سال" به مجموعهی زیر تبدیل میشود:
بهترین | بهترین برنامهنویس | برنامهنویس | برنامهنویس سال | سال
- Stop token filter: این فیلتر بر مبنای لیستی از کلمات بیاثر (stop word) تعیین شده، کلمات بیاثر را از مجموعهی term ها حذف میکند. برای مثال term های "برنامهنویسی"، "در"، "سکانآکادمی" به term های زیر تبدیل میشود:
برنامهنویسی | سکانآکادمی
- Synonym graph token filter: این فیلتر بر مبنای لیستی از عبارات هممعنی تعیین شده، term های جدیدی به مجموعه اولیه اضافه میکند. برای مثال با فرض اینکه کلمات "دیتابیس" و "database" به عنوان هممعنی معرفی شده باشند، مجموعه term های "دیتابیس"، "ساختاریافته" به term های زیر تبدیل میشود:
دیتابیس |database | ساختاریافته
از این فیلتر معمولا در زمان اجرای کوئری جستجو استفاده میشود.
در این قسمت با مهمترین ابزارهایی که در دنیای analyzer ها وجود دارد، آشنا شدیم. البته جزییات مربوط به تنظیمات هریک از آنها را باید در قالب مثالهای عملی تمرین کنید. در قسمت آینده چند مثال از ایجاد analyzer دلخواه با استفاده از ابزارهای معرفی شده را بررسی خواهیم کرد.