نسخه سازی اسناد در آمازون OpenSearch Service: OpenSearch به عنوان منبع حقیقت. قسمت 3

در بحث قبلی ما ، ما با استفاده از یک پایگاه داده اصلی به عنوان منبع حقیقت ، تأکید کردیم که OpenSearch به عنوان یک لایه جستجو خدمت می کند. با این حال ، سناریوهای خاص مستلزم مدیریت نسخه اسناد به طور مستقیم در OpenSearch هستند. این مقاله به بررسی استراتژی هایی برای رسیدگی به نسخه های اسناد در OpenSearch می پردازد.
یک روش مؤثر برای مدیریت نسخه اسناد شامل استفاده از دو شاخص جداگانه است:
1. شاخص تغییر ناپذیر:
- هدف: هر نسخه اسناد را به عنوان یک رکورد تغییر ناپذیر ذخیره می کند و یک مسیر حسابرسی کامل را ارائه می دهد.
- مزیت: تضمین می کند که هیچ نسخه ای رونویسی نشده است ، که برای انطباق و تحلیل تاریخی بسیار مهم است.
2. فهرست رابط جستجو:
- هدف: فقط شامل آخرین نسخه هر سند است.
- مزیت: برای بازیابی سریع و نمایش داده های کارآمد بهینه شده است ، زیرا میزان داده ها را برای جستجو کاهش می دهد.
تجارت: در حالی که این روش دوگانه با انطباق و قابلیت شنیدن ، به طور قابل توجهی ذخیره سازی داده ها و عملیات نمایه سازی را به میزان قابل توجهی افزایش می دهد. حفظ دو شاخص به معنای هزینه های مصرف بالاتر ، افزایش مصرف ذخیره سازی و اجرای پرس و جو پیچیده تر است ، زیرا هر دو شاخص باید هماهنگ باشند.
هنگام رسیدگی به اسناد تغییر ناپذیر با نسخه در OpenSearch ، یک چالش مهم تضمین نتایج جستجو تنها آخرین نسخه های اسناد را هنگام حفظ محتوای قدیمی تر برای مرجع تاریخی منعکس می کند. به جای اصلاح شاخص ها یا اضافه کردن پرچم مانند is_latest
، ما می توانیم با یک پرس و جو بهینه شده به این هدف برسیم:
- اسنادی را پیدا می کند که اصطلاح جستجو در هر یک از جدیدترین ها ظاهر می شود (
searchableText
) یا نسخه های قبلی (oldVersionsText
). - اسناد منسوخ را که در آن اصطلاح فقط در آن ظاهر می شود ، مستثنی می کند
oldVersionsText
بشر - تضمین می کند که فقط آخرین سند در هر
relationId
برگردانده شده است
نام فهرست: test_index
زمینه های ذخیره شده:
-
relationId
(کلمه کلیدی) – گروه های مختلف یک سند را گروه بندی می کنند. -
searchableText
(متن) – جدیدترین محتوای قابل جستجو را ذخیره می کند. -
oldVersionsText
(متن) – نسخه های قبلی محتوا را ذخیره می کند. -
update_time
(تاریخ) – جدول زمانی آخرین بروزرسانی سند.
نحوه مدیریت داده ها:
-
به روزرسانی های سند: هنگامی که یک سند به روز می شود ، نسخه جدیدی درج می شود. محتوای نسخه قبلی به
oldVersionsText
بشر -
تعیین آخرین نسخه: در
update_time
از این زمینه برای شناسایی جدیدترین نسخه استفاده می شود.
توجه مهم: ذخیره نسخه های قدیمی تر در هر سند ، اندازه شاخص را به میزان قابل توجهی افزایش می دهد. با گذشت زمان ، این می تواند بر عملکرد و هزینه های ذخیره سازی تأثیر بگذارد. این روش ، در حالی که در برخی از سناریوها مؤثر است ، یک پرس و جو چند مرحله ای را معرفی می کند ، که ممکن است در مقیاس به یک تنگنا عملکرد تبدیل شود.
اگر فقط جستجو کنیم searchableText
، ممکن است ما نتایج مربوطه را از دست ندهیم زیرا آخرین نسخه ممکن است حاوی اصطلاح جستجو نباشد ، در حالی که نسخه قدیمی تر چنین می کند.
به عنوان مثال:
- سندی در ابتدا حاوی “بهینه سازی عملکرد OpenSearch” در
searchableText
بشر - بعداً ، این سند به “تکنیک های پیشرفته OpenSearch” به روز می شود و متن قبلی را به سمت آن منتقل می کند
oldVersionsText
بشر - جستجوی “بهینه سازی عملکرد” فقط سند منسوخ شده را پیدا می کند مگر اینکه پرس و جو را اصلاح کنیم.
- جستجو در
searchableText
وتoldVersionsText
بشر - تضمین می کند که اگر اصطلاح جستجو فقط در ظاهر شود
oldVersionsText
، سند منسوخ حذف شده است. - فقط جدیدترین نسخه هر سند را بازیابی می کند.
مرحله 1: فهرست را ایجاد کنید
PUT test_index
{
"mappings": {
"properties": {
"relationId": {"type": "keyword"},
"latestContent": {"type": "text"},
"oldVersionsText": {"type": "text"},
"update_time": {"type": "date"}
}
}
}
مرحله 2: اسناد نمونه را وارد کنید
POST test_index/_bulk
{"index": {"_id": "1"}}
{"relationId": "doc1", "latestContent": "OpenSearch advanced techniques", "oldVersionsText": ["OpenSearch performance optimization"], "update_time": "2025-03-12T12:00:00Z"}
{"index": {"_id": "2"}}
{"relationId": "doc2", "latestContent": "OpenSearch index tuning", "oldVersionsText": [], "update_time": "2025-03-12T13:00:00Z"}
{"index": {"_id": "3"}}
{"relationId": "doc1", "latestContent": "OpenSearch performance optimization", "oldVersionsText": [], "update_time": "2025-03-11T10:00:00Z"}
مرحله 3: پرس و جو بهینه شده را اجرا کنید
این پرس و جو تضمین می کند:
- اصطلاح جستجو در ظاهر می شود
searchableText
یاoldVersionsText
بشر - اسنادی که این اصطلاح فقط در آن ظاهر می شود
oldVersionsText
مستثنی هستند - فقط آخرین نسخه سند در هر
relationId
برگردانده شده است
GET test_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "latestContent": "performance optimization" } },
{ "match": { "oldVersionsText": "performance optimization" } }
],
"minimum_should_match": 1,
"must_not": {
"bool": {
"must": [
{ "match": { "oldVersionsText": "performance optimization" } },
{ "bool": { "must_not": { "match": { "latestContent": "performance optimization" } } } }
]
}
}
}
},
"sort": [{ "update_time": "desc" }]
}
-
پوشش دو زمینه ای: در
should
بند تضمین می کند که اگر یک اصطلاح “بهینه سازی عملکرد” در آخرین محتوا باشد ، یک سند در نظر گرفته می شود (latestContent
) یا در نسخه های قدیمی (oldVersionsText
). این تضمین می کند که ما هر سندی را ضبط می کنیم که بدون توجه به این که این زمینه این اصطلاح را دارد ، ممکن است مرتبط باشد. -
محرومیت از مسابقات منسوخ: در
must_not
بند بسیار مهم است – به طور خاص اسنادی را که اصطلاح در آن ظاهر می شود حذف می کند تنها درoldVersionsText
بشر این بدان معنی است که اگر آخرین نسخه یک سند شامل اصطلاح جستجو نباشد ، حتی اگر نسخه قدیمی تر نیز انجام شود ، آن سند بازگردانده نمی شود. ساختار داخلی برای مطابقت با اسناد درoldVersionsText
اما یک مسابقه را از دست دادlatestContent
بشر فقط این اسناد فیلتر می شوند. -
مرتب سازی بر اساس زمان به روزرسانی: در
sort
پارامتر نتایج را توسطupdate_time
به ترتیب نزولی ، اطمینان از اینکه جدیدترین نسخه ها در اولویت قرار دارند.
-
همه اسناد مربوطه را بازیابی می کند – تضمین می کند که ما اسنادی را که این اصطلاح در هر دو ظاهر می شود از دست ندهیم
searchableText
وتoldVersionsText
بشر - از بازگشت اسناد منسوخ به تنهایی جلوگیری می کند – اگر این اصطلاح فقط در یک نسخه قدیمی ظاهر شود ، ما آن را حذف می کنیم.
-
نیازی به
**is_latest**
پرچم ها یا اصلاحات فهرست – با استفاده از فیلتر در سطح پرس و جو ، نمایه سازی را ساده می کند. - دقت و کارآیی را متعادل می کند – از قابلیت های فیلتر OpenSearch بدون پردازش اضافی استفاده می کند.
-
تأثیر اندازه شاخص: ذخیره نسخه های قبلی در
oldVersionsText
اندازه شاخص را با گذشت زمان افزایش می دهد. اگر به روزرسانی اسناد مکرر باشد ، این ممکن است به یک استراتژی پاکسازی نیاز داشته باشد. - پیچیدگی پرس و جو: این رویکرد شامل چندین مرحله در اجرای پرس و جو (جستجو در هر دو زمینه ، فیلتر و مرتب سازی) است که می تواند منجر به عملکرد شود
- مقیاس پذیری: برای محیط های به روزرسانی یا استقرار در مقیاس بزرگ ، استراتژی های پاکسازی دوره ای یا حتی معماری های جایگزین (به عنوان مثال ، رویکرد دو هند) را برای حفظ عملکرد در نظر بگیرید.
مدیریت نسخه اسناد به طور مستقیم در OpenSearch ذاتاً پیچیده است. در حالی که OpenSearch می تواند به عنوان منبع حقیقت برای اسناد نسخه شده باشد ، این راه حل مستقل بهینه برای همه محیط های تولیدی نیست. هیچ پاسخی یک اندازه وجود ندارد. همانطور که بسیاری از مشاوران باتجربه می گویند ، “این بستگی دارد.” با درک عمیق معاملات ، می توانید رویکردی را که به بهترین وجه متناسب با مورد استفاده خاص شما باشد ، انتخاب و تنظیم کنید.
این استراتژی تک شاخصی تصفیه شده ، با استفاده از پرس و جو بهینه شده در بالا ، وسیله ای قدرتمند برای بازیابی تنها آخرین نسخه های مربوط به اسناد مربوطه در حالی که هنوز هم یک تاریخچه جامع از تغییرات را حفظ می کند ، فراهم می کند.