इलास्टिकसर्च, स्फिंक्स, ल्यूसिने, सोलर, ज़ापियन। कौन सा उपयोग किसके लिए उपयुक्त है? [बन्द है]


431

मैं वर्तमान में एक विशाल SQL क्वेरी के बजाय अन्य खोज विधियों को देख रहा हूं। मैंने हाल ही में इलास्टिक्स की खोज की और हूश (एक खोज इंजन के पायथन कार्यान्वयन) के साथ खेला ।

क्या आप अपनी पसंद के कारण बता सकते हैं?


8
स्फिंक्स बनाम सोलर तुलना: stackoverflow.com/questions/1284083/…
मौरिसियो शेफ़र

9
ल्यूसीन बनाम सोलर: stackoverflow.com/questions/1400892/…
मौरिसियो शेफ़र


167
मैं वास्तव में ऐसे लोगों को नहीं समझता हूं जो इस तरह के CONSTRUCTIVE प्रश्न को बंद करते हैं। ऐसे सवाल वास्तव में महत्वपूर्ण हैं ...
गिज्मो

2
वे लक्ष्य सवाल भी कर रहे हैं।
अमीरो

जवाबों:


787

ElasticSearch के निर्माता के रूप में, हो सकता है कि मैं आपको इस बात पर कुछ तर्क दे सकूं कि मैंने क्यों आगे बढ़कर इसे पहली जगह में बनाया :)।

शुद्ध ल्यूसीन का उपयोग करना चुनौतीपूर्ण है। कई चीजें हैं जिनकी आपको देखभाल करने की आवश्यकता है यदि आप चाहते हैं कि यह वास्तव में अच्छा प्रदर्शन करे, और साथ ही, इसका पुस्तकालय, तो कोई वितरित समर्थन नहीं है, यह सिर्फ एक एम्बेडेड जावा पुस्तकालय है जिसे आपको बनाए रखने की आवश्यकता है।

Lucene प्रयोज्य के संदर्भ में, जिस तरह से वापस (अब लगभग 6 साल), मैंने Compass बनाया। इसका उद्देश्य ल्यूसीन का उपयोग करके सरल करना और हर रोज ल्यूसीन को सरल बनाना था। मैं समय और समय पर फिर से आया और कम्पास को वितरित करने में सक्षम होने की आवश्यकता है। मैंने GigaSpaces, Coherence और Terracotta जैसे डेटा ग्रिड समाधानों के साथ एकीकरण करके, Compass के भीतर से इस पर काम करना शुरू किया, लेकिन यह पर्याप्त नहीं है।

इसके मूल में, एक वितरित ल्यूसीन समाधान को तेज करने की आवश्यकता है। साथ ही, HTTP और JSON को सर्वव्यापी एपीआई के रूप में आगे बढ़ने के साथ, इसका मतलब है कि एक समाधान जो विभिन्न भाषाओं के साथ कई अलग-अलग प्रणालियों का आसानी से उपयोग किया जा सकता है।

यही कारण है कि मैंने आगे बढ़कर ElasticSearch बनाया। इसका एक बहुत ही उन्नत वितरित मॉडल है, JSON को मूल रूप से बोलता है, और कई उन्नत खोज सुविधाओं को उजागर करता है, जो सभी JSON DSL के माध्यम से निर्बाध रूप से व्यक्त किए जाते हैं।

सोलर HTTP पर एक अनुक्रमणिका / खोज सर्वर को उजागर करने के लिए भी एक समाधान है, लेकिन मैं तर्क दूंगा कि इलास्टिकसर्च एक बहुत बेहतर वितरित मॉडल और उपयोग में आसानी प्रदान करता है (हालांकि वर्तमान में कुछ खोज सुविधाओं में कमी है, लेकिन लंबे समय तक नहीं, और किसी में भी। मामले में, योजना सभी कम्पास सुविधाओं को लोचदार खोज में प्राप्त करने के लिए है )। बेशक, मैं पक्षपाती हूं, चूंकि मैंने इलास्टिकसर्च बनाया है, इसलिए आपको अपने लिए जांच करने की आवश्यकता हो सकती है।

स्फिंक्स के लिए, मैंने इसका उपयोग नहीं किया है, इसलिए मैं टिप्पणी नहीं कर सकता। मैं आपको इस धागे को स्फिंक्स फोरम पर बता सकता हूं जो मुझे लगता है कि इलास्टिकसर्च के बेहतर वितरित मॉडल को साबित करता है।

बेशक, ElasticSearch में अभी वितरित होने की तुलना में कई और सुविधाएँ हैं। यह वास्तव में एक बादल को ध्यान में रखकर बनाया गया है। आप साइट पर सुविधा सूची देख सकते हैं।


38
"आप जानते हैं, खोज के लिए"। Hudsucker प्रॉक्सी के लिए +1। इसके अलावा, मैं सॉफ्टवेयर द्वारा
अंतर्निवेशित हूं

7
इसके अलावा, वीडियो वास्तव में अच्छी तरह से किया गया था। आपको उनमें से कुछ और जोड़ना चाहिए!
शब्बीरदे

5
अच्छा, मैंने पाया कि मैं इलायची को मुफ्त में हेरोकू के साथ उपयोग कर सकता हूं, सोल का उपयोग करने का विरोध करता हूं, जिसमें पैसे खर्च होते हैं ...
हेलोमेलो

3
ElasticSearch 64bit Ubuntu पर एक बड़ी 230MB RAM का उपयोग करता है, जिसमें कोई डेटा नहीं है। मैं वास्तव में चाहता हूँ कि एलेस्टिक्स की खोज पोस्टग्रेएसक्यूएल या रेडिस जैसे छोटे वीपीएस पर हो।
Xeoncross

@Xeoncross आपने इसे काम करने के लिए कैसे प्रबंधित किया? मेरे पास 1 जीबी रैम वीपीएस है, मुझे हमेशा मेमोरी एरर आवंटित नहीं किया जा सकता है ..
मोहम्मद नौरेल्डिन

67

मैंने Sphinx, Solr और Elasticsearch का उपयोग किया है। ल्यूक के शीर्ष पर सोलर / इलास्टिक्स खोज का निर्माण किया जाता है। यह कई सामान्य कार्यक्षमता जोड़ता है: वेब सर्वर एपीआई, फेसिंग, कैशिंग, आदि।

यदि आप एक साधारण पूर्ण पाठ खोज सेटअप करना चाहते हैं, तो स्फिंक्स एक बेहतर विकल्प है।

यदि आप अपनी खोज को सभी में अनुकूलित करना चाहते हैं, तो एलेस्टिक्सर्च और सोल बेहतर विकल्प हैं। वे बहुत एक्स्टेंसिबल हैं: परिणाम स्कोरिंग को समायोजित करने के लिए आप अपने स्वयं के प्लगइन्स लिख सकते हैं।

कुछ उदाहरणों का उपयोग:

  • स्फिंक्स: craigslist.org
  • सोल: नेट, नेटफ्लिक्स, digg.com
  • एलेस्टिक्स खोज: फोरस्क्वेयर, जीथब

63

हम लाखों दस्तावेज़ों को अनुक्रमित करने और खोजने के लिए नियमित रूप से लुसीन का उपयोग करते हैं। खोज काफी जल्दी होती है, और हम वृद्धिशील अपडेट का उपयोग करते हैं जो लंबे समय तक नहीं लेते हैं। यहां पहुंचने में हमें कुछ समय लगा। लुसिने के मजबूत बिंदु इसकी मापनीयता, सुविधाओं की एक बड़ी श्रृंखला और डेवलपर्स का एक सक्रिय समुदाय हैं। नंगे Lucene का उपयोग जावा में प्रोग्रामिंग की आवश्यकता है।

यदि आप नए सिरे से शुरू कर रहे हैं, तो ल्यूसीन परिवार में आपके लिए उपकरण सोल्र है , जो नंगे ल्यूसीन की तुलना में स्थापित करना बहुत आसान है, और इसमें ल्यूसीन की लगभग सभी शक्ति है। यह डेटाबेस दस्तावेजों को आसानी से आयात कर सकता है। Solr जावा में लिखे जाते हैं, इसलिए Solr के किसी भी संशोधन के लिए Java ज्ञान की आवश्यकता होती है, लेकिन आप कॉन्फ़िगरेशन फ़ाइलों को ट्विक करके बहुत कुछ कर सकते हैं।

मैंने Sphinx के बारे में भी अच्छी बातें सुनी हैं, खासकर एक MySQL डेटाबेस के साथ। हालांकि, इसका उपयोग नहीं किया है।

IMO, आपको इसके अनुसार चुनना चाहिए:

  • आवश्यक कार्यक्षमता - जैसे आपको एक फ्रांसीसी स्टेमर की आवश्यकता है? ल्यूसीन और सोलर में से एक है, मुझे दूसरों के बारे में नहीं पता है।
  • कार्यान्वयन भाषा में प्रवीणता - यदि आप जावा को नहीं जानते हैं तो जावा ल्यूसिने को स्पर्श न करें। स्फिंक्स के साथ सामान करने के लिए आपको C ++ की आवश्यकता हो सकती है। ल्यूसीन को अन्य भाषाओं में भी चित्रित किया गया है । यह ज्यादातर महत्वपूर्ण है यदि आप खोज इंजन का विस्तार करना चाहते हैं।
  • प्रयोग में आसानी - मेरा मानना ​​है कि इस पहलू में सोल्र सबसे अच्छा है।
  • अन्य सॉफ्टवेयर के साथ इंटरफेस - Sphinx का MySQL के साथ अच्छा इंटरफ़ेस है। Solr रूबी, XML और JSON इंटरफेस को एक RESTful सर्वर का समर्थन करता है। ल्यूसिन केवल आपको जावा के माध्यम से प्रोग्रामेटिक एक्सेस देता है। कम्पास और हाइबरनेट सर्च ल्यूसीन के रैपर हैं जो इसे बड़े फ्रेमवर्क में एकीकृत करते हैं।

1
आपने एक महत्वपूर्ण धारणा उठाई कि एक खोज-इंजन को अनुकूल होना चाहिए।
11

1
मैंने कभी भी ज़ापियन का इस्तेमाल नहीं किया है। यह एक अच्छी खोज पुस्तकालय की तरह दिखता है जिसकी विशेषताएं ल्यूसिन के बराबर हैं। फिर से, जो चीजें सबसे ज्यादा मायने रखती हैं, वे हैं आपकी जरूरतें, वह वातावरण जिसमें आप सर्च इंजन को चलाना चाहते हैं, कार्यान्वयन भाषा में आपकी दक्षता (Xapian खोज में C ++, कई अन्य भाषाओं में बाइंडिंग के साथ) और इंजन कितना अनुकूलन योग्य है।
युवल एफ

21

हम Sphinx का उपयोग MySql रिकॉर्ड्स के 10.000.000 + और विभिन्न डेटाबेस के साथ एक वर्टिकल सर्च प्रोजेक्ट में करते हैं। इसे MySQL के लिए बहुत उत्कृष्ट समर्थन मिला है और अनुक्रमण पर उच्च प्रदर्शन, अनुसंधान तेज है, लेकिन शायद ल्यूसिन की तुलना में थोड़ा कम है। हालाँकि, यह सही विकल्प है अगर आपको हर दिन जल्दी इंडेक्सिंग की आवश्यकता है और MySQL db का उपयोग करें।



13

मेरा स्फिंक्स .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)

क्या आपने स्फिंक्स या इलास्टिक्सर्च की कोशिश की?
बजकर 34 मिनट

2
@dzen यह आईएस स्फिंक्स है; वह क्वेरी निष्पादन गति की तुलना के रूप में mysql क्वेरी का उपयोग कर रहा है।
20

8

मैं अभी तक खोजने में सक्षम है कि केवल elasticsearch बनाम solr प्रदर्शन तुलना यहाँ है:

सोलर बनाम एलेस्टिक्स खोज डेमचैच!


1
यह एक बुरा है। वह टिप्पणी पेश नहीं करता है! इस चर्चा को देखें: group.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell

1
-1 क्योंकि "माई योर कमेंट मॉडरेशन का इंतजार कर रहा है।" और दूसरों को भी गूगल समूहों ऊपर लिंक देखें
Karussell

1
-1, एक वर्ष से अधिक समय के बाद, उस थ्रेड पर किसी भी टिप्पणी की अनुमति नहीं है, मैं गंभीरता से इसे पूरी तरह से अनदेखा करने पर विचार करूंगा।
JAR.JAR.beans

7

ल्यूसिन अच्छा और सभी है, लेकिन उनका स्टॉप शब्द सेट भयानक है। मुझे मैन्युअल रूप से StopAnalyzer.ENGLISH_STOP_WORDS_SET में स्टॉप शब्दों का एक टन जोड़ना था ताकि इसे प्रयोग करने योग्य के पास कहीं भी लाया जा सके।

मैंने Sphinx का उपयोग नहीं किया है, लेकिन मुझे पता है कि लोग इसकी गति और निकट-जादुई "सेटअप में आसानी से अजीबता" अनुपात की कसम खाते हैं।


7

इंडेक्सटैंक आज़माएं।

लोचदार खोज के मामले के रूप में, ल्यूसीन / सोल की तुलना में इसका उपयोग करने के लिए बहुत आसान होने की कल्पना की गई थी। इसमें बहुत लचीली स्कोरिंग प्रणाली भी शामिल है जिसे रीइन्डेक्सिंग के बिना ट्विक किया जा सकता है।


स्कोरिंग को रनवे पर ट्विक भी किया जा सकता है
करुसेल

अब और कोई इंडेंटेंक नहीं है
Karussell

4
LinkdenIn खुले स्रोत IndexTank, github.com/linkedin/indextank-engine
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.