Elastik Arama, Sfenks, Lucene, Solr, Xapian. Hangisi hangi kullanıma uyar? [kapalı]


431

Şu anda büyük bir SQL sorgusu olması yerine diğer arama yöntemlerine bakıyorum. Gördüğüm elasticsearch son zamanlarda ve oynanan vızıldamak (bir arama motorunun bir Python uygulaması).

Seçim (ler) inize sebep verebilir misiniz?


8
Sfenks vs Solr karşılaştırması: stackoverflow.com/questions/1284083/…
Mauricio Scheffer



167
Gerçekten böyle bir YAPI sorusunu kapatan insanları anlamıyorum. Bu tür sorular gerçekten önemli ...
Gizzmo

2
Bunlar da hedef soruyu hareket ettiriyor.
amirouche

Yanıtlar:


787

Elastik Arama'nın yaratıcısı olarak, belki de neden devam ettiğimi ve ilk etapta yarattığım hakkında bir fikir verebilirim :).

Saf Lucene kullanmak zordur. Gerçekten iyi performans göstermesini istiyorsanız dikkat etmeniz gereken birçok şey var ve ayrıca bir kütüphanesi, dağıtılmış destek yok, sadece korumanız gereken gömülü bir Java kütüphanesi.

Lucene kullanılabilirliği açısından (neredeyse 6 yıl sonra) Compass'ı yarattım. Amacı Lucene kullanımını basitleştirmek ve günlük Lucene'yi daha basit hale getirmekti. Tekrar tekrar karşılaştığım şey, Compass'ın dağıtılmasını gerektiriyor. GigaSpaces, Coherence ve Terracotta gibi veri ızgarası çözümleriyle entegre ederek Compass içinden çalışmaya başladım, ancak yeterli değil.

Özünde, dağıtılmış bir Lucene çözümünün parçalanması gerekiyor. Ayrıca, HTTP ve JSON'un her yerde API olarak ilerletilmesiyle, farklı dillere sahip birçok farklı sistemin kolayca kullanılabileceği bir çözüm anlamına gelir.

Bu yüzden devam ettim ve Elastik Arama'yı yarattım. Çok gelişmiş bir dağıtılmış modele sahiptir, JSON'u yerel olarak konuşur ve hepsi JSON DSL ile sorunsuz bir şekilde ifade edilen birçok gelişmiş arama özelliğini sunar.

Solr ayrıca bir dizinleme / arama sunucusunu HTTP üzerinden ortaya çıkarmak için bir çözümdür, ancak Elastik Arama'nın çok daha iyi dağıtılmış bir model ve kullanım kolaylığı sağladığını iddia ediyorum (şu anda bazı arama özelliklerinden yoksun, ancak uzun süre ve herhangi bir şekilde değil) durumda, plan tüm Pusula özelliklerini Elastik Arama içine almaktır). Tabii ki önyargılıyım, çünkü Esnek Arama'yı oluşturduğumdan, kendiniz kontrol etmeniz gerekebilir.

Sfenks gelince, ben kullanmadım, bu yüzden yorum yapamam. Size söyleyebileceğim , Sphinx forumundaki bu konuya bence ElastikSearch'ün üstün dağıtılmış modelini kanıtlıyor.

Elbette, Elastik Arama'nın dağıtılmaktan çok daha fazla özelliği vardır. Aslında bir bulut düşünülerek inşa edilmiştir. Sitedeki özellik listesini kontrol edebilirsiniz.


38
"Bilirsin, arama için". Hudsucker Proxy için +1. Ayrıca, yazılım ilgimi çekti;)
Shabbyrobe

7
Ayrıca, video gerçekten iyi yapıldı. Bunlardan biraz daha eklemelisiniz!
Shabbyrobe

5
Güzel, elasticsearch'ü heroku ile ücretsiz kullanabileceğimi, paraya mal olan solr gibi bir şey kullanmanın aksine buldum ...
hellomello

3
Elastik Arama, veri olmadan yeni bir kurulumdan sonra 64bit Ubuntu üzerinde 230 MB büyük RAM kullanır. Keşke Elasticsearch'ün PostgreSQL veya Redis gibi daha küçük VPS'de çalıştırılabilmesini diliyorum.
Xeoncross

@ Xeoncross çalışmasını nasıl başardınız? 1GB RAM
VPS'im

67

Sfenks, Solr ve Elasticsearch kullandım. Solr / Elasticsearch Lucene üzerine inşa edilmiştir. Birçok ortak işlev ekler: web sunucusu api, faceting, önbellekleme, vb.

Sadece basit bir tam metin arama ayarına sahip olmak istiyorsanız, Sfenks daha iyi bir seçimdir.

Aramanızı özelleştirmek istiyorsanız, Elasticsearch ve Solr daha iyi seçimlerdir. Çok genişletilebilirler: sonuç puanlamasını ayarlamak için kendi eklentilerinizi yazabilirsiniz.

Bazı örnek kullanımlar:

  • Sfenks: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Oturaklı, Github

63

Lucene'i düzenli olarak on milyonlarca belgeyi dizinlemek ve aramak için kullanıyoruz. Aramalar yeterince hızlıdır ve uzun zaman almayan artımlı güncellemeler kullanırız. Buraya gelmek biraz zamanımızı aldı. Lucene'nin güçlü noktaları, ölçeklenebilirliği, geniş bir özellik yelpazesi ve aktif bir geliştiriciler topluluğudur. Çıplak Lucene kullanmak Java'da programlama gerektirir.

Eğer yeniden başlıyorsanız, Lucene ailesinde sizin için araç Solr'dur , ki bu ayarlanması basit Lucene'den çok daha kolaydır ve neredeyse tüm Lucene gücüne sahiptir. Kolayca veritabanı belgeleri alabilirsiniz. Solr Java ile yazılmıştır, bu nedenle Solr'da yapılacak herhangi bir değişiklik için Java bilgisi gerekir, ancak yalnızca yapılandırma dosyalarını değiştirerek çok şey yapabilirsiniz.

Ayrıca, özellikle MySQL veritabanı ile birlikte, Sfenks hakkında iyi şeyler duydum. Yine de kullanmadım.

IMO, aşağıdakilere göre seçmelisiniz:

  • Gerekli işlevsellik - örneğin bir Fransız saplayıcıya mı ihtiyacınız var? Lucene ve Solr'ın bir tane var, diğerleri hakkında bilmiyorum.
  • Uygulama dilinde yeterlilik - Java bilmiyorsanız Java Lucene'ye dokunmayın. Sfenks ile bir şeyler yapmak için C ++ 'ya ihtiyacınız olabilir. Lucene diğer dillere de taşınmıştır . Arama motorunu genişletmek istiyorsanız, bu çoğunlukla önemlidir.
  • Deney kolaylığı - Solr'un bu açıdan en iyisi olduğuna inanıyorum.
  • Diğer yazılımlarla arayüz - Sphinx, MySQL ile iyi bir arayüze sahiptir. Solr, RESTful sunucusu olarak ruby, XML ve JSON arayüzlerini destekler. Lucene yalnızca Java üzerinden size programlı erişim sağlar. Pusula ve Hazırda Bekletme Arama , Lucene'yi daha büyük çerçevelere entegre eden sarmalayıcılarıdır.

1
bir arama motorunun uyarlanabilir olması gerektiği konusunda önemli bir fikir edindiniz.
dzen

1
Xapian'ı hiç kullanmadım. Özellikleri Lucene's ile eşit olan güzel bir arama kütüphanesi gibi görünüyor. Yine, en önemli şey uygulama gereksinimleriniz, arama motorunun çalışmasını istediğiniz ortam, uygulama dilindeki yeterliliğiniz (Xapian aramada C ++, diğer birçok dile bağlanan) ve motorun ne kadar özelleştirilebilir olduğudur.
Yuval F

21

Sphinx'i 10.000.000 + MySql kaydı ve 10+ farklı veritabanı ile Dikey Arama projesinde kullanıyoruz. MySQL için çok mükemmel bir desteğe ve indekslemede yüksek performansa sahiptir, araştırma hızlıdır, ancak belki de Lucene'den biraz daha azdır. Her gün hızlı bir şekilde indeksleme yapmanız ve bir MySQL db kullanmanız gerekiyorsa doğru seçimdir.



13

Benim sfenks.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
}

Test komut dosyası:

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

Örnek sonuç:

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

Sfenks sorgu süresi:

0.001 sec.

Sfenks sorgu süresi (1k eşzamanlı):

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

MySQL sorgu süresi:

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

MySQL sorgu süresi (1k eşzamanlı):

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)

Sfenks veya elastik arama aramayı denediniz mi?
dzen

2
@dzen bu Sfenks IS; mysql sorgusunu sorgu yürütme hızlarının karşılaştırması olarak kullanıyor.
mr.b

8

Şimdiye kadar bulabildiğim tek elasticsearch vs solr performans karşılaştırması burada:

Solr elasticsearch Ölüm Maçı!


1
bu kötü bir şey. yorum sunmuyor! bu tartışmaya bakın: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell

1
-1 çünkü "Benim Yorumunuz denetlenmeyi bekliyor." ve diğerleri de yukarıdaki google grupları bağlantısını görüyor
Karussell

1
-1, bir yıldan fazla bir süre sonra, bu konuya yorum yapılmasına izin verilmez, ciddiye tamamen görmezden gelmeyi düşünürdüm.
JAR.JAR. Fasulye

7

Lucene güzel ve hepsi, ama durmak kelime kümesi korkunç. StopAnalyzer.ENGLISH_STOP_WORDS_SET'e bir ton stop kelimesini manuel olarak eklemek zorunda kaldım.

Sfenks kullanmadım ama insanların hızı ve büyülü "kurulum kolaylığı ile mükemmelliği" oranı ile yemin ederim biliyorum.


7

Dizin tankını deneyin.

Elastik arama söz konusu olduğunda, kullanımı lucene / solr'den çok daha kolay olduğu düşünülmüştür. Ayrıca yeniden endekslemeden değiştirilebilen çok esnek bir skorlama sistemi içerir.


puanlama solr ile çalışma zamanında tweek olabilir
Karussell

artık endeks tank yok
Karussell

4
Linkden Açık kaynaklarda IndexTank, github.com/linkedin/indextank-engine
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.