Red de conocimiento informático - Aprendizaje de programación - ¿Cómo ordena Lucene por grado de coincidencia?

¿Cómo ordena Lucene por grado de coincidencia?

De forma predeterminada, Lucene clasifica los resultados de búsqueda según su relevancia. La clasificación por relevancia se basa en la puntuación interna y el DocID, y la puntuación se basa en la puntuación interna y la mejora del índice de las palabras clave. De forma predeterminada, el que tiene una puntuación más alta se clasifica en primer lugar. Si las puntuaciones son iguales, el que se indexa en primer lugar se clasificará en primer lugar según el orden del índice. En ese momento alguien preguntó, ¿qué pasa si quiero que el índice ocupe el primer lugar? Hermit estudió el código fuente y descubrió que era algo bastante simple. El siguiente código está basado en Lucene 2.0.

Si observamos el constructor predeterminado de Sort, las dependencias son una combinación de SortField.FIELD_SCORE y SortField.FIELD_DOC.

Código Java

/**

* Ordenar por relevancia calculada. Esto es lo mismo que llamar a

* {@link Searcher#search(Query) Searcher#search()} sin una condición de clasificación,

* sólo que un poco más caro.

Entonces, ¿cómo construimos el SortField requerido? Eche un vistazo al constructor de SortField, que tiene un parámetro inverso que nos permite reordenar el conjunto de resultados.

Código Java

/** Crea una clasificación (posiblemente una clasificación inversa) basada en los términos del campo dado y proporciona explícitamente el tipo del valor del término

*. * Puede ser null si

* type es SCORE o DOC.

* @param tipo términos de valores.

* @param inversa Verdadero si el orden natural debe invertirse.

*/

public SortField (campo de cadena, tipo int, booleano inverso) {

this.field = (campo! = nulo) ? () : campo;

this.type = tipo;

this.reverse = reverso;

}

Como puedes ver , Solo necesitamos construir un SortField [] para lograr la función que queremos, consulte:

código java

// Clasificación en orden descendente, el siguiente índice cuando las calificaciones son lo mismo Al frente

new SortField[] { SortField La primera fila indexada después del mismo tiempo, jaja, esta es la primera fila más irrelevante, bastante interesante

new SortField[ ] { nuevo SortField(null, SortField.SCORE, true), new SortField(null, SortField.DOC, true) }

new SortField[] { new SortField(null, SortField.SCORE, true), new SortField(null, SortField.DOC, true) }

Oh, simplemente pase este SortField[] como parámetro al constructor de Sort para obtener una instancia de Sort, y luego pase esta instancia a searcher.search(query,sort) para obtener los resultados deseados.