2015-03-10 15 views
7

Utilizzo e gioco con Lucene per indicizzare i dati e ho riscontrato alcuni strani comportamenti relativi a DocValues ​​Fields.lucene Fields vs. DocValues ​​

Quindi, Qualcuno potrebbe semplicemente spiegare la differenza tra un campo regolare documento (come Stringfield, TextField, IntField etc.) e DocValues ​​campi (come IntDocValuesField, SortedDocValuesField (i tipi sembra avere un cambiamento in Lucene 5.0) ecc.)?

Innanzitutto, perché non riesco ad accedere a DocValues ​​utilizzando document.get (nome campo)? se sì, come posso accedervi?

In secondo luogo, ho visto che in Lucene 5.0 alcune funzionalità sono cambiate, ad esempio l'ordinamento può essere fatto solo su DocValues ​​... perché è così?

In terzo luogo, DocValues ​​può essere aggiornato, ma i campi regolari non può (si deve eliminare e aggiungere l'intero documento) ...

Inoltre, e forse più importante, quando dovrei usare DocValues ​​e quando i campi regolari?

Joseph

risposta

5

La maggior parte di queste domande sono rapidamente risposta da entrambi riferimento al Solr Wiki o per una ricerca sul web, ma per ottenere il senso di DocValues: sono utili per tutte le altre cose associato a una moderna Servizio di ricerca ad eccezione della ricerca effettiva. Dalle Solr Community Wiki:

DocValues ​​sono un modo di valori di campo di registrazione internamente che è più efficiente per alcuni scopi, come l'ordinamento e sfaccettatura, quindi indicizzazione tradizionale.

...

campi DocValue sono ora campi colonna-oriented con una mappatura di documento-to-value costruita a tempo di indice. Questo approccio promette di alleggerire alcuni dei requisiti di memoria del fieldCache e di effettuare ricerche per sfaccettatura, ordinamento e raggruppamento molto più velocemente.

Questo dovrebbe anche spiegare perché Lucene 5 richiede DocValues ​​per l'ordinamento: è molto più efficiente rispetto all'approccio precedente.

Il motivo è che the storage format is turned around dal formato standard durante la raccolta dei dati per queste operazioni, in cui l'applicazione deve passare in precedenza ogni documento per trovare i valori, ora può cercare i valori e trovare i documenti corrispondenti . Che è molto utile quando hai già un elenco di documenti su cui devi eseguire un'intersezione.

Se ricordo correttamente, l'aggiornamento di un campo basato su DocValue comporta l'estrazione del documento dall'elenco di token precedente e il successivo reinserimento nella nuova posizione, rispetto all'approccio precedente in cui dovevano cambiare carichi di dipendenze (e la reindicizzazione era l'unica strategia praticabile).

Utilizzare DocValues ​​per i campi che hanno bisogno di una qualsiasi delle proprietà di cui sopra, come l'ordinamento/sfaccettatura/ecc

+2

grazie, ma questo mi avvertisse realmente rispondere alla domanda. So che sono più efficienti nell'ordinamento ... ma non spiega lo strano comportamento. come faccio a recuperare il loro valore dal documento? document.get (fieldname) non sembra funzionare, a che serve se non riesco ad accedervi? –

+1

@YossiVainshtein Risponde alla maggior parte delle tue domande: il tuo campo è memorizzato? Solo i campi memorizzati restituiranno un valore; docValues ​​è una strategia di indicizzazione e non dovrebbe influire sulla recuperabilità. Includere un esempio minimo del problema se si dispone di codice effettivo che si sta tentando di far funzionare. – MatsLindh

+0

Ho riscontrato problemi con la comprensione di quando e quando non utilizzare DocValues ​​e la documentazione di Apache Solr in generale. È fastidioso per qualcuno affermare che la maggior parte di queste domande è _quickly_ risposta facendo riferimento a SolrWiki o a una ricerca web. Lo stai dicendo perché non pensi che il poster abbia fatto la dovuta diligenza prima di chiederlo, o perché pensi che sia un fatto utile da sapere? Se è il primo, è a dir poco offensivo, e fidati di me, per molte persone, ecco perché leggono la documentazione prima di passare allo stackoverflow. –