آشنایی با قواعد کلی زبان Query در Elasticsearch

آشنایی با قواعد کلی زبان Query در Elasticsearch

تا این بخش از دوره آموخته‌ایم که چگونه با استفاده از API های Elasticsearch اقدام به تعریف تنظیمات index کرده و داده‌ها (document) را در آن‌ها مدیریت کنیم. پس از آن وارد دنیای analyzer ها در Elasticsearch شدیم و دیدیم که با استفاده از کامپوننت‌های مختلف در این حوزه چگونه می‌توانیم داده‌های متنی خود را تجزیه و تحلیل کرده و برای فرایند جستجو آماده کنیم.

 در این فصل قصد داریم کار با زبان Query در Elasticsearch را بیاموزیم و با استفاده از این Query ها بتوانیم در داده‌های ایندکس‌شده جستجو کنیم. مطالبی که در ادامه‌ی این فصل بررسی خواهیم کرد با عنوان Query DSL(domain Specific Language) توسط Elasticsearch معرفی شده است که به معنای زبان پرس‌و‌جوی اختصاصیِ Elasticsearch می‌باشد. این زبان پرس‌و‌جو بر مبنای فرمت JSON تعریف شده است و در API های جستجو به سادگی قابل استفاده خواهد بود.

Query DSL همانند یک درخت صرف و نحو انتزاعی (Abstract Syntax Tree) می‌باشد، به این معنی که عبارات(کوئری‌های) آن به دو حالت تفسیر می‌شوند:

  • Leaf query clauses (عبارت‌های کوئری مستقل): این کوئری‌ها یک مقدار را در یک field جستجو کرده و به صورت مستقل و بدون نیاز به کوئری دیگری، امکان استفاده از آن‌ها وجود دارد.
  • Compound query clauses (عبارت‌های کوئری مرکب): این کوئری‌ها دربردارنده‌ی سایر کوئری‌های leaf یا compound بوده و یک کوئری مرکب را به وجود می‌آورند (کوئری‌های ترکیب‌شده ارتباط منطقی با یکدیگر خواهند داشت و یا رفتار آن‌ها تحت تاثیر کوئری بالاتر قرار خواهد گرفت.)

به عنوان مثال API زیر را در نظر بگیرید:

GET _search
{
  "query": {
    "bool": {
      "filter": [
        {
          ...
        },
        {
          ...
        }
      ],
      "should": [
        {
          ...
        }
      ]
    }
  }
}

در مثال بالا کلید bool معرف یک کوئری compound است که داخل خود شامل چندین کوئری دیگر خواهد بود (در کلید‌های filter و should). نگران نباشید جزییات این کوئری‌ها را در ادامه‌ی این فصل بررسی خواهیم کرد.

موضوع مهم دیگر در خصوص Query DSL این است که یک کوئری جستجو در Elasticsearch تنها وظیفه‌ی تطبیق داده‌ها با عبارت مورد جستجو را ندارد بلکه علاوه بر آن، این قابلیت را نیز دارد که اعلام کند هر محتوای منطبق‌شده چه میزان با مورد جستجو‌شده نزدیک(مرتبط) است و امتیاز میزان ارتباط (Relevance score) نتایج جستجو را محاسبه ‌کند. شاید اینجا دقیقا همان نقطه‌ای باشد که تفاوت میان search و full-text search خودنمایی کند. در خصوص الگوریتم محاسبه‌ی امتیاز در قسمت بعدی صحبت خواهد شد. 

حال با توجه به اینکه کوئری‌ها در Elasticsearch دو قابلیت گفته شده (1_تطبیق داده‌ها و 2_محاسبه امتیاز میزان ارتباط) را دارند، می‌توانیم در مورد زمینه (Context) کوئری‌ها صحبت کنیم. در Elasticsearch کوئری‌ها در دو زمینه قابلیت اجراشدن دارند:

  • Filter context: در این زمینه کوئری مدنظر تنها وظیفه‌ی تطبیق داده‌ها را بر عهده می‌گیرد و هیچ امتیازی برای میزان تطبیق محاسبه نخواهد شد. Elasticsearch به صورت خودکار کوئری‌هایی که به طور مکرر در این زمینه اجرا شوند را cache می‌کند. به عبارتی کوئری در این زمینه تنها به سوال اینکه "آیا محتوای یک سند با مقدار جستجو‌‌شده تطبیق دارد یا خیر؟" پاسخ خواهد داد.
  • Query context: در این زمینه علاوه بر تطبیق داده‌ها، میزان کیفیت ارتباط نتایج با مقدار مورد جستجو نیز محاسبه خواهد شد. به عبارتی در این زمینه کوئری علاوه بر سوال بالا به سوال "چه میزان تطبیق میان محتوای یک سند با مقدار جستجو‌شده وجود دارد؟" نیز پاسخ خواهد داد.

 

در قسمت آینده نگاهی به روش الگوریتم محاسبه امتیاز در Elasticsearch خواهیم داشت و فاکتور‌های موثر در آن را بررسی می‌کنیم، سپس در ادامه‌ی فصل به معرفی انواع کوئری‌ها و شیوه‌ی کارکرد آن‌ها خواهیم پرداخت.