Todos que trabajamos a diario con Lucene como motor de búsquedas de nuestras webs, o aplicaciones nos hemos encontrado problemas en las ordenaciones, ya sea porque queremos ordenar por fechas, porque queremos potenciar un resultado versus otros, o porque no obtenemos el resultado esperado, a continuación detallaré un seguido de consejos que he aplicado en diferentes proyectos:
A continuación se indican las diferentes posibilidades de ordenación, y casos prácticos donde he aplicado una u otra:
SortField.SCORE // Se ordena por el score de la búsqueda realizada
SortField.DOC // Ordenación por posición en el índice (FIFO)
SortField.AUTO // El Term manda, y se le aplica un orden según su tipo
SortField.STRING // Ordenación lexicográfica
SortField.INT // No necesita descripción, pero se ha de ir con cuidado de no irse de rango
SortField.FLOAT // Ordenación numérica típica
SortField.CUSTOM and SortField.RANDOM // Se implementa la función que determina el orden
Ordenación por fechas:
Formatea el Field con un formato concreto, ya hay una clase en el propio lucene que te hace los cast deseados (Lucene.Net.Documents.DateTools DateToString) pasandole como argumento la precisión que quieras, para los que trabajos en .Net, podriamos ahorrarnos esta llamada, y realizar el cast directamente con ToString("yyyyMMddHHmmssSSS") o ToString("yyyyMMdd") según deseemos.
Este tipo de formateos, nos permitira a posteriori realizar consultas de tipo TO, Fecha:[20070801 TO 20080109]
Por último, realizaremos la ordenación mediante el siguiente SortField:
osortField = new SortField(CampoOrden, SortField.STRING, OrderType);
Ordenación por campos numéricos:
Ordenación por un campo númerico determinado funciona sin problemas sin determinar el tipo de ordenación, pero aconsejo que se determine, ya que se ahorra el casteo de tipos, con los diferentes try catch que ello implica...
osortField = new SortField(CampoOrden, OrderType);
osortField = new SortField(CampoOrden, SortField.AUTO, OrderType);
osortField = new SortField(CampoOrden, SortField.INT, OrderType);
osortField = new SortField(CampoOrden, SortField.FLOAT, OrderType);
viernes, agosto 01, 2008
Suscribirse a:
Entradas (Atom)
