2012-03-12 16 views
14

la indexación de un valor booleano (verdadero/falso) en Lucene (no necesita almacenar) quiero conseguir más espacio en disco y más alto rendimiento de la búsqueda¿Cuál es la mejor opción para indexar un valor booleano en 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)); 

que debe elegir? O de alguna otra manera mejor?

muchas gracias

Respuesta

10

¡Una pregunta interesante!

  • No creo que la tercera opción (NumericField) sea una buena opción para un campo booleano. No puedo pensar en ningún caso de uso para esto.
  • El índice de búsqueda Lucene (dejando a un lado los datos almacenados, que no está usando todos modos) se almacena como un índice invertido
  • Dejando su primera y segunda opciones que (teóricamente) idéntico

Si Me enfrenté a esto, creo que elegiría la opción uno (términos "verdadero" y "falso"), si influye en la decisión final.

Su elección de NOT_ANALYZED_NO_NORMS se ve bien, creo.

+0

hola, @ adrian-conlon, ¿puedes ayudarme con esto? muchas gracias http://stackoverflow.com/questions/10464377/using-booleanquery-or-write-more-indexes – Koerr

2

Lucene salta a través de un elaborado conjunto de aros para hacer que NumericField pueda buscarse mediante NumericRangeQuery, así que definitivamente evítelo en todos los casos donde sus valores no representen cantidades. Por ejemplo, incluso si indexa un número entero, pero solo como una ID única, aún desea usar un campo de cadena simple. El uso de "verdadero"/"falso" es la forma más natural de indexar un booleano, mientras que usar "1"/"0" proporciona solo una ligera ventaja al evitar la posibilidad de que no coincidan las mayúsculas y las minúsculas. Diría que esta ventaja no vale mucho y opto por verdadero/falso.

+0

Además de NumericRangeQuery, tenga en cuenta otro de los beneficios de NumericField: NumericField es ideal para la clasificación, ya que la construcción de la memoria caché de campo es mucho más rápido que con números de solo texto. Fuente: http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/NumericRangeQuery.html –

4

Use Solr (un sabor de lucene) - indexa todos los tipos básicos de Java de forma nativa.

Lo he usado y se mece.

Cuestiones relacionadas