Ş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?
Ş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?
Yanıtlar:
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.
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:
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:
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.
Elastik Arama ve Solr karşılaştırması için bir deneme
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)
Şimdiye kadar bulabildiğim tek elasticsearch vs solr performans karşılaştırması burada:
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.