Domanda

Al momento sto cercando in altri metodi di ricerca, piuttosto che avere un enorme query SQL. Ho visto elasticsearch recente e giocato con fruscio (un'implementazione di Python di un motore di ricerca).

Si può dare motivi per la vostra scelta (s)?

È stato utile?

Soluzione

Come il creatore di elasticsearch, forse mi può dare qualche ragionamento sul perché sono andato avanti e ha creato in primo luogo:.)

Utilizzando puro Lucene è impegnativo. Ci sono molte cose che avete bisogno di prendersi cura di se si vuole di svolgere davvero bene, ed inoltre, la sua una biblioteca, in modo che nessun supporto distribuita, è solo una libreria Java incorporato che è necessario mantenere.

In termini di usabilità Lucene, via del ritorno quando (quasi 6 anni), ho creato Compass. Il suo scopo era quello di semplificare l'utilizzo Lucene e fare Lucene di tutti i giorni più semplice. Quello che mi sono imbattuto in più e più volte è il requisito di essere in grado di avere Compass distribuito. Ho iniziato a lavorare su di esso dall'interno della bussola, attraverso l'integrazione con le soluzioni di rete dati come GigaSpaces, coerenza, e di terracotta, ma non è sufficiente.

Al suo centro, una soluzione Lucene distribuita deve essere sharded. Inoltre, con l'avanzamento di HTTP e JSON come API onnipresenti, vuol dire che una soluzione che molti sistemi diversi con diverse lingue può essere facilmente utilizzato.

Questo è il motivo per cui sono andato avanti e ha creato elasticsearch. Ha un modello distribuito molto avanzato, parla JSON nativo, ed espone molte funzioni di ricerca avanzate, il tutto senza soluzione di continuità espresse attraverso JSON DSL.

Solr è anche una soluzione per esporre un server di indicizzazione / ricerca su HTTP, ma direi che elasticsearch fornisce un modello distribuito superiore tanto e la facilità di utilizzo (anche se attualmente manca su alcune delle funzioni di ricerca, ma non per molto, e in ogni caso, il piano è quello di ottenere tutte le Bussola funzioni in elasticsearch). Certo, io sono di parte, da quando ho creato elasticsearch, quindi potrebbe essere necessario controllare da sé.

Per quanto riguarda la Sfinge, non l'ho usata, quindi non posso commentare. Quello che posso fare riferimento è quello di questa discussione al forum Sfinge che credo conferma la modello distribuito superiore elasticsearch.

Naturalmente, elasticsearch ha molte più funzioni rispetto solo di essere distribuito. In realtà è costruito con una nuvola in mente. È possibile controllare la lista delle caratteristiche del sito.

Altri suggerimenti

Ho usato Sfinge, Solr e elasticsearch. Solr / elasticsearch sono costruiti sulla cima di Lucene. Si aggiunge molte funzionalità comuni:. Server Web API, sfaccettatura, caching, ecc

Se si desidera avere solo un semplice completo di installazione ricerca, Sfinge è una scelta migliore.

Se si desidera personalizzare la tua ricerca a tutti, elasticsearch e Solr sono le scelte migliori. Sono molto estensibile: è possibile scrivere i propri plugin per regolare risultato punteggio.

Alcuni esempi di usi:

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • elasticsearch: Foursquare, Github

Usiamo Lucene regolarmente per indicizzare e    cercare decine di milioni di documenti.    Le ricerche sono abbastanza veloce, e usiamo    aggiornamenti incrementali che non prendono    tanto tempo. Ci volle un po 'di tempo    per arrivare qui. I punti di forza di    Lucene è la sua scalabilità, una grande    gamma di funzioni e un attivo    comunità di sviluppatori. utilizzando nuda    Lucene richiede la programmazione in Java.

Se si avvia di nuovo, lo strumento per voi nella famiglia Lucene è Solr , che è molto più facile da configurare rispetto a nudo Lucene, e non ha quasi tutta la potenza di Lucene. E 'possibile importare facilmente i documenti di database. Solr sono scritti in Java, in modo che qualsiasi modifica di Solr richiede la conoscenza di Java, ma si può fare molto semplicemente modificando i file di configurazione.

Ho anche sentito parlare bene di Sfinge, soprattutto in connessione con un database MySQL. Non l'ho usato, però.

IMO, si dovrebbe scegliere in base a:

  • La funzionalità richiesta - per esempio avete bisogno di uno stemmer francese? Lucene e Solr hanno uno, io non so gli altri.
  • La competenza nella lingua di attuazione - Non toccare Java Lucene, se non si conosce Java. Potrebbe essere necessario C ++ per fare cose con la Sfinge. Lucene è stato anche portato in altro lingue . Questo è per lo più importante se si desidera estendere il motore di ricerca.
  • Facilità di sperimentazione -. Credo Solr è meglio in questo aspetto
  • interfacciamento con altri software - Sfinge ha una buona interfaccia con MySQL. Solr supporta le interfacce rubino, XML e JSON come un server RESTful. Lucene si dà solo l'accesso programmatico attraverso Java. Compass e Hibernate Search sono involucri di Lucene che si integrano in strutture più grandi.

Usiamo Sfinge in un progetto di ricerca verticale, con 10.000.000 di record + MySQL e 10+ database diverso. Ha molto un eccellente supporto per MySQL e prestazioni elevate su indicizzazione, la ricerca è veloce, ma forse un po 'meno di Lucene. Tuttavia è la scelta giusta se avete bisogno rapidamente l'indicizzazione ogni giorno e usare un db MySQL.

Il mio sphinx.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
}

script di test:

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

risultato di esempio:

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

Sphinx tempo di risposta:

0.001 sec.

Sphinx tempo di risposta (1k concorrente):

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

tempo query MySQL:

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

MySQL tempo di risposta (1k concorrente):

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

L'unica elasticsearch vs confronto delle prestazioni solr Sono stato in grado di trovare finora è qui:

Solr vs elasticsearch Deathmatch!

Lucene è bello e tutto, ma la loro parola fermata set è terribile. Ho dovuto aggiungere manualmente una tonnellata di parole stop per StopAnalyzer.ENGLISH_STOP_WORDS_SET solo per farlo ovunque vicino utilizzabile.

Non ho usato Sfinge ma so che le persone giuro per la sua velocità e quasi magica "la facilità di installazione per suggestione" ratio.

Prova indextank.

Come nel caso di elasticsearch, è stato concepito per essere molto più facile da usare rispetto Lucene / Solr. Esso comprende anche sistema di punteggio molto flessibile che può essere ottimizzato senza reindexing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top