Haga que Lucene trate todos los términos de un campo como un solo término.

StackOverflow https://stackoverflow.com/questions/606576

  •  03-07-2019
  •  | 
  •  

Pregunta

En mis documentos de Lucene tengo un campo " empresa " donde el nombre de la empresa es tokenizado. Necesito la tokenización para una parte determinada de mi aplicación. Pero para esta consulta, necesito poder crear un PrefixQuery en todo el campo de la compañía.

Ejemplo:

  • mi marca
    • mi
    • marca
  • granja de brahmanes
    • brahmin
    • granja

Consultando regularmente para " sostén " devolvería ambos documentos porque ambos tienen un término que comienza con bra.
El resultado que quiero, sin embargo, solo devolvería la última entrada porque el primer término comienza con un sostén.

¿Alguna sugerencia?

¿Fue útil?

Solución

Utilice un SpanQuery para buscar solamente la posición del primer término. Un PrefixQuery envuelto por SpanMultiTermQueryWrapper envuelto por SpanPositionRangeQuery:

<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>

Otros consejos

Cree otro campo indexado, donde el nombre de la empresa es no tokenizado. Cuando sea necesario, busque en ese campo en lugar del campo del nombre de la empresa con token.


Si desea búsquedas rápidas, necesita tener entradas de índice que apunten directamente a los registros de interés. Puede haber algo que pueda hacer con los datos de proximidad para filtrar registros, pero será lento. Veo el problema como: ¿cómo puede un " contiene " ¿La consulta sobre un campo completo se realiza de manera eficiente?

Es posible que pueda minimizar el aumento en el tamaño del índice creando (para cada campo actual) un " primer término " campo y " términos restantes " campo. Esto eliminaría la duplicación del primer término en dos campos. Para " normal " consultas, busca términos de consulta en cualquiera de estos campos. Para " empieza con " consultas, solo busca el " primer término " campo. Pero esto parece ser más problemático de lo que vale.

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