ฉันกำลังดูวิธีการค้นหาอื่น ๆ มากกว่าที่จะมีการสืบค้น SQL จำนวนมาก ฉันเห็นElasticSearchเมื่อเร็ว ๆ นี้และเล่นกับwhoosh (Python ใช้เครื่องมือค้นหา)
คุณสามารถให้เหตุผลกับการเลือกของคุณได้หรือไม่?
ฉันกำลังดูวิธีการค้นหาอื่น ๆ มากกว่าที่จะมีการสืบค้น SQL จำนวนมาก ฉันเห็นElasticSearchเมื่อเร็ว ๆ นี้และเล่นกับwhoosh (Python ใช้เครื่องมือค้นหา)
คุณสามารถให้เหตุผลกับการเลือกของคุณได้หรือไม่?
คำตอบ:
ในฐานะผู้สร้าง ElasticSearch ฉันอาจให้เหตุผลบางอย่างแก่คุณเกี่ยวกับสาเหตุที่ฉันไปข้างหน้าและสร้างมันขึ้นมาตั้งแต่แรก :)
การใช้ Lucene ล้วนเป็นสิ่งที่ท้าทาย มีหลายสิ่งที่คุณต้องระวังถ้าคุณต้องการให้มันทำงานได้ดีจริง ๆ และยังเป็นไลบรารีดังนั้นจึงไม่มีการสนับสนุนแบบกระจายมันเป็นเพียงไลบรารี Java แบบฝังที่คุณต้องบำรุงรักษา
ในแง่ของการใช้งาน Lucene ย้อนกลับไปเมื่อ (เกือบ 6 ปีแล้ว) ฉันสร้าง Compass เป้าหมายของมันคือทำให้การใช้ Lucene ง่ายขึ้นและทำให้ Lucene ง่ายขึ้นทุกวัน สิ่งที่ฉันได้เจอครั้งแล้วครั้งเล่าคือความต้องการที่จะสามารถแจกจ่ายเข็มทิศได้ ฉันเริ่มทำงานจากใน Compass โดยการรวมกับโซลูชัน data grid เช่น GigaSpaces, Coherence และ Terracotta แต่ก็ไม่เพียงพอ
ที่แกนกลางของมันโซลูชัน Lucene แบบกระจายจะต้องถูกทิ้งไว้ นอกจากนี้ด้วยความก้าวหน้าของ HTTP และ JSON ในรูปของ ubiquitous API หมายความว่าโซลูชันที่ระบบต่าง ๆ ที่มีภาษาต่างกันสามารถใช้งานได้ง่าย
นี่คือเหตุผลที่ฉันไปข้างหน้าและสร้าง ElasticSearch มันมีรูปแบบการกระจายขั้นสูงมากพูด JSON โดยกำเนิดและแสดงคุณลักษณะการค้นหาขั้นสูงมากมายทั้งหมดแสดงต่อเนื่องผ่าน JSON DSL
Solr ยังเป็นโซลูชันสำหรับการเปิดเผยเซิร์ฟเวอร์การจัดทำดัชนี / การค้นหาผ่าน HTTP แต่ฉันจะยืนยันว่าElasticSearchมีรูปแบบการกระจายที่เหนือกว่ามากและใช้งานง่าย (แม้ว่าในปัจจุบันจะขาดคุณสมบัติการค้นหาบางอย่าง แต่ไม่นาน ในกรณีที่เป็นแผนจะได้รับคุณสมบัติเข็มทิศทั้งหมดใน ElasticSearch) แน่นอนฉันลำเอียงตั้งแต่ฉันสร้าง ElasticSearch ดังนั้นคุณอาจต้องตรวจสอบด้วยตัวเอง
สำหรับสฟิงซ์ฉันไม่ได้ใช้มันดังนั้นฉันไม่สามารถแสดงความคิดเห็นได้ สิ่งที่ฉันสามารถอ้างถึงคุณคือกระทู้นี้ที่ฟอรัมสฟิงซ์ซึ่งฉันคิดว่าเป็นรูปแบบการกระจายแบบยืดหยุ่นของ ElasticSearch
แน่นอนว่า ElasticSearch มีคุณสมบัติมากมายมากกว่าแค่การเผยแพร่ มันถูกสร้างขึ้นโดยมีเมฆในใจ คุณสามารถตรวจสอบรายการคุณสมบัติในเว็บไซต์
ฉันใช้สฟิงซ์โซลโซลและอีลาสติค Solr / Elasticsearch ถูกสร้างขึ้นบนสุดของ Lucene มันเพิ่มฟังก์ชั่นทั่วไปหลายอย่าง: API เว็บเซิร์ฟเวอร์, Faceting, แคชเป็นต้น
หากคุณต้องการตั้งค่าการค้นหาข้อความแบบง่าย ๆ สฟิงซ์เป็นตัวเลือกที่ดีกว่า
หากคุณต้องการปรับแต่งการค้นหาของคุณเลย Elasticsearch และ Solr เป็นตัวเลือกที่ดีกว่า มันสามารถขยายได้มาก: คุณสามารถเขียนปลั๊กอินของคุณเองเพื่อปรับการให้คะแนนผล
ตัวอย่างประเพณีบางอย่าง:
เราใช้ Lucene เป็นประจำเพื่อจัดทำดัชนีและค้นหาเอกสารนับล้าน การค้นหานั้นเร็วพอและเราใช้การอัปเดตที่เพิ่มขึ้นซึ่งใช้เวลาไม่นาน เราใช้เวลาพอสมควรที่จะได้มาที่นี่ จุดแข็งของ Lucene ก็คือความสามารถในการปรับขยายได้คุณสมบัติที่หลากหลายและชุมชนนักพัฒนาที่กระตือรือร้น การใช้ Lucene แบบเปลือยต้องใช้การเขียนโปรแกรมใน Java
หากคุณเริ่มต้นใหม่อีกครั้งเครื่องมือสำหรับคุณในตระกูล Lucene คือSolrซึ่งง่ายต่อการติดตั้งมากกว่า Lucene ที่เปลือยเปล่าและมีพลังทั้งหมดของ Lucene มันสามารถนำเข้าเอกสารฐานข้อมูลได้อย่างง่ายดาย Solr เขียนขึ้นใน Java ดังนั้นการดัดแปลงใด ๆ ของ Solr ต้องการความรู้เกี่ยวกับ Java แต่คุณสามารถทำได้มากเพียงแค่ปรับแต่งไฟล์การกำหนดค่า
ฉันเคยได้ยินสิ่งดีๆเกี่ยวกับสฟิงซ์มาโดยเฉพาะเมื่อรวมกับฐานข้อมูล MySQL ไม่ได้ใช้มัน แต่
IMO คุณควรเลือกตาม:
เราใช้สฟิงซ์ในโครงการค้นหาแนวตั้งที่มีเรกคอร์ด MySql 10.000.000 + และฐานข้อมูลที่แตกต่างกัน 10+ รายการ มันได้รับการสนับสนุนอย่างดีเยี่ยมสำหรับ MySQL และประสิทธิภาพสูงในการทำดัชนีการวิจัยนั้นรวดเร็ว แต่อาจน้อยกว่า Lucene เล็กน้อย อย่างไรก็ตามเป็นตัวเลือกที่เหมาะสมหากคุณต้องการสร้างดัชนีอย่างรวดเร็วทุกวันและใช้ฐานข้อมูล MySQL
การทดสอบเพื่อเปรียบเทียบ ElasticSearch และ Solr
สฟิงซ์ของฉัน
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)
การเปรียบเทียบประสิทธิภาพเชิงกลเพียงอย่างเดียวกับการเปรียบเทียบประสิทธิภาพที่ฉันพบได้แล้วตอนนี้:
Lucene นั้นดีและทั้งหมด แต่ชุดคำหยุดของพวกเขานั้นแย่มาก ฉันต้องเพิ่มคำหยุดหลายคำด้วยตัวเองลงใน StopAnalyzer.ENGLISH_STOP_WORDS_SET เพียงเพื่อให้ได้ทุกที่ใกล้กับที่ใช้งานได้
ฉันไม่ได้ใช้สฟิงซ์ แต่ฉันรู้ว่าผู้คนสาบานด้วยความเร็วและอัตราส่วน "ความง่ายในการตั้งค่าต่อความสุดยอด"
ลอง indextank
เป็นกรณีของการค้นหาแบบยืดหยุ่นจึงรู้สึกว่าใช้งานได้ง่ายกว่า lucene / solr นอกจากนี้ยังมีระบบการให้คะแนนที่ยืดหยุ่นมากซึ่งสามารถปรับแต่งได้โดยไม่ต้องทำดัชนีใหม่