Pregunta

Recientemente he empezado a trabajar con Lucene (específicamente, Lucene.Net) y he creado con éxito varios indicios y no tengo problemas con ninguno de ellos. Anteriormente, después de haber trabajado con Endeca, creo que Lucene es liviana, potente y tiene una curva de aprendizaje mucho más baja (debido principalmente a una API concisa).

Sin embargo, tengo una situación de consulta / índice específica en la que tengo problemas para envolver mi cabeza. Lo que tengo es un directorio de personas. Se puede buscar personas en esta aplicación, con el objetivo de devolver coincidencias exactas y aproximadas. En este momento, en el índice concateno el " Nombre de pila " y " Apellido " en un solo campo llamado " Nombre completo " ;, agregando un espacio entre los dos. Entonces, Nombre: Jon con Apellido: Smith, Nombre completo: Jon Smith. Anticipo la posibilidad de los nombres medios y posiblemente el sufijo, pero eso no es importante en este momento.

Me gustaría hacer el equivalente a una búsqueda difusa en el nombre, por lo que alguien que busca "John Smith" todavía volvería " Jon Smith " ;. Había pensado en una búsqueda múltiple, sin embargo, esto se vuelve más complicado si su nombre era en realidad " Jon Del Carmen " o " Jon Paul Del Carmen " ;. No tengo nada en lo que el usuario escribe para delinear el nombre o los apellidos.

El único pensamiento que tengo es que podría reemplazar los espacios en el valor concatenado con un carácter que no se descartaría. Si hice esto cuando construí el documento para el índice y también cuando analicé la consulta, podría tratarlo como una palabra más grande, ¿verdad? ¿Hay alguna otra forma de hacer esto que funcione tanto para los nombres simples (" Jon Smith ") como para los nombres más complejos (" Jon Paul Del Carmen ")?

Cualquier consejo sería realmente apreciado. Gracias de antemano!

Editar: Más detalles a continuación.

En Luke, puse la siguiente consulta:

FullName:jonn smith~

Se está analizando como:

FullName:jonn CreatedOn:smith~0.5

Con una explicación de:

BooleanQuery:boost=1.0000
    clauses=2, maxClauses=1024
    Clause 0: SHOULD
        TermQuery:boost=1.0000
            Term: field='FullName' text='jonn'
    Cluase 1: SHOULD
        FuzzyQuery: boost=1.0000
            prefixLen=0, minSimilarity=0.5000
            org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
            FilteredTermEnum: Exception null

" CreatedOn " Es otro campo en el índice. Intenté colocar comillas alrededor del término "jonn smith", pero luego lo trata como una frase, por el contrario. Estoy seguro de que el problema es que simplemente no estoy haciendo algo bien, pero al ser tan verde en todo esto, no estoy seguro de lo que realmente es algo.

¿Fue útil?

Solución

Mi problema era cómo estaba creando el índice. Lo que terminé haciendo fue asegurarme de que no se tokenizaba el Nombre completo, y la consulta comenzó a devolver los resultados correctos. Los resultados de Explicación de arriba se debieron a un error ID10T de mi parte y ahora están regresando correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top