ElasticSearch, Sphinx, Lucene, Solr, Xapian. Yang cocok untuk penggunaan mana? [Tutup]

431

Saat ini saya mencari metode pencarian lain daripada memiliki permintaan SQL yang sangat besar. Saya melihat elasticsearch baru-baru ini dan bermain dengan whoosh (implementasi Python dari mesin pencari).

Bisakah Anda memberi alasan untuk pilihan Anda?

Dzen
sumber
8
Perbandingan Sphinx vs Solr: stackoverflow.com/questions/1284083/…
Mauricio Scheffer
9
Lucene vs Solr: stackoverflow.com/questions/1400892/…
Mauricio Scheffer
2
Whoosh v. Solr: stackoverflow.com/questions/3226596/…
Williams
167
Saya benar-benar tidak mengerti orang yang menutup pertanyaan KONSTRUKTIF seperti itu. Pertanyaan semacam itu sangat penting ...
Gizzmo
2
Itu juga memindahkan pertanyaan target.
amirouche

Jawaban:

787

Sebagai pencipta ElasticSearch, mungkin saya dapat memberi Anda beberapa alasan mengapa saya terus maju dan menciptakannya sejak awal :).

Menggunakan Lucene murni itu menantang. Ada banyak hal yang perlu Anda perhatikan jika Anda ingin benar-benar berkinerja baik, dan juga, itu adalah perpustakaan, jadi tidak ada dukungan yang didistribusikan, itu hanya sebuah perpustakaan Java yang tertanam yang perlu Anda pelihara.

Dalam hal kegunaan Lucene, jauh ke belakang ketika (hampir 6 tahun sekarang), saya menciptakan Kompas. Tujuannya adalah untuk menyederhanakan menggunakan Lucene dan membuat Lucene sehari-hari lebih sederhana. Apa yang saya temui berkali-kali adalah persyaratan agar Kompas dapat didistribusikan. Saya mulai mengerjakannya dari dalam Compass, dengan mengintegrasikan dengan solusi kisi data seperti GigaSpaces, Coherence, dan Terracotta, tetapi itu tidak cukup.

Pada intinya, solusi Lucene yang terdistribusi perlu di sharded. Juga, dengan kemajuan HTTP dan JSON sebagai API yang ada di mana-mana, itu berarti solusi yang banyak digunakan oleh berbagai sistem dengan bahasa yang berbeda.

Inilah sebabnya saya maju dan membuat ElasticSearch. Ini memiliki model terdistribusi yang sangat canggih, berbicara JSON secara asli, dan memaparkan banyak fitur pencarian canggih, semua dinyatakan secara mulus melalui JSON DSL.

Solr juga merupakan solusi untuk mengekspos server pengindeksan / pencarian melalui HTTP, tetapi saya berpendapat bahwa ElasticSearch menyediakan model terdistribusi yang jauh lebih unggul dan kemudahan penggunaan (meskipun saat ini kurang pada beberapa fitur pencarian, tetapi tidak lama, dan dalam setiap kasusnya, rencananya adalah untuk memasukkan semua fitur Kompas ke ElasticSearch). Tentu saja, saya bias, karena saya membuat ElasticSearch, jadi Anda mungkin perlu memeriksa sendiri.

Sedangkan untuk Sphinx, saya belum menggunakannya, jadi saya tidak bisa berkomentar. Yang dapat saya referensikan kepada Anda adalah utas ini di forum Sphinx yang menurut saya membuktikan model terdistribusi ElasticSearch yang unggul.

Tentu saja, ElasticSearch memiliki lebih banyak fitur daripada sekadar didistribusikan. Itu sebenarnya dibangun dengan awan dalam pikiran. Anda dapat memeriksa daftar fitur di situs.

kimchy
sumber
38
"Kamu tahu, untuk pencarian". +1 untuk Hudsucker Proxy. Juga, saya tertarik dengan perangkat lunak;)
Shabbyrobe
7
Juga, videonya dilakukan dengan sangat baik. Anda harus menambahkan lebih banyak dari itu!
Shabbyrobe
5
Bagus, saya menemukan bahwa saya dapat menggunakan elasticsearch gratis dengan heroku, menentang menggunakan sesuatu seperti solr yang membutuhkan uang ...
hellomello
3
ElasticSearch menggunakan 230MB RAM besar pada 64bit Ubuntu setelah instalasi baru tanpa data. Saya sangat berharap Elasticsearch dapat dijalankan pada VPS yang lebih kecil seperti PostgreSQL atau Redis.
Xeoncross
@ Xeoncross bagaimana Anda bisa membuatnya bekerja? Saya punya ram 1gb VPS, saya selalu tidak dapat mengalokasikan kesalahan memori ..
Mohammed Noureldin
67

Saya telah menggunakan Sphinx, Solr, dan Elasticsearch. Solr / Elasticsearch dibangun di atas Lucene. Ini menambahkan banyak fungsi umum: api server web, faceting, caching, dll.

Jika Anda hanya ingin memiliki pengaturan pencarian teks lengkap yang sederhana, Sphinx adalah pilihan yang lebih baik.

Jika Anda ingin mengubahsuaikan pencarian sama sekali, Elasticsearch dan Solr adalah pilihan yang lebih baik. Mereka sangat extensible: Anda dapat menulis plugin sendiri untuk menyesuaikan skor hasil.

Beberapa contoh penggunaan:

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github
tommy chheng
sumber
63

Kami menggunakan Lucene secara teratur untuk mengindeks dan mencari puluhan juta dokumen. Pencarian cukup cepat, dan kami menggunakan pembaruan tambahan yang tidak memakan waktu lama. Kami butuh beberapa waktu untuk sampai ke sini. Keunggulan Lucene adalah skalabilitasnya, beragam fitur dan komunitas pengembang yang aktif. Menggunakan bare Lucene membutuhkan pemrograman di Jawa.

Jika Anda memulai dari awal, alat untuk Anda dalam keluarga Lucene adalah Solr , yang jauh lebih mudah dibuat daripada Lucene yang telanjang, dan memiliki hampir semua kekuatan Lucene. Itu dapat mengimpor dokumen basis data dengan mudah. Solr ditulis dalam Java, jadi modifikasi Solr apa pun membutuhkan pengetahuan Java, tetapi Anda dapat melakukan banyak hal hanya dengan men-tweak file konfigurasi.

Saya juga telah mendengar hal-hal baik tentang Sphinx, terutama dalam hubungannya dengan database MySQL. Belum menggunakannya.

IMO, Anda harus memilih sesuai dengan:

  • Fungsionalitas yang disyaratkan - misalnya apakah Anda memerlukan stemmer Prancis? Lucene dan Solr punya satu, saya tidak tahu tentang yang lain.
  • Kemahiran dalam bahasa implementasi - Jangan menyentuh Java Lucene jika Anda tidak tahu Java. Anda mungkin perlu C ++ untuk melakukan hal-hal dengan Sphinx. Lucene juga telah porting ke bahasa lain . Ini sebagian besar penting jika Anda ingin memperluas mesin pencari.
  • Kemudahan eksperimen - Saya percaya Solr adalah yang terbaik dalam aspek ini.
  • Berinteraksi dengan perangkat lunak lain - Sphinx memiliki antarmuka yang baik dengan MySQL. Solr mendukung antarmuka ruby, XML dan JSON sebagai server RESTful. Lucene hanya memberi Anda akses terprogram melalui Jawa. Kompas dan Hibernate Search adalah pembungkus Lucene yang mengintegrasikannya ke dalam kerangka kerja yang lebih besar.
Yuval F
sumber
1
Anda mengangkat gagasan penting bahwa mesin pencari harus dapat beradaptasi.
dzen
1
Saya tidak pernah menggunakan Xapian. Sepertinya perpustakaan pencarian yang bagus yang fitur-fiturnya setara dengan milik Lucene. Sekali lagi, hal-hal yang paling penting adalah kebutuhan aplikasi Anda, lingkungan di mana Anda ingin mesin pencari berjalan, kemahiran Anda dalam bahasa implementasi (C ++ dalam pencarian Xapian, dengan binding ke banyak bahasa lain) dan seberapa disesuaikan mesin tersebut.
Yuval F
21

Kami menggunakan Sphinx dalam proyek Pencarian Vertikal dengan 10.000.000+ catatan MySql dan 10+ basis data berbeda. Ini telah mendapat dukungan yang sangat baik untuk MySQL dan kinerja tinggi pada pengindeksan, penelitian cepat tetapi mungkin sedikit kurang dari Lucene. Namun itu adalah pilihan yang tepat jika Anda perlu mengindeks dengan cepat setiap hari dan menggunakan MySQL db.

Emiliano M.
sumber
13

Sphinx.conf saya

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
}

Skrip uji:

<?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");
?>

Hasil sampel:

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

Waktu permintaan Sphinx:

0.001 sec.

Waktu permintaan Sphinx (1k bersamaan):

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

Waktu permintaan MySQL:

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

Waktu permintaan MySQL (1k bersamaan):

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)
Abdullah Aydın
sumber
Apakah Anda mencoba sphinx atau elasticsearch?
dzen
2
@ Dzen ini sphinx; dia menggunakan query mysql sebagai perbandingan kecepatan eksekusi query.
mr.b
8

Satu-satunya perbandingan kinerja elasticsearch vs solr yang dapat saya temukan sejauh ini di sini:

Solr vs elasticsearch Deathmatch!

Gene
sumber
1
itu yang buruk. dia tidak memberikan komentar! lihat diskusi ini: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell
1
-1 karena "My My comment menunggu moderasi." dan yang lainnya juga melihat tautan grup google di atas
Karussell
1
-1, lebih dari setahun kemudian, tidak ada komentar yang diizinkan di utas itu, saya akan mempertimbangkan untuk mengabaikannya sepenuhnya.
JAR.JAR.beans
7

Lucene memang baik dan semua, tetapi kata-kata penghentian mereka mengerikan. Saya harus menambahkan secara manual satu ton kata berhenti ke StopAnalyzer.ENGLISH_STOP_WORDS_SET hanya untuk mendapatkannya di dekat yang dapat digunakan.

Saya belum pernah menggunakan Sphinx tapi saya tahu orang-orang bersumpah dengan kecepatan dan rasio "kemudahan pengaturan ke kehebatan" yang nyaris ajaib.

larley
sumber
7

Coba indextank.

Sebagai kasus pencarian elastis, itu dianggap lebih mudah digunakan daripada lucene / solr. Ini juga mencakup sistem penilaian yang sangat fleksibel yang dapat di-tweak tanpa pengindeksan ulang.

Paku
sumber
skor dapat di-tweek saat runtime dengan solr juga
Karussell
sekarang tidak ada indextank lagi
Karussell
4
LinkdenIn sumber terbuka IndexTank, github.com/linkedin/indextank-engine