مشروع ممتع لكتابة محرك بحث صغير ساذج مناسب لـ Small Data™.
تشغيل اختبارات الوحدة:
mix test --exclude external
قم بإجراء كافة الاختبارات، بما في ذلك تلك التي تعتمد على الخدمات الخارجية. مثل اختبارات RedisIndex
:
mix test
تأكد من أن لديك سلسلة الاتصال الصحيحة لـ redis في config/config.exs . يمكنك استخدام docker-compose
لإعداد مثيل redis وتشغيله بسرعة.
يتم تمثيل كل فهرس في Cedrik بعملية باستخدام Index
@behaviour
. لفهرسة شيء ما في فهرس، ما عليك سوى الاتصال Index.index_doc(something, :index_name, type)
حيث سيكون something
عبارة عن خريطة أو بنية Elixir (أوصي بإنشاء بنية، مع حقل معرف ينفذ البروتوكول Storable
- قم بإلقاء نظرة على lib/document.ex
و lib/agent_store.ex
كمرجع)، يجب أن يكون type
أحد تطبيقات الفهرس الموجودة AgentIndex
أو RedisIndex
. الوسيطة الأخيرة لـ Index.index_doc
اختيارية ويتم تعيينها افتراضيًا على AgentIndex
.
للحصول على قائمة بالمؤشرات الموجودة، استخدم Index.list/0
أو Index.list/1
- سيُرجع هذا قائمة من المجموعات بالتنسيق {pid, name, module}
هذا هو نوع فهرس الذاكرة الساذج، وهو مناسب للأشياء التي تناسب الذاكرة ولا تحتاج إلى الاستمرار.
هذا فهرس مدعوم بـ redis. يجب أن يكون لديك مثيل redis قيد التشغيل حتى يعمل هذا. الميزة الرئيسية لاستخدام RedisIndex مقارنةً بـ AgentIndex هي عندما تريد أن تكون قادرًا على استمرار البيانات.
في الوقت الحالي، الرمز المميز هو ببساطة أي سلسلة مفصولة بمسافات.
استخدم Search.search(query_struct, [:index1, :index2])
، راجع test/e2e_test.exs
و test/query_test.exs
للحصول على أمثلة.
للحصول على query_struct
يفهمها سيدريك، يوجد محلل بسيط (وغير كامل) للسلاسل: Query.Parse.parse/1
. سيقوم بترميز السلاسل ثم إنشاء بنيات استعلام Term وWildcard وفقًا لذلك. سيتم تغليف المصطلحات وأحرف البدل في قيمة منطقية، داخل حقل "الضرورة".
سيعيد هذا الاستعلام جميع معرفات المستندات في الفهارس المحددة.
يقوم TermQuery ببساطة بإرجاع معرفات المستندات (ومواقع المصطلح داخل هذا المستند) التي تحتوي على المصطلح المحدد. يمكنك تحديد الحقول التي تريد البحث فيها بالضبط، أو تحديدها جميعًا (وهو الإعداد الافتراضي).
باستخدام BooleanQuery، يمكنك إنشاء استعلامات أكثر تقدمًا. must
، optional
و must_not
يمكن أن يساعد هذا الاستعلام في توسيع نطاق نتائجك. استعلام Wildcard ذو القيمة "foo*"
يطابق كلاً من foo وfoobar على سبيل المثال. لاحظ أنه يتم دعم أحرف البدل الفردية فقط في الوقت الحالي، إما بادئة ( *foo
) أو لاحقة ( foo*
)
في الوقت الحالي، ستمنحك نتائج Search.search/2
قائمة بالصفوف التي تبدو كما يلي: {doc_id, #MapSet<[%Location{field: :field, position: x}]>}
مرتبة حسب العناصر التي حصلت على أكبر عدد من النتائج أولاً.