Elasticsearch ، Sphinx ، Lucene ، Solr ، Xapian. ما الذي يناسب الاستخدام؟ [مغلق

StackOverflow https://stackoverflow.com/questions/2271600

سؤال

أنا أبحث حاليًا في أساليب البحث الأخرى بدلاً من الحصول على استعلام ضخم SQL. لقد رأيت Elasticsearch في الآونة الأخيرة ولعب مع Whoosh (تنفيذ Python لمحرك البحث).

هل يمكنك إعطاء أسباب لاختيارك (اختيارك)؟

هل كانت مفيدة؟

المحلول

بصفتي منشئ Elasticsearch ، ربما يمكنني أن أعطيك بعض الأسباب حول سبب المضي قدمًا وأنشأته في المقام الأول :).

استخدام لوكين النقي يمثل تحديًا. هناك العديد من الأشياء التي تحتاجها إلى الاعتناء بها إذا كنت تريد أن تؤديها جيدًا ، وأيضًا ، مكتبة ، لذلك لا يوجد دعم موزع ، إنها مجرد مكتبة Java مضمنة تحتاج إلى صيانتها.

من حيث قابلية استخدام Lucene ، في طريق العودة عندما (ما يقرب من 6 سنوات حتى الآن) ، قمت بإنشاء Compass. كان هدفها هو تبسيط استخدام Lucene وجعل Lucene كل يوم أبسط. ما صادفته مرارًا وتكرارًا هو شرط أن أتمكن من توزيع البوصلة. بدأت العمل عليها من داخل البوصلة ، من خلال الاندماج مع حلول شبكة البيانات مثل Gigaspaces ، والتماسك ، والتراكوتا ، لكنها ليست كافية.

في جوهرها ، يجب أن يتم حل حل لوسين الموزعة. أيضًا ، مع تقدم HTTP و JSON كواجهة برمجة تطبيقات في كل مكان ، فهذا يعني أن الحل الذي يمكن استخدام العديد من الأنظمة المختلفة بلغات مختلفة بسهولة.

هذا هو السبب في أنني تقدمت وقمت بإنشاء Elasticsearch. إنه يحتوي على نموذج موزعة متقدم للغاية ، ويتحدث JSON أصلاً ، ويعرض العديد من ميزات البحث المتقدمة ، وكلها معبر عنها بسلاسة من خلال JSON DSL.

SOLR هو أيضًا حل لفضح خادم الفهرسة/البحث عبر HTTP ، لكنني أزعم ذلك Elasticsearch يوفر نموذجًا موزعًا للغاية وسهولة الاستخدام (على الرغم من أنه يفتقر حاليًا إلى بعض ميزات البحث ، ولكن ليس لفترة طويلة ، وعلى أي حال ، فإن الخطة هي الحصول على الجميع بوصلة ميزات في Elasticsearch). بالطبع ، أنا متحيز ، لأنني أنشأت Elasticsearch ، لذلك قد تحتاج إلى التحقق من نفسك.

أما بالنسبة لـ Sphinx ، لم أستخدمها ، لذلك لا يمكنني التعليق. ما يمكنني إحالتك هو هذا الموضوع في منتدى أبو الهول وهو ما أعتقد أنه يثبت النموذج الموزع المتفوق لـ Elasticsearch.

بالطبع ، لدى Elasticsearch العديد من الميزات أكثر من مجرد توزيعها. تم تصميمه بالفعل مع وضع سحابة في الاعتبار. يمكنك التحقق من قائمة الميزات على الموقع.

نصائح أخرى

لقد استخدمت sphinx ، solr و elasticsearch. تم تصميم Solr/Elasticsearch على قمة لوسين. ويضيف العديد من الوظائف الشائعة: واجهة برمجة تطبيقات خادم الويب ، ووجه ، والتخزين المؤقت ، إلخ.

إذا كنت ترغب في الحصول على إعداد بحث كامل بسيط ، فإن Sphinx هو خيار أفضل.

إذا كنت ترغب في تخصيص بحثك على الإطلاق ، فإن Elasticsearch و Solr هما الخيارات الأفضل. إنها قابلة للتمديد للغاية: يمكنك كتابة المكونات الإضافية الخاصة بك لضبط تسجيل النتائج.

بعض الاستخدامات على سبيل المثال:

  • Sphinx: Craigslist.org
  • SOLR: CNET ، Netflix ، digg.com
  • Elasticsearch: Foursquare ، Github

نستخدم Lucene بانتظام لفهرسة وبحث عشرات الملايين من المستندات. عمليات البحث سريعة بما فيه الكفاية ، ونحن نستخدم تحديثات تدريجية لا تستغرق وقتًا طويلاً. لقد استغرقنا بعض الوقت للوصول إلى هنا. النقاط القوية في Lucene هي قابلية التوسع ، ومجموعة كبيرة من الميزات ومجتمع نشط من المطورين. يتطلب استخدام Lucene العارية البرمجة في Java.

إذا كنت تبدأ من جديد ، فإن الأداة لك في عائلة لوكين هي سولر, ، وهو أمر أسهل بكثير من إعداده من Lucene ، ولديه كل قوة لوكين تقريبًا. يمكنه استيراد مستندات قاعدة البيانات بسهولة. تتم كتابة SOLR في Java ، لذلك يتطلب أي تعديل لـ SOLR معرفة Java ، ولكن يمكنك القيام بالكثير من خلال تغيير ملفات التكوين.

لقد سمعت أيضًا أشياء جيدة عن أبو الهول ، خاصة بالتزامن مع قاعدة بيانات MySQL. لم تستخدمه ، رغم ذلك.

IMO ، يجب أن تختار حسب:

  • الوظيفة المطلوبة - على سبيل المثال هل تحتاج إلى جذور فرنسية؟ لوكين وسولر لديهما واحدة ، أنا لا أعرف الآخرين.
  • الكفاءة في لغة التنفيذ - لا تلمس Java Lucene إذا كنت لا تعرف Java. قد تحتاج C ++ للقيام بالأشياء مع sphinx. كما تم نقل لوكين في آخر اللغات. هذا مهم في الغالب إذا كنت تريد تمديد محرك البحث.
  • سهولة التجريب - أعتقد أن Solr هو الأفضل في هذا الجانب.
  • التواصل مع البرامج الأخرى - لدى Sphinx واجهة جيدة مع MySQL. يدعم SOLR واجهات Ruby و XML و JSON كخادم مريح. يمنحك Lucene الوصول البرمجي فقط من خلال Java. بوصلة و البحث عن السبات هي أغلفة لوسين التي تدمجها في أطر أكبر.

نستخدم sphinx في مشروع بحث عمودي مع 10.000.000 + من سجلات MySQL و 10+ قاعدة بيانات مختلفة. لقد حصل على دعم ممتاز للغاية لـ MySQL والأداء العالي في الفهرسة ، والبحث سريع ولكن ربما أقل بقليل من لوسين. ومع ذلك ، فهو الخيار الصحيح إذا كنت بحاجة إلى فهرسة بسرعة كل يوم واستخدم MySQL DB.

بلدي sphinx.conf

source post_source 
{
    type = mysql

    sql_host = localhost
    sql_user = ***
    sql_pass = ***
    sql_db =   ***
    sql_port = 3306

    sql_query_pre = SET NAMES utf8
    # query before fetching rows to index

    sql_query = SELECT *, id AS pid, CRC32(safetag) as safetag_crc32 FROM hb_posts


    sql_attr_uint = pid  
    # pid (as 'sql_attr_uint') is necessary for sphinx
    # this field must be unique

    # that is why I like sphinx
    # you can store custom string fields into indexes (memory) as well
    sql_field_string = title
    sql_field_string = slug
    sql_field_string = content
    sql_field_string = tags

    sql_attr_uint = category
    # integer fields must be defined as sql_attr_uint

    sql_attr_timestamp = date
    # timestamp fields must be defined as sql_attr_timestamp

    sql_query_info_pre = SET NAMES utf8
    # if you need unicode support for sql_field_string, you need to patch the source
    # this param. is not supported natively

    sql_query_info = SELECT * FROM my_posts WHERE id = $id
}

index posts 
{
    source = post_source
    # source above

    path = /var/data/posts
    # index location

    charset_type = utf-8
}

اختبار كتابي:

<?php

    require "sphinxapi.php";

    $safetag = $_GET["my_post_slug"];
//  $safetag = preg_replace("/[^a-z0-9\-_]/i", "", $safetag);

    $conf = getMyConf();

    $cl = New SphinxClient();

    $cl->SetServer($conf["server"], $conf["port"]);
    $cl->SetConnectTimeout($conf["timeout"]);
    $cl->setMaxQueryTime($conf["max"]);

    # set search params
    $cl->SetMatchMode(SPH_MATCH_FULLSCAN);
    $cl->SetArrayResult(TRUE);

    $cl->setLimits(0, 1, 1); 
    # looking for the post (not searching a keyword)

    $cl->SetFilter("safetag_crc32", array(crc32($safetag)));

    # fetch results
    $post = $cl->Query(null, "post_1");

    echo "<pre>";
    var_dump($post);
    echo "</pre>";
    exit("done");
?>

نتيجة العينة:

[array] => 
  "id" => 123,
  "title" => "My post title.",
  "content" => "My <p>post</p> content.",
   ...
   [ and other fields ]

وقت استعلام أبو الهول:

0.001 sec.

وقت استعلام أبو الهول (1K متزامن):

=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)

وقت استعلام MySQL:

"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.

وقت استعلام MySQL (1K متزامن):

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)

مقارنة الأداء Elasticsearch الوحيدة مقابل SOLR تمكنت من العثور عليها حتى الآن:

Solr vs Elasticsearch Deathmatch!

لوكين لطيف وكل شيء ، لكن مجموعة الكلمات التوقف مروعة. اضطررت إلى إضافة الكثير من الكلمات التوقف يدويًا إلى stopanalyzer.english_stop_words_set فقط للحصول عليها في أي مكان بالقرب من الاستخدام.

لم أستخدم sphinx ولكني أعلم أن الناس أقسموا بسرعة ونسبة "سهولة الإعداد إلى الذهول".

حاول الفهرس.

كحالة البحث المرن ، كان من السهل الاستخدام من لوكين/سولر. ويشمل أيضًا نظام تسجيل مرن للغاية يمكن تعديله دون إدانة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top