Frage

Ich bin mit Hibernate Search (die Lucene verwendet) für die Suche einige Daten Ich habe in einem Verzeichnis indiziert. Es funktioniert gut, aber ich brauche eine umgekehrte Suche zu tun. Durch Reverse-Suche meine ich, dass ich eine Liste von Abfragen in der Datenbank gespeichert habe ich überprüfen müssen, welche eine dieser Abfragen mit einem Datenobjekt Übereinstimmen jeden Datenobjekt erstellt wird. Ich brauche es, um den Benutzer zu warnen, wenn ein Datenobjekt übereinstimmt mit einer Abfrage er geschaffen hat. Also ich indizieren muß dieses einzelne Datenobjekt, die gerade erstellt wurde und sehen, welche Abfragen von meiner Liste dieses Objekt als Ergebnis hat.

Ich habe Lucene MemoryIndex Klasse gesehen einen Index im Speicher zu schaffen, damit ich so etwas wie dieses Beispiel für jede Abfrage in einer Liste (obwohl Iterieren in einer Java-Liste der Abfragen nicht sehr effizient sein würde) tun können:

//Iterating over my list<Query>
MemoryIndex index = new MemoryIndex();
//Add all fields
index.addField("myField", "myFieldData", analyzer);
...
QueryParser parser = new QueryParser("myField", analyzer);
float score = index.search(query);
if (score > 0.0f) {
    System.out.println("it's a match");
} else {
    System.out.println("no match found");
}

Das Problem hierbei ist, dass diese Datenklasse mehrere Hibernate Search Anmerkungen @ Field hat, @ IndexedEmbedded, ..., die angegeben, wie Felder indiziert werden sollen, so dass, wenn ich invoke Index () -Methode auf dem FullTextEntityManager Beispiel verwendet er diese Informationen Index des Objekt in dem Verzeichnis. Gibt es eine ähnliche Art und Weise im Speicher mit diesen Daten zu indizieren?

Gibt es eine effizientere Möglichkeit, diese umgekehrte Suche zu tun?

War es hilfreich?

Lösung

Just Index das neue Objekt (wenn Sie die automatische Indizierung verwenden, Sie müssen nichts tun, außer die aktuelle Transaktion zu begehen), dann rufen Sie die Abfragen, die Sie ausführen möchten und alle von ihnen in einer boolean-Abfrage ausführen, die gespeicherte Kombination Abfrage mit der ID des neuen Objekts. So etwas wie folgt aus:

...
BooleanQuery query = new BooleanQuery();
query.add(storedQuery, BooleanClause.Occur.MUST);
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST);
... 

Wenn Sie ein Ergebnis bekommen Sie wissen, die der Suchanfrage entsprechen.

Andere Tipps

Da MemoryIndex ist eine völlig separate Komponente, die nicht oder implementieren erstreckt Lucene des Directory oder IndexReader, ich glaube nicht, es gibt einen Weg, dies in den Ruhesuch Anmerkungen anschließen können. Ich vermute, dass, wenn Sie wählen MemoryIndex verwenden, werden Sie Ihre addField schreiben müssen () Anrufe, die im Grunde Spiegel, was Sie in den Anmerkungen zu tun.

Wie viele Anfragen reden wir hier? Je nachdem, wie viele es sind Sie vielleicht mit nur wegkommen können die Abfragen auf dem Hauptindex ausgeführt, dass Hibernate unterhält, die Gewährleistung der Suche auf die Dokument-ID beschränken Sie gerade hinzugefügt haben. Oder für jedes Dokument, das hinzugefügt, erstellen Sie einen Ein-Dokument In-Memory-Index RAMDirectory verwenden und die Abfragen durch, die ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top