2012-05-01 7 views
5

Una pregunta más importante es si Solr incluso será capaz de soportar esto? Sé que he visto a lucene poder hacer esto y solr está construido en lucene.Cómo consultar enteros, flotantes en lucene y cómo almacenar (NumericComparator)?

He visto un ejemplo en alguna parte usando google pero no puedo encontrarlo de nuevo, y el ejemplo no fue completo porque no creo que tenga la porción de consulta sobre cómo escribo mi declaración de consulta para lucene. Recuerdo haber visto un NumericField y existe este NumericComparator.

Básicamente, estoy probando una solución noSQL orm que ofrece indexación (en github) (aunque el cliente decide cuántos índices por tabla y la metodología de partición pero agrega entites al índice y quítelos usted mismo y puede usar namedQueries aunque primero debe obtener el índice por nombre antes de la consulta, ya que una tabla puede tener millones de índices). Las dos cosas principales que quiero lograr es que todo funcione con un db de memoria de nosql falso en memoria y un índice en memoria (directorio RAM de lucene) Y luego quiero cambiarlos para enchufar Cassandra y SOLR.

Necesito básicamente

  1. encontrar la manera de almacenar números enteros, flotadores, etc.
  2. encontrar la manera de escribir una consulta lucene cuando los objetivos son cadenas, flotadores, enteros, etc.

en este momento, si necesita más detalles del código de consulta principal del proyecto se encuentra en https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/orm/layer3/spi/index/inmemory/MemoryIndexWriter.java

y en la línea 17 2 puedes ver que estoy agregando un nuevo campo cada vez pero desafortunadamente algunos de ellos pueden estar en inglés.

GRAN PREGUNTA: ¿Puede SOLR incluso admitir int frente a cadena? (Si no, tendré que ir con el hack de relleno 0 en el frente de ints, longs etc. para que todos los enteros tengan la misma longitud).

IF SOLR puede soportarlo, entonces, en lucene, ¿cuál es la mejor manera o hay un buen ejemplo para esto?

La interfaz principal índice recuperado de NoSqlEntityManager.getIndex (clazz clase, Cadena indexPartitionName) es (aunque no estoy seguro que importe) .. https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/orm/api/Index.java

gracias, Dean

Respuesta

8

Desde el archivo example SOLR schema.xml:

<!-- 
     Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types. 
    --> 
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> 
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/> 
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> 
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/> 
<!-- 
    Numeric field types that index each value at various levels of precision 
    to accelerate range queries when the number of values between the range 
    endpoints is large. See the javadoc for NumericRangeQuery for internal 
    implementation details. 

    Smaller precisionStep values (specified in bits) will lead to more tokens 
    indexed per value, slightly larger index size, and faster range queries. 
    A precisionStep of 0 disables indexing at different precision levels. 
    --> 
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/> 
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/> 
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/> 
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/> 

Así que si el índice de un campo como uno de esos fieldtypes anteriores, entonces se le pregunta que a través de su nombre de campo (por ejemplo myIntField:1234) hará lo "correcto" y también puede hacer búsquedas de rango en su contra (myIntField:[1200 TO 1300]). Lo mismo vale para flotadores, etc.

+0

genial, entonces, ¿qué pasa con lucene para que pueda hacer que mi memoria también funcione? (ME ENCANTA la memoria ya que somos grandes personas TDD y las pruebas unitarias luego trabajamos con índice en memoria y nosql db y en el trabajo de producción con cassandra y solr en vivo). Perfeccionar el entorno de esa manera. –

2

Creo que podemos aprovechar la clase org.apache.lucene.document.NumericField. En esta clase, podemos llamar al método set, puede soportar int, log, float y double. Para otro tipo de datos (por ejemplo, bool, datetime), podemos hacer una conversión especial para cambiarlos a tipo int o long.

Por cierto, vi el último código fuente de lucene, que involucra nuevas clases: FloatField, IntField, LongField y DoubleField. Se incluirá en la próxima versión. http://svn.apache.org/repos/asf/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/document/

+0

sí, creo que es posible que necesitemos usar TrieFloaField, TrieIntField, etc .... http: //lucene.apache.org/solr/api/org/apache/solr/schema/TrieFloatField.html –

Cuestiones relacionadas