2010-09-14 13 views

Respuesta

5

Si conoce el tipo de datos almacenados en su campo, puede intentar una consulta de rango. Por ejemplo, si su campo contiene datos de cadena, una consulta como field:[a* TO z*] devolverá todos los documentos donde haya un valor de cadena en ese campo.

+0

Esto debería funcionar. Sería un poco más complejo en caso de que el campo tenga valores que comiencen con números o letras mayúsculas. Debería ser fácil de hacer con una consulta OR. –

+0

¡Buen punto! Pero si comienza con un capital, un rango que comience con un * debería atraparlo porque el javadoc de TermRangeQuery establece que usa String.compareTo para determinar si una cadena es parte del rango. –

+0

Esto se ve bien. No estoy seguro de atrapar registros comenzando con números, pero este es un buen comienzo. ¡Gracias! –

3

He hecho algunos experimentos, y parece que la forma más sencilla de lograr esto es crear un QueryParser y llame SetAllowLeadingWildcard(true) y la búsqueda de field:* así:

var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, field, analyzer); 
qp.SetAllowLeadingWildcard(true); 
var query = qp.Parse("*")); 

(Nota Estoy fijando el valor por defecto campo de QueryParser a field en su constructor, de ahí la búsqueda de solo "*" en).

no puedo dar fe de la efectividad de este método es sobre otros métodos, pero al ser el método más simple que puedo encontrar, yo esperaría que sea al menos tan eficiente como field:[* TO *], y evita tener que hacer cosas hacker como field:[0* TO z*] , que puede no tener en cuenta todos los valores posibles, como los valores que comienzan con caracteres no alfanuméricos.

1

Otra solución es utilizar un ConstantScoreQuery con un FieldValueFilter

new ConstantScoreQuery(new FieldValueFilter("field")) 
Cuestiones relacionadas