با عرض سلام یه جدولی دارم یک میلیون رکورد داره و تعداد ستون ها آن هفت عدد هستش
کد سرچ بر اساس عملگر لایک هستش و با ایجکس سرچ میکنم به این صورت که بعد از تایپ حداقل سه کلمه میاد سرچ میکنه اما سرعت سرچ بسیار پایین هستش ؟ راه حل چی میتونه باشه ؟ ممنون از راهنمایتون
کد قسمت مدل :
public function scopeSearch($query , $keywords)
{
$query->where('Huvudparagraf' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Stycke1' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Stycke2' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Stycke3' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Stycke4' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Stycke5' , 'LIKE' , '%' . $keywords . '%')
->orWhere('Text' , 'LIKE' , '%' . $keywords . '%');
return $query;
}
و اینم کد قسمت کنترلر :
$keywords = request('keywords');
$Laws = Law::search($keywords)->latest('id')->get();
از ترکیب کش + صف استفاده کنید.
۱− یک صف تنظیم کنید و محاسباتی که باید انجام بشه رو بزارید توی صف.
۲− هر دفعه که صف ران میشه و محاسبات رو انجام میده اون رو کش کنید.
۳− اپلیکیشن شما از مقدار داخل کش استفاده کنه که باعث میشه سرعتش بالاتر بره
صف و اپلیکیشن میتونن به صورت همروند کار کنن و روی همدیگه تاثیر چندانی ندارن.
سلام.
بنده دو پیشنهاد دارم که در کنار بقیه راه حل هایی که دوستان دادن میتونید استفاده کنید:
الستیک سرچ کارش یه چیز دیگه هست. سرچ میکنه اما نه اینکه واسه یه چیز عادی بیایم ازش استفاده کنیم. واسه نون گرفتن که هواپیما روشن نمیکنن برن تا نونوایی
من با حرف @khanzadimahdi موافق نیستم
اتفاقا محل استفاده از الستیک همینجاست شما میخواهید یک سرچ روی یک جدول با تعداد رکورد بالا بزنید و به صورت ایجکس و لایو نتایج به کاربر نشون بدید
الاستیک مخصوص همین کار هست.
البته که کش کردن هم میتونه کارساز باشه ولی با استفاده از الستیک میتونید خیلی راحت تعداد رکورد های خیلی بالاتری را هم حتی هندل بکنید.
پیشنهاد میکنم لینک زیر رو مطالعه کنید. همچنین پیاده سازی الاستیک سرچ باید به درستی انجام بشه وگرنه نتایج مختلفی بهتون میده که میتونه اشتباه باشه.
https://www.elastic.co/blog/found-uses-of-elasticsearch
لایو بودن و سرعت بالا ربطی به الاستیک سرچ نداره. همچنین تعداد رکورد بالا هم ربطی به الاستیک سرچ نداره. تمامی دیتابیس ها با رکورد بالا میتونن کار کنن. اما هر دیتابیسی برای کار خاصی ساخته شده.
@khanzadimahdi
این روش دوستمون عادی نیست داره چندین کوئری روی داده هاش اعمال میکنه و شاید هم بخواد بیشترش کنه یا جستجو رو پیشرفته ترش کنه، داده هاش هم یک میلیون هست و شاید هم بیشتر بشه .
وقتی منابع سرور کافی در دست نداری بهترین روش استفاده از این سرچ انجین هست.
Elasticsearch is used for a lot of different use cases: "classical" full text search, analytics store, auto completer, spell checker, alerting engine, and as a general purpose document store. This article gives a brief overview of different common uses and important things to consider, with pointers to where you can learn more about them.
It surprises many that simple searching is among the least resource intensive tasks you can ask of Elasticsearch. If all you require is the top ten results for a regular, non-fuzzy match query, you can sustain hundreds of searches per second on collections of tens of millions of documents on inexpensive hardware. However, when you add fuzzy searching or faceted navigation to the list of requirements, the CPU and memory needs increase a lot.
همین دوتا پاراگراف از لینکی که دادید فکر کنم جواب بده که الستیک خیلی خوب میتونه انواع سرچ که سرچ ساده هم جزوش هست را با بهترین نحو انجام بده.
و فکر نکنم بتونید با mysql صدها فول تکست سرچ روی ده ها میلیون رکورد با کمترین سخت افزار و با بهترین سرعت انجام بدید.
@ariaieboy
واقعا نمیدونم چرا اینقدر اصرار دارن که الستیک سرچ برای کار دوستمون مناسب نیست :))))))
@juza66
@ariaieboy
ایشون میخواد یه سرچ ساده بزنه روی دیتابیس. نمیخواد کار دیگه ای انجام بده. شما واسه یه سرچ ساده کلا یه تکنولوژی جدید که پروژه اظافه میکنی؟ یا اینکه با همین چیزایی که داری بهینه تر میکنی کاراتو؟
الاستیک سرچ واسه سرچ زدن هست نه اینکه بخوای یه کوئری ساده ران کنی. سرچ زدن انواع مختلفی از الگوریتم ها داره و روش های مختلفی داره اما چیزی که اینجا میخوایم انجامش بدیم یه چیز کاملا تکراری هست. همین رو اگه با الاستیک سرچ هم انجام بدین سرعتش بازم تفاوت چندانی نمیکنه میتونید تست کنید.
و اینکه اگه بخواد از الاستیک استفاده کنه باید کل اون یک میلیون رکورد رو توی الاستیک سرچ هم وارد کنه. به نظر شما از لحاظ عقلانی کار درستیه؟ واسه یه کوئری ساده دوتا دیتابیس داشته باشید یکی الاستیک و یکی دیتابیس اصلی که همین یه کوئری رو بتونید ران کنید!
روشی که @khanzadimahdi میگند، کاملا بهینه هست و بار رو از روی سرور بر میداره...
استفاده از یه دیتابیس جدا، تنها برای سرچ گزینه چندان خوبی نیست
اگر به جستجوی سریع احتیاج دارید.. میتونید سرویس الگولیا رو هم بررسی کنید
https://www.algolia.com/
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟