Red de conocimiento informático - Conocimiento informático - Cómo leer los datos del índice lucene

Cómo leer los datos del índice lucene

Veámoslo paso a paso. La construcción aquí implementó la indexación y la almacenó en el directorio de índice. Bueno, para leer el índice, primero se debe colocar al Sr. Cheng en el indexador de lectura (es decir, una instancia de IndexReader en Lucene). Luego, escriba el siguiente programa (el programa es un programa C#, este artículo utiliza DotLucene).

Lector IndexReader;

El problema es que IndexReader es una clase abstracta y no se puede crear una instancia de ella. Luego prueba con clases derivadas. Encuentre las dos subclases de IndexReader: SegmentReader y MultiReader. ¿Cuál usar? De cualquier manera, requiere un montón de parámetros (me está costando mucho entender para qué sirven esos parámetros, los explicaré más adelante), por lo que indexar datos usando Lucene no parece tan fácil. Al rastrear el código y consultar la documentación, finalmente encontré la clave para usar IndexReader. Resulta que IndexReader tiene una interfaz estática en "modo de fábrica": IndexReader.Open. IndexReader estático abierto (ruta System.String)

#0002 IndexReader estático público abierto (ruta System.IO.FileInfo)

#0003 IndexReader estático público abierto (directorio directorio)

#0004 IndexReader estático privado Open(Directorio directorio, bool closeDirectory)

Llame a tres de las interfaces públicas. El proceso de apertura del índice es muy simple:

#0001 IndexReader lector = IndexReader.Open(index)

De hecho, el proceso de apertura del índice es así:

#0001 SegmentInfos infos = new SegmentInfos();

#0002 Directorio directorio = FSDirectory.GetDirectory(index, false);

#0003 infos.Read( directorio);

p>

#0004 FSDirectory.Read(directorio);

#0004 bool closeDirectory = false;

#0005 if (infos .Count == 1)

#0006 {

#0007 // El índice ha sido optimizado

#0008 devuelve nuevo SegmentReader(infos, infos.Info( 0, cerrarDirectorio)).

Info(0), closeDirectory);

#0009 }

#0010 else

#0011 {

#0012 IndexReader[] lectores = nuevo IndexReader[infos.Count];

#0013 for (int i = 0; i lt; infos.Count; i)

#0014 lectores[i] = nuevo SegmentReader(infos.Info(i));

#0015 devuelve nuevo MultiReader(directorio, infos, closeDirectory, lectores);

#0016 }

Primero Lea la información del segmento del índice (información del segmento, #0001 ~ #0003) y luego verifique cuántos segmentos hay: si solo hay uno, es posible que haya sido optimizado y pueda leerlo directamente (#0008); de lo contrario, deberá leerlo todo de una vez. Tome un segmento (#0013~#0014) y combínelos en un lector múltiple (#0015). Eso es todo lo que se necesita para abrir un archivo de índice.

A continuación, aprenderemos a leer la información. Utilice el siguiente código para ilustrarlo.

#0001 public static void PrintIndex(lector IndexReader)

#0002 {

#0003 //muestra cuántos documentos

# 0004 System.Console.Console.WriteLine(reader.Document(i));

#0008 }

#0009

#0010 //Enumerar término a get lt; documento, frecuencia de término, posición* gt; información

#0011 TermEnum termEnum = lector.NumDocs(; i);

#0007WriteLine("\tDocFreq=" termEnum. DocFreq());

#0016

#0017 TermPositions termPositions = lector.TermPositions(termEnum.Term());

#0018 int i = 0 ;

#0019 int j = 0;

#0020 mientras (termPositions.Next())

#0021 {

# 0022 System.Console.WriteLine((i) "-gt;" " DocNo: " termPositions.Doc() ", Freq: " termPositions.Freq());

#0023 para (j = 0 ; j lt; termPositions.Freq(); j )

#0024 System.Console.Write("[" termPositions.NextPosition() "]");

#0025 .Console.WriteLine();

#0025WriteLine();

#0026 }

#0027

#0028 //Obtener la información sobre lt; term freq, documentgt; directamente

#0029 TermDocs termDocs = lector.termDocs = lector.termEnum.Term());

#0030 while (termDocs.Next ())

#0031 {

#0032 System.Console.WriteLine((i) "-gt;" " DocNo: " termDocs.Doc() ", Freq: " termDocs.Freq());

#0033 }

#0034 }

#0035

#0036 // Información de campo información de campo = lector.FieldInfo("ruta");

#0038

#0039 // Mostrar vector de frecuencia de términos

>

#0040 for (int i = 0; i lt; lector.NumDocs(); i )

#0041 {

#0042 // Después de tokenizar el contenido Términos se almacenan en TermFreqVector

#0043 TermFreqVector termFreqVector = lector.GetTermFreqVector(i, "contents");

#0044

#0045 if (termFreqVector = = null)

#0046 {<

#0047 System.Console.WriteLine().Console.WriteLine("termFreqVector es nulo.");

# 0048 continuar;

#0049 }

#0050

#0051 Cadena fieldName = termFreqVector.GetField();

#0052 Cadena [] términos = termFreqVector.GetTerms();

#0053 int[] frecuencias = termFreqVector.GetTermFrequencies();

#0054

#0055 Sistema. Console.Write("FieldName:" fieldName);

#0056 for (int j = 0; j lt; Terms.Length; j )

#0057 {

#0058 System.Console.Write("[" términos[j] ":" frecuencias[j] "]");

#0059 }

#0060 Sistema .Console.WriteLine()Console.WriteLine();

#0061 }

#0062 Sistema.

Entre ellos, #0017~#0026 enumera todas las posiciones donde aparece cada término en el documento (la primera palabra, contando desde 1); #0029~#0033 calcula en qué documentos aparece cada término; y las frecuencias correspondientes (es decir, DF y TF).

#0036~#0037 Válido si el lector es del tipo SegmentReader.

#0040~#0061 puede leer rápidamente TÉRMINO y la frecuencia correspondiente de aparición en un documento. Pero esta parte requiere que storeTermVector se establezca en verdadero al crear el índice. Por ejemplo

doc.Add(Field.Text("contents", lector, true));

Ese es el tercero. Su valor predeterminado es falso.

Con estos datos puedo calcular los datos que necesito. Cubriré cómo indexar y aplicar Lucene más adelante.