ميليبحث هو محرك بحث سريع ومفتوح المصدر يقدم بحثًا فوريًا ومتسامحًا مع الأخطاء المطبعية بأقل قدر من الإعداد – وهو بديل أبسط لـ Elasticsearch لمعظم التطبيقات. يضيف هذا الدليل بحثًا قويًا إلى تطبيق الويب بدءًا من التثبيت وحتى تكامل الواجهة الأمامية.
📋 Table of Contents
لماذا ميليسيرتش؟
- البحث الفوري: استجابات أقل من 50 مللي ثانية، تظهر النتائج أثناء الكتابة
- التسامح مع الخطأ المطبعي: يجد النتائج بالرغم من الأخطاء الإملائية
- إعداد بسيط: أسهل بكثير من Elasticsearch — الإعدادات الافتراضية المعقولة
- مفتوح المصدر: استضافة ذاتية ومجانية، مع خيار السحابة
- أهمية كبيرة: نتائج جيدة بدون ضبط معقد
تشغيل ميليسيرتش
# Run with Docker (easiest)
docker run -d --name meilisearch -p 7700:7700 \
-e MEILI_MASTER_KEY="your-master-key" \
getmeili/meilisearch:latest
# Verify it's running
curl http://localhost:7700/health
# {"status":"available"}
فهرسة البيانات
npm install meilisearch
import { MeiliSearch } from 'meilisearch';
const client = new MeiliSearch({
host: 'http://localhost:7700',
apiKey: 'your-master-key',
});
// Create an index and add documents
const index = client.index('products');
await index.addDocuments([
{ id: 1, name: 'Wireless Keyboard', category: 'Peripherals', price: 89 },
{ id: 2, name: 'Mechanical Keyboard', category: 'Peripherals', price: 129 },
{ id: 3, name: 'USB-C Hub', category: 'Accessories', price: 45 },
]);
// Each document needs a unique 'id' field (or configure the primary key)
البحث الأساسي
// Simple search - typo-tolerant automatically
const results = await index.search('keybord'); // note the typo
console.log(results.hits);
// Still finds both keyboards despite the misspelling
// Search with options
const results = await index.search('keyboard', {
limit: 20,
attributesToHighlight: ['name'], // highlight matches
attributesToRetrieve: ['id', 'name', 'price'],
});
تكوين الحقول القابلة للبحث والتصفية
// Set which fields are searchable (and their priority order)
await index.updateSearchableAttributes([
'name', // highest priority
'category',
'description',
]);
// Set filterable attributes for faceted filtering
await index.updateFilterableAttributes(['category', 'price']);
// Set sortable attributes
await index.updateSortableAttributes(['price']);
التصفية والواجهات
// Filter results
const results = await index.search('keyboard', {
filter: 'category = "Peripherals" AND price < 100',
});
// Faceted search - get counts per category
const results = await index.search('keyboard', {
facets: ['category'],
});
console.log(results.facetDistribution);
// { category: { Peripherals: 2, Accessories: 0 } }
// Sort results
const results = await index.search('keyboard', {
sort: ['price:asc'],
});
تكامل الواجهة الأمامية (بحث فوري)
// React example - search as you type
import { useState, useEffect } from 'react';
import { MeiliSearch } from 'meilisearch';
// Use a SEARCH-ONLY key on the frontend, never the master key
const client = new MeiliSearch({
host: 'https://search.example.com',
apiKey: 'search-only-key', // scoped key with search-only permissions
});
function Search() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
useEffect(() => {
if (!query) { setResults([]); return; }
const timer = setTimeout(async () => {
const res = await client.index('products').search(query, { limit: 10 });
setResults(res.hits);
}, 150); // debounce - avoid a request on every keystroke
return () => clearTimeout(timer);
}, [query]);
return (
<div>
<input value={query} onChange={e => setQuery(e.target.value)}
placeholder="Search..." />
<ul>
{results.map(hit => <li key={hit.id}>{hit.name}</li>)}
</ul>
</div>
);
}
الحفاظ على مزامنة الفهرس
// Update the index when your data changes
async function onProductCreated(product) {
await index.addDocuments([product]);
}
async function onProductUpdated(product) {
await index.updateDocuments([product]); // upserts by id
}
async function onProductDeleted(productId) {
await index.deleteDocument(productId);
}
// Call these from your app's create/update/delete handlers to keep
// search results current with your database.
الأمان: استخدم مفاتيح API ذات النطاق
// NEVER expose the master key to the frontend.
// Create a search-only key for client use:
const searchKey = await client.createKey({
actions: ['search'],
indexes: ['products'],
expiresAt: null,
});
// Use searchKey.key on the frontend - it can only search, not modify
الأسئلة المتداولة
س: Meilisearch أو Elasticsearch؟
ج: يتميز Meilisearch بالبساطة والبحث الفوري والتسامح مع الأخطاء المطبعية مع الحد الأدنى من الإعداد – وهو أمر رائع لمعظم التطبيقات. Elasticsearch للحصول على تحليلات واسعة النطاق ومعقدة وميزات متقدمة. لإضافة بحث إلى تطبيق ويب نموذجي، يعد Meilisearch أبسط بكثير وأكثر كفاية.
س: البحث عن النص الكامل لـ Meilisearch أو PostgreSQL؟
ج: يتجنب بحث PostgreSQL البنية التحتية الإضافية (يستخدم قاعدة البيانات الموجودة لديك) ويتعامل مع العديد من التطبيقات بشكل جيد. يوفر Meilisearch تسامحًا أفضل مع الأخطاء المطبعية، والبحث الفوري في تجربة المستخدم، والواجهات خارج الصندوق، على حساب تشغيل خدمة منفصلة ومزامنة البيانات. اختر بناءً على ما إذا كانت جودة البحث في تجربة المستخدم تبرر الخدمة الإضافية.
س: كيف أحافظ على تزامن فهرس البحث مع قاعدة البيانات الخاصة بي؟
ج: قم بتحديث فهرس Meilisearch كلما تغيرت بياناتك – اتصل بـ addDocuments/updateDocuments/deleteDocument من معالجات الإنشاء/التحديث/الحذف الخاصة بتطبيقك. للمزامنة المجمعة، قم بإعادة الفهرسة بشكل دوري. الفهرس منفصل عن قاعدة البيانات الخاصة بك، لذا يجب عليك الاحتفاظ به متزامنًا.
س: هل البحث من الواجهة الأمامية آمن؟
ج: نعم، إذا كنت تستخدم مفتاح واجهة برمجة التطبيقات (API) المخصص للبحث فقط (ليس المفتاح الرئيسي أبدًا). قم بإنشاء مفتاح باستخدام إجراء “البحث” فقط لفهارس محددة، واستخدمه في الواجهة الأمامية. يجب أن يظل المفتاح الرئيسي من جانب الخادم فقط، حيث يمكنه تعديل البيانات.
س: هل يمكن لـ Meilisearch التعامل مع مجموعات البيانات الكبيرة؟
ج: إنه يتعامل مع ملايين المستندات بشكل جيد وبأداء جيد. بالنسبة للتحليلات واسعة النطاق للغاية (مئات الملايين) أو المعقدة، قد يكون Elasticsearch أكثر ملاءمة. بالنسبة لمعظم تطبيقات الويب – التجارة الإلكترونية، والمحتوى، وSaaS – يتوسع Meilisearch بشكل أكثر من كافٍ.
الخلاصة
يجعل Meilisearch إضافة بحث سريع ومتسامح مع الأخطاء المطبعية إلى تطبيق ويب أمرًا بسيطًا بشكل ملحوظ – أسهل بكثير من Elasticsearch بالنسبة لمعظم الاحتياجات. الإعداد:قم بتشغيل Meilisearch (Docker)، وفهرسة مستنداتك، وتكوين السمات القابلة للبحث والتصفية، ودمج البحث الفوري على الواجهة الأمامية باستخدام مدخلات محظورة ومفتاح واجهة برمجة التطبيقات (API) للبحث فقط. حافظ على مزامنة الفهرس عن طريق تحديثه من معالجات تغيير البيانات في تطبيقك. يمكنك الحصول على بحث أقل من 50 مللي ثانية، والتسامح مع الأخطاء المطبعية، والواجهات، والتصفية خارج الصندوق بأقل قدر من التكوين. بالنسبة للتجارة الإلكترونية ومواقع المحتوى ومعظم تطبيقات SaaS، يقدم Meilisearch تجربة بحث ممتازة دون تعقيد البنية التحتية الثقيلة للبحث – وهو خيار رائع عندما تريد تجربة بحث عالية الجودة بسرعة.
🔗 Share this article
✍️ Leave a Comment