ElasticSearch, สฟิงซ์, Lucene, Solr, Xapian ซึ่งเหมาะกับการใช้งานใด [ปิด]


431

ฉันกำลังดูวิธีการค้นหาอื่น ๆ มากกว่าที่จะมีการสืบค้น SQL จำนวนมาก ฉันเห็นElasticSearchเมื่อเร็ว ๆ นี้และเล่นกับwhoosh (Python ใช้เครื่องมือค้นหา)

คุณสามารถให้เหตุผลกับการเลือกของคุณได้หรือไม่?


8
สฟิงซ์ vs โซลเปรียบเทียบ: stackoverflow.com/questions/1284083/ …
Mauricio Scheffer



167
ฉันไม่เข้าใจคนที่ใกล้ชิดกับคำถาม CONSTRUCTIVE คำถามดังกล่าวมีความสำคัญจริงๆ ...
Gizzmo

2
คำถามเหล่านี้ก็กำลังเคลื่อนย้ายไปด้วยเช่นกัน
amirouche

คำตอบ:


787

ในฐานะผู้สร้าง 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 มีคุณสมบัติมากมายมากกว่าแค่การเผยแพร่ มันถูกสร้างขึ้นโดยมีเมฆในใจ คุณสามารถตรวจสอบรายการคุณสมบัติในเว็บไซต์


38
"คุณรู้เพื่อค้นหา" +1 สำหรับ Hudsucker Proxy นอกจากนี้ฉันยังสนใจซอฟต์แวร์;)
Shabbyrobe

7
นอกจากนี้วิดีโอก็ทำได้ดีมาก คุณควรเพิ่มสิ่งเหล่านี้อีก!
Shabbyrobe

5
ดีฉันพบว่าฉันสามารถใช้ elasticsearch ฟรีกับ heroku เมื่อเทียบกับการใช้บางอย่างเช่น solr ซึ่งมีค่าใช้จ่าย ...
hellomello

3
ElasticSearch ใช้ RAM ขนาดใหญ่ 230MB บน Ubuntu ขนาด 64 บิตหลังจากติดตั้งใหม่โดยไม่มีข้อมูล ฉันต้องการให้ Elasticsearch สามารถทำงานบน VPS ขนาดเล็กเช่น PostgreSQL หรือ Redis ได้
Xeoncross

@Xeoncross คุณจัดการให้มันทำงานอย่างไร ผมมีแรม 1GB VPS ผมมักจะได้รับไม่สามารถจัดสรรหน่วยความจำข้อผิดพลาด ..
โมฮัมเหม็ Noureldin

67

ฉันใช้สฟิงซ์โซลโซลและอีลาสติค Solr / Elasticsearch ถูกสร้างขึ้นบนสุดของ Lucene มันเพิ่มฟังก์ชั่นทั่วไปหลายอย่าง: API เว็บเซิร์ฟเวอร์, Faceting, แคชเป็นต้น

หากคุณต้องการตั้งค่าการค้นหาข้อความแบบง่าย ๆ สฟิงซ์เป็นตัวเลือกที่ดีกว่า

หากคุณต้องการปรับแต่งการค้นหาของคุณเลย Elasticsearch และ Solr เป็นตัวเลือกที่ดีกว่า มันสามารถขยายได้มาก: คุณสามารถเขียนปลั๊กอินของคุณเองเพื่อปรับการให้คะแนนผล

ตัวอย่างประเพณีบางอย่าง:

  • สฟิงซ์: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github

63

เราใช้ Lucene เป็นประจำเพื่อจัดทำดัชนีและค้นหาเอกสารนับล้าน การค้นหานั้นเร็วพอและเราใช้การอัปเดตที่เพิ่มขึ้นซึ่งใช้เวลาไม่นาน เราใช้เวลาพอสมควรที่จะได้มาที่นี่ จุดแข็งของ Lucene ก็คือความสามารถในการปรับขยายได้คุณสมบัติที่หลากหลายและชุมชนนักพัฒนาที่กระตือรือร้น การใช้ Lucene แบบเปลือยต้องใช้การเขียนโปรแกรมใน Java

หากคุณเริ่มต้นใหม่อีกครั้งเครื่องมือสำหรับคุณในตระกูล Lucene คือSolrซึ่งง่ายต่อการติดตั้งมากกว่า Lucene ที่เปลือยเปล่าและมีพลังทั้งหมดของ Lucene มันสามารถนำเข้าเอกสารฐานข้อมูลได้อย่างง่ายดาย Solr เขียนขึ้นใน Java ดังนั้นการดัดแปลงใด ๆ ของ Solr ต้องการความรู้เกี่ยวกับ Java แต่คุณสามารถทำได้มากเพียงแค่ปรับแต่งไฟล์การกำหนดค่า

ฉันเคยได้ยินสิ่งดีๆเกี่ยวกับสฟิงซ์มาโดยเฉพาะเมื่อรวมกับฐานข้อมูล MySQL ไม่ได้ใช้มัน แต่

IMO คุณควรเลือกตาม:

  • ฟังก์ชั่นที่ต้องการ - เช่นคุณต้องการ Stemmer ฝรั่งเศสหรือไม่ Lucene และ Solr มีหนึ่งฉันไม่รู้เกี่ยวกับคนอื่น
  • ความสามารถในการใช้ภาษา - อย่าสัมผัส Java Lucene หากคุณไม่รู้จัก Java คุณอาจต้องใช้ C ++ เพื่อทำสิ่งต่าง ๆ ด้วยสฟิงซ์ Lucene ยังได้รับการ ported เข้าอื่น ๆ ภาษา สิ่งนี้สำคัญมากหากคุณต้องการขยายเครื่องมือค้นหา
  • ความง่ายในการทดลอง - ฉันเชื่อว่า Solr ดีที่สุดในด้านนี้
  • การเชื่อมต่อกับซอฟต์แวร์อื่น - สฟิงซ์มีส่วนต่อประสานที่ดีกับ MySQL Solr สนับสนุนอินเตอร์เฟส ruby, XML และ JSON เป็นเซิร์ฟเวอร์ RESTful Lucene ให้การเข้าถึงแบบเป็นโปรแกรมผ่าน Java เท่านั้น การค้นหาเข็มทิศและไฮเบอร์เนตเป็นตัวห่อของ Lucene ที่รวมเข้ากับกรอบงานที่ใหญ่ขึ้น

1
คุณยกความคิดที่สำคัญว่าเครื่องมือค้นหาจะต้องปรับตัว
dzen

1
ฉันไม่เคยใช้ Xapian ดูเหมือนว่าไลบรารีการค้นหาชั้นดีที่ฟีเจอร์ต่าง ๆ ของ Lucene ต่างกัน สิ่งที่สำคัญที่สุดคือความต้องการของแอปพลิเคชันของคุณสภาพแวดล้อมที่คุณต้องการให้เสิร์ชเอ็นจิ้นทำงานความสามารถของคุณในการใช้ภาษา (C ++ ในการค้นหา Xapian พร้อมการเชื่อมโยงกับภาษาอื่น ๆ )
Yuval F

21

เราใช้สฟิงซ์ในโครงการค้นหาแนวตั้งที่มีเรกคอร์ด MySql 10.000.000 + และฐานข้อมูลที่แตกต่างกัน 10+ รายการ มันได้รับการสนับสนุนอย่างดีเยี่ยมสำหรับ MySQL และประสิทธิภาพสูงในการทำดัชนีการวิจัยนั้นรวดเร็ว แต่อาจน้อยกว่า Lucene เล็กน้อย อย่างไรก็ตามเป็นตัวเลือกที่เหมาะสมหากคุณต้องการสร้างดัชนีอย่างรวดเร็วทุกวันและใช้ฐานข้อมูล MySQL



13

สฟิงซ์ของฉัน

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)

คุณได้ลองใช้สฟิงซ์หรืออีลาสติคแล้วหรือยัง?
dzen

2
@dzen นี่คือสฟิงซ์; เขาใช้แบบสอบถาม mysql เป็นการเปรียบเทียบความเร็วการดำเนินการค้นหา
mr.b

8

การเปรียบเทียบประสิทธิภาพเชิงกลเพียงอย่างเดียวกับการเปรียบเทียบประสิทธิภาพที่ฉันพบได้แล้วตอนนี้:

Solr vs elasticsearch Deathmatch!


1
นั่นเป็นสิ่งที่ไม่ดี เขาไม่ได้แสดงความคิดเห็น! ดูการสนทนานี้: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell

1
-1 เนื่องจาก "ความคิดเห็นของคุณกำลังรอการกลั่นกรอง" และคนอื่น ๆ ก็เห็นลิงค์ของ Google Groups ด้านบน
Karussell

1
-1 มากกว่าหนึ่งปีต่อมาไม่อนุญาตให้มีความคิดเห็นในหัวข้อนั้นฉันจะพิจารณาอย่างจริงจังว่าจะไม่สนใจมันอย่างสมบูรณ์
JAR.JAR.beans

7

Lucene นั้นดีและทั้งหมด แต่ชุดคำหยุดของพวกเขานั้นแย่มาก ฉันต้องเพิ่มคำหยุดหลายคำด้วยตัวเองลงใน StopAnalyzer.ENGLISH_STOP_WORDS_SET เพียงเพื่อให้ได้ทุกที่ใกล้กับที่ใช้งานได้

ฉันไม่ได้ใช้สฟิงซ์ แต่ฉันรู้ว่าผู้คนสาบานด้วยความเร็วและอัตราส่วน "ความง่ายในการตั้งค่าต่อความสุดยอด"


7

ลอง indextank

เป็นกรณีของการค้นหาแบบยืดหยุ่นจึงรู้สึกว่าใช้งานได้ง่ายกว่า lucene / solr นอกจากนี้ยังมีระบบการให้คะแนนที่ยืดหยุ่นมากซึ่งสามารถปรับแต่งได้โดยไม่ต้องทำดัชนีใหม่


คะแนนสามารถ tweek ที่รันไทม์ด้วย solr เกินไป
Karussell

ตอนนี้ไม่มี indextank อีกต่อไปแล้ว
Karussell

4
LinkdenIn โอเพนซอร์ส IndexTank, github.com/linkedin/indextank-engine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.