2012-03-12 13 views
14

indicizzazione di un valore booleano (vero/falso) a Lucene (senza bisogno di memorizzare) voglio ottenere di più l'utilizzo dello spazio su disco e prestazioni più elevate ricercaQual è la scelta migliore per indicizzare un valore booleano in lucene?

doc.add(new Field("boolean","true",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS)); 
//or 
doc.add(new Field("boolean","1",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS)); 
//or 
doc.add(new NumericField("boolean",Integer.MAX_VALUE,Field.Store.NO,true).setIntValue(1)); 

Quale devo scegliere? O qualsiasi altro modo migliore?

grazie mille

risposta

10

Una domanda interessante!

  • non credo che la terza opzione (NumericField) è una buona scelta per un campo booleano. Non riesco a pensare a un caso d'uso per questo.
  • Il Lucene indice di ricerca (lasciando ai dati memorizzati un lato, che non si sta utilizzando in ogni caso) viene memorizzato come un indice invertito
  • di lasciare la prima e la seconda le opzioni come (teoricamente) identico

Se Mi sono trovato di fronte a questo, penso che sceglierei l'opzione uno (termini "veri" e "falsi"), se influenza la decisione finale.

La tua scelta di NOT_ANALYZED_NO_NORMS sembra buona, penso.

+0

ciao, @ adrian-conlon, puoi aiutarmi? grazie mille http://stackoverflow.com/questions/10464377/using-booleanquery-or-write-more-indexes – Koerr

2

Lucene salta attraverso un set elaborato di cerchi per rendere NumericField ricercabile da NumericRangeQuery, quindi evitarlo in tutti i casi in cui i valori non rappresentano quantità. Ad esempio, anche indicizzando un numero intero, ma solo come ID univoco, si vorrà comunque utilizzare un campo stringa semplice. L'uso di "true"/"false" è il modo più naturale per indicizzare un valore booleano, mentre l'uso di "1"/"0" offre un leggero vantaggio evitando la possibilità di mancata corrispondenza o errore di battitura. Direi che questo vantaggio non vale molto e andare per vero/falso.

+0

Oltre a NumericRangeQuery, tieni presente un altro vantaggio di NumericField: NumericField è ideale per l'ordinamento, perché la creazione della cache di campo è molto più veloce rispetto ai numeri di solo testo. Fonte: http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/NumericRangeQuery.html –

4

Utilizzare Solr (un sapore di lucene): indicizza tutti i tipi di Java di base in modo nativo.

L'ho usato e si rompe.

Problemi correlati