Combinando hits de múltiples documentos en un solo hit en Lucene

Estoy tratando de hacer que una búsqueda particular funcione y está resultando problemática. Los datos de origen reales son bastante complejos, pero se pueden resumir en el siguiente ejemplo:

Tengo artículos que están indexados para que puedan ser buscados. Cada artículo también tiene múltiples propiedades asociadas que también se pueden indexar y buscar. Cuando los usuarios realizan búsquedas, pueden obtener resultados en el artículo principal o en las propiedades asociadas. Independientemente de dónde se logre un hit, el artículo se devuelve como un hit de búsqueda (es decir, las propiedades nunca son un hit por derecho propio).

Ahora por la complejidad:

Cada propiedad tiene seguridad, lo que significa que para cualquier usuario dado, pueden o no poder ver la propiedad. Si un usuario no puede ver una propiedad, obviamente no obtiene un resultado de búsqueda en ella. Esta comprobación de seguridad es propietaria y no se puede realizar mediante el mecanismo típico de almacenamiento de una función en el índice junto con los otros campos del documento.

Actualmente tengo un índice que contiene los artículos y las propiedades indexadas por separado (es decir, un artículo se indexa como un documento y cada propiedad tiene su propio documento). Cuando se realiza una búsqueda, un hit en el artículo A o un hit en cualquiera de las propiedades del artículo A debe clasificarse como hit para el artículo A solo, con las puntuaciones combinadas.

Para lograr esto originalmente, Lucene v1.3 se modificó para permitir que esto suceda al cambiar BooleanQuery para que tenga un Scorer personalizado que podría aplicar la lógica del control de seguridad y la combinación de dos hits en diferentes documentos que se clasifican como un hit en un solo documento. Estoy tratando de actualizar esta versión a la última (v2.3.2 - Estoy usando Lucene.Net), pero idealmente sin tener que modificar a Lucene de ninguna manera.

Un problema adicional ocurre si hago una búsqueda AND Si un artículo contiene la palabrafoo y una de sus propiedades contiene la palabrabar, luego buscar "foo AND bar" devolverá el artículo como un hit. Mi código actual se ocupa de esto dentro del Scorer personalizado.

¿Alguna idea de cómo / si esto se puede hacer?

Estoy pensando en utilizar un HitCollector personalizado y pasarlo a la búsqueda, pero al hacer la búsqueda booleana "foo AND bar", la ejecución nunca llega a mi HitCollector ya que ConjunctionScorer filtra todos los resultados de las subconsultas anteriores. llegar allí.

EDITAR:

Si un usuario puede ver o no una propiedad no se basa en la propiedad en sí, sino en el valor de la propiedad. Por lo tanto, no puedo poner las condiciones de seguridad adicionales en la consulta por adelantado ya que no sé el valor por el cual filtrar.

Como ejemplo:

+---------+------------+------------+
| Article | Property 1 | Property 2 |
+---------+------------+------------+
|    A    |     X      |     J      |
|    B    |     Y      |     K      |
|    C    |     Z      |     L      |
+---------+------------+------------+

Si un usuario puede ver todo, entonces la búsqueda de "B e Y" devolverá un solo resultado de búsqueda para el artículo B.

Si otro usuario no puede ver una propiedad si su valor contiene Y, entonces la búsqueda de "B e Y" no devolverá ningún resultado.

No tengo forma de saber qué valores un usuario puede y no puede ver por adelantado. La única forma de saberlo es realizar la comprobación de seguridad (actualmente realizada al filtrar un resultado de un campo en el documento), lo que obviamente no puedo hacer para cada valor de datos posible para cada usuario.

Respuestas a la pregunta(2)

Su respuesta a la pregunta