Kombinieren von Treffern aus mehreren Dokumenten zu einem einzigen Treffer in Lucene

Ich versuche, eine bestimmte Suche zum Laufen zu bringen, und es erweist sich als problematisch. Die eigentlichen Quelldaten sind recht komplex, lassen sich jedoch anhand des folgenden Beispiels zusammenfassen:

Ich habe Artikel, die indexiert sind, damit sie durchsucht werden können. Mit jedem Artikel sind auch mehrere Eigenschaften verknüpft, die ebenfalls indiziert und durchsuchbar sind. Wenn Benutzer suchen, können sie Treffer entweder im Hauptartikel oder in den zugehörigen Eigenschaften erhalten. Unabhängig davon, wo ein Treffer erzielt wird, wird der Artikel als Suchtreffer zurückgegeben (dh die Eigenschaften sind niemals ein Treffer für sich).

Nun zur Komplexität:

Jede Eigenschaft verfügt über eine Sicherheitsfunktion. Dies bedeutet, dass sie für einen bestimmten Benutzer die Eigenschaft möglicherweise sehen oder nicht sehen können. Wenn ein Benutzer eine Immobilie nicht sehen kann, wird ihm offensichtlich kein Suchtreffer angezeigt. Diese Sicherheitsüberprüfung ist urheberrechtlich geschützt und kann nicht mithilfe des typischen Mechanismus zum Speichern einer Rolle im Index neben den anderen Feldern im Dokument durchgeführt werden.

Ich habe derzeit einen Index, der die Artikel und Eigenschaften separat indiziert enthält (dh ein Artikel wird als Dokument indiziert, und jede Eigenschaft verfügt über ein eigenes Dokument). Wenn eine Suche durchgeführt wird, sollte ein Treffer in Artikel A oder ein Treffer in einer der Eigenschaften von Artikel A als Treffer für Artikel A eingestuft werden, wobei die Ergebnisse kombiniert werden.

Um dies ursprünglich zu erreichen, wurde Lucene v1.3 dahingehend geändert, dass BooleanQuery einen benutzerdefinierten Zieler hat, der die Logik der Sicherheitsüberprüfung und die Kombination von zwei Treffern in verschiedenen Dokumenten anwenden kann, die als Treffer in einem einzigen klassifiziert werden dokumentieren. Ich versuche, diese Version auf die neueste Version zu aktualisieren (v2.3.2 - Ich verwende Lucene.Net), aber im Idealfall ohne Lucene in irgendeiner Weise zu ändern.

Ein zusätzliches Problem tritt auf, wenn ich eine AND-Suche durchführe. Wenn ein Artikel das Wort enthältfoo und eine seiner Eigenschaften enthält das WortBarWenn Sie dann nach "foo AND bar" suchen, wird der Artikel als Treffer zurückgegeben. Mein aktueller Code befasst sich damit innerhalb des benutzerdefinierten Ziels.

Irgendwelche Ideen, wie / ob dies getan werden kann?

Ich überlege, einen benutzerdefinierten HitCollector zu verwenden und diesen in die Suche zu übernehmen, aber wenn ich die boolesche Suche "foo AND bar" durchführe, erreicht die Ausführung meinen HitCollector nie, da der ConjunctionScorer alle Ergebnisse aus den Unterabfragen herausfiltert dahin kommen.

BEARBEITEN:

Ob ein Benutzer eine Eigenschaft sehen kann oder nicht, hängt nicht von der Eigenschaft selbst ab, sondern vom Wert der Eigenschaft. Ich kann daher die zusätzlichen Sicherheitsbedingungen nicht in die Abfrage einbeziehen, da ich den Wert, nach dem gefiltert werden soll, nicht kenne.

Als Beispiel:

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

Wenn ein Benutzer alles sehen kann, gibt die Suche nach "B und Y" ein einzelnes Suchergebnis für Artikel B zurück.

Wenn ein anderer Benutzer eine Eigenschaft nicht sehen kann, wenn ihr Wert Y enthält, gibt die Suche nach "B und Y" keine Treffer zurück.

Ich habe keine Möglichkeit zu wissen, welche Werte ein Benutzer im Voraus sehen kann und welche nicht. Die einzige Möglichkeit, dies festzustellen, besteht darin, die Sicherheitsprüfung durchzuführen (die derzeit zum Zeitpunkt des Filterns eines Treffers aus einem Feld im Dokument durchgeführt wird), die ich natürlich nicht für jeden möglichen Datenwert für jeden Benutzer durchführen kann.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage