c# - index - ¿Cómo convertir un RangeQuery de Lucene.NET a un NumericRangeQuery para la búsqueda del rango de fechas?
lucene index (2)
Implementé una búsqueda de eventos Lucene.NET (2.9) que tiene un parámetro de consulta que me permite pasar en un mes y un año; luego devuelve todos los eventos que se ejecutan dentro de ese mes (es decir, si paso en diciembre) 2013 coincidirá con cualquier evento que se ejecute en un día en diciembre). Cada evento tiene un StartDate y un parámetro EndDate.
He logrado que esto funcione usando un RangeQuery con un código como este:
Lucene.Net.Search.BooleanQuery bq = new Lucene.Net.Search.BooleanQuery();
DateTime lowerBoundDate = new DateTime(search.Year.Value, search.Month.Value, 1).Date;
DateTime upperBoundDate = new DateTime(search.Year.Value, search.Month.Value, DateTime.DaysInMonth(search.Year.Value, search.Month.Value)).Date;
string lowerDate = DateTools.DateToString(lowerBoundDate, DateTools.Resolution.DAY);
string upperDate = DateTools.DateToString(upperBoundDate, DateTools.Resolution.DAY);
// lowerDate would be first day of month, upperDate would be last day of month
var lowerRange = new RangeQuery(null, new Term("StartDate", upperDate), true);
var upperRange = new RangeQuery(new Term("EndDate", lowerDate), null, true);
var query = new BooleanQuery();
query.Add(new BooleanClause(lowerRange, BooleanClause.Occur.MUST));
query.Add(new BooleanClause(upperRange, BooleanClause.Occur.MUST));
bq.Add(query, Lucene.Net.Search.BooleanClause.Occur.MUST);
Sin embargo, sé que RangeQuery ha quedado obsoleto y parece que NumericRangeQuery
es el camino a seguir (usando NewIntRange)
, pero no estoy seguro de cómo voy a convertir mi código existente para trabajar con él. Supongo que convierto la fecha en un número entero y la uso, pero no estoy seguro de cómo funcionan los límites mínimo y máximo [dado que ser un tipo de valor tanto mínimo como máximo debe tener un valor].
Todos mis intentos parecen dar como resultado que no se devuelvan elementos. Por ejemplo, aquí hay un ejemplo:
var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate), true, true);
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate), 0, true, true);
¿Alguna pista?
Creo que es mejor usar ToOADate () pero necesitarías almacenar en este formato originalmente. También necesita convertir eso a int, ya que también contiene tiempo en la parte decimal.
var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate.ToOADate()), true, true);
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate.ToOADate()), 0, true, true);
No es necesario cambiar a una consulta numérica. Está generando representaciones de fecha de cadena correctamente, simplemente cambie a TermRangeQuery
.
var lowerRange = new TermRangeQuery("StartDate", null, upperDate, true, true);
var upperRange = new TermRangeQuery("EndDate", lowerDate, null, true, true);