मैं वर्तमान में एक विशाल SQL क्वेरी के बजाय अन्य खोज विधियों को देख रहा हूं। मैंने हाल ही में इलास्टिक्स की खोज की और हूश (एक खोज इंजन के पायथन कार्यान्वयन) के साथ खेला ।
क्या आप अपनी पसंद के कारण बता सकते हैं?
मैं वर्तमान में एक विशाल SQL क्वेरी के बजाय अन्य खोज विधियों को देख रहा हूं। मैंने हाल ही में इलास्टिक्स की खोज की और हूश (एक खोज इंजन के पायथन कार्यान्वयन) के साथ खेला ।
क्या आप अपनी पसंद के कारण बता सकते हैं?
जवाबों:
ElasticSearch के निर्माता के रूप में, हो सकता है कि मैं आपको इस बात पर कुछ तर्क दे सकूं कि मैंने क्यों आगे बढ़कर इसे पहली जगह में बनाया :)।
शुद्ध ल्यूसीन का उपयोग करना चुनौतीपूर्ण है। कई चीजें हैं जिनकी आपको देखभाल करने की आवश्यकता है यदि आप चाहते हैं कि यह वास्तव में अच्छा प्रदर्शन करे, और साथ ही, इसका पुस्तकालय, तो कोई वितरित समर्थन नहीं है, यह सिर्फ एक एम्बेडेड जावा पुस्तकालय है जिसे आपको बनाए रखने की आवश्यकता है।
Lucene प्रयोज्य के संदर्भ में, जिस तरह से वापस (अब लगभग 6 साल), मैंने Compass बनाया। इसका उद्देश्य ल्यूसीन का उपयोग करके सरल करना और हर रोज ल्यूसीन को सरल बनाना था। मैं समय और समय पर फिर से आया और कम्पास को वितरित करने में सक्षम होने की आवश्यकता है। मैंने GigaSpaces, Coherence और Terracotta जैसे डेटा ग्रिड समाधानों के साथ एकीकरण करके, Compass के भीतर से इस पर काम करना शुरू किया, लेकिन यह पर्याप्त नहीं है।
इसके मूल में, एक वितरित ल्यूसीन समाधान को तेज करने की आवश्यकता है। साथ ही, HTTP और JSON को सर्वव्यापी एपीआई के रूप में आगे बढ़ने के साथ, इसका मतलब है कि एक समाधान जो विभिन्न भाषाओं के साथ कई अलग-अलग प्रणालियों का आसानी से उपयोग किया जा सकता है।
यही कारण है कि मैंने आगे बढ़कर ElasticSearch बनाया। इसका एक बहुत ही उन्नत वितरित मॉडल है, JSON को मूल रूप से बोलता है, और कई उन्नत खोज सुविधाओं को उजागर करता है, जो सभी JSON DSL के माध्यम से निर्बाध रूप से व्यक्त किए जाते हैं।
सोलर HTTP पर एक अनुक्रमणिका / खोज सर्वर को उजागर करने के लिए भी एक समाधान है, लेकिन मैं तर्क दूंगा कि इलास्टिकसर्च एक बहुत बेहतर वितरित मॉडल और उपयोग में आसानी प्रदान करता है (हालांकि वर्तमान में कुछ खोज सुविधाओं में कमी है, लेकिन लंबे समय तक नहीं, और किसी में भी। मामले में, योजना सभी कम्पास सुविधाओं को लोचदार खोज में प्राप्त करने के लिए है )। बेशक, मैं पक्षपाती हूं, चूंकि मैंने इलास्टिकसर्च बनाया है, इसलिए आपको अपने लिए जांच करने की आवश्यकता हो सकती है।
स्फिंक्स के लिए, मैंने इसका उपयोग नहीं किया है, इसलिए मैं टिप्पणी नहीं कर सकता। मैं आपको इस धागे को स्फिंक्स फोरम पर बता सकता हूं जो मुझे लगता है कि इलास्टिकसर्च के बेहतर वितरित मॉडल को साबित करता है।
बेशक, ElasticSearch में अभी वितरित होने की तुलना में कई और सुविधाएँ हैं। यह वास्तव में एक बादल को ध्यान में रखकर बनाया गया है। आप साइट पर सुविधा सूची देख सकते हैं।
मैंने Sphinx, Solr और Elasticsearch का उपयोग किया है। ल्यूक के शीर्ष पर सोलर / इलास्टिक्स खोज का निर्माण किया जाता है। यह कई सामान्य कार्यक्षमता जोड़ता है: वेब सर्वर एपीआई, फेसिंग, कैशिंग, आदि।
यदि आप एक साधारण पूर्ण पाठ खोज सेटअप करना चाहते हैं, तो स्फिंक्स एक बेहतर विकल्प है।
यदि आप अपनी खोज को सभी में अनुकूलित करना चाहते हैं, तो एलेस्टिक्सर्च और सोल बेहतर विकल्प हैं। वे बहुत एक्स्टेंसिबल हैं: परिणाम स्कोरिंग को समायोजित करने के लिए आप अपने स्वयं के प्लगइन्स लिख सकते हैं।
कुछ उदाहरणों का उपयोग:
हम लाखों दस्तावेज़ों को अनुक्रमित करने और खोजने के लिए नियमित रूप से लुसीन का उपयोग करते हैं। खोज काफी जल्दी होती है, और हम वृद्धिशील अपडेट का उपयोग करते हैं जो लंबे समय तक नहीं लेते हैं। यहां पहुंचने में हमें कुछ समय लगा। लुसिने के मजबूत बिंदु इसकी मापनीयता, सुविधाओं की एक बड़ी श्रृंखला और डेवलपर्स का एक सक्रिय समुदाय हैं। नंगे Lucene का उपयोग जावा में प्रोग्रामिंग की आवश्यकता है।
यदि आप नए सिरे से शुरू कर रहे हैं, तो ल्यूसीन परिवार में आपके लिए उपकरण सोल्र है , जो नंगे ल्यूसीन की तुलना में स्थापित करना बहुत आसान है, और इसमें ल्यूसीन की लगभग सभी शक्ति है। यह डेटाबेस दस्तावेजों को आसानी से आयात कर सकता है। Solr जावा में लिखे जाते हैं, इसलिए Solr के किसी भी संशोधन के लिए Java ज्ञान की आवश्यकता होती है, लेकिन आप कॉन्फ़िगरेशन फ़ाइलों को ट्विक करके बहुत कुछ कर सकते हैं।
मैंने Sphinx के बारे में भी अच्छी बातें सुनी हैं, खासकर एक MySQL डेटाबेस के साथ। हालांकि, इसका उपयोग नहीं किया है।
IMO, आपको इसके अनुसार चुनना चाहिए:
हम Sphinx का उपयोग MySql रिकॉर्ड्स के 10.000.000 + और विभिन्न डेटाबेस के साथ एक वर्टिकल सर्च प्रोजेक्ट में करते हैं। इसे MySQL के लिए बहुत उत्कृष्ट समर्थन मिला है और अनुक्रमण पर उच्च प्रदर्शन, अनुसंधान तेज है, लेकिन शायद ल्यूसिन की तुलना में थोड़ा कम है। हालाँकि, यह सही विकल्प है अगर आपको हर दिन जल्दी इंडेक्सिंग की आवश्यकता है और MySQL db का उपयोग करें।
ElasticSearch और Solr की तुलना करने के लिए एक प्रयोग
मेरा स्फिंक्स .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 प्रदर्शन तुलना यहाँ है:
ल्यूसिन अच्छा और सभी है, लेकिन उनका स्टॉप शब्द सेट भयानक है। मुझे मैन्युअल रूप से StopAnalyzer.ENGLISH_STOP_WORDS_SET में स्टॉप शब्दों का एक टन जोड़ना था ताकि इसे प्रयोग करने योग्य के पास कहीं भी लाया जा सके।
मैंने Sphinx का उपयोग नहीं किया है, लेकिन मुझे पता है कि लोग इसकी गति और निकट-जादुई "सेटअप में आसानी से अजीबता" अनुपात की कसम खाते हैं।
इंडेक्सटैंक आज़माएं।
लोचदार खोज के मामले के रूप में, ल्यूसीन / सोल की तुलना में इसका उपयोग करने के लिए बहुत आसान होने की कल्पना की गई थी। इसमें बहुत लचीली स्कोरिंग प्रणाली भी शामिल है जिसे रीइन्डेक्सिंग के बिना ट्विक किया जा सकता है।