2016-10-12 6 views
2

Ich habe einen Java-Job, der Dokumente mit SolrCloud in Solr schreibt. Eingabedaten werden in eine Karte verschiedener Entitäten transformiert, und jede Entität wird dann entsprechend ihrem Entitätstyp in die Solr-Sammlung geschrieben.Garantie für eine Solr-Commit ist aufgetreten

Mein Code sieht so aus:

public void updateSolrDocumentsToCollection(String collectionName, Collection<SolrInputDocument> documents) { 
    this.solrClient.setDefaultCollection(collectionName); 
    UpdateRequest updateRequest = new UpdateRequest(); 
    updateRequest.add(documents); 
    updateRequest.setCommitWithin(100); //100ms 
    updateRequest.process(this.solrClient); 
} 

Diese Methode für jede Sammlung einmal aufgerufen wird, auf die ich schreibe, und dann ein letzter Anruf getätigt wird ein letztes Dokument an eine audit Sammlung zu schreiben.

In Integrationstests warte ich, bis ich das Dokument aus der audit Sammlung abrufen und dann die Dokumente aus den Entitätssammlungen abrufen kann.

Das Problem

Ich mache die Annahme, dass, weil audit dauern geschrieben wird, sobald ich aus audit abrufen kann, dann kann ich von einer anderen Sammlung abrufen ich zuvor geschrieben habe. Dies scheint jedoch nicht wahr zu sein. Etwa 1% der Zeit wird ein Audit-Dokument abgerufen, aber die Tests schlagen fehl, weil die anderen Collections ihre Dokumente noch nicht enthalten.

Auch das Hinzufügen einer Thread.sleep(1000) vor dem Abrufen von Dokumenten hilft nicht. Das ist das Zehnfache des Commit-Fensters, also sollte ich garantiert Dokumente sehen?

Wie kann ich garantieren, dass alle Dokumente durchsuchbar sind?

Antwort

0

Sie können die Anzahl der nicht festgeschriebenen Dokumente mit der MBean Request Handler (/admin/mbeans) überprüfen. Dieser Handler bietet programmgesteuerten Zugriff auf die Informationen auf der Seite "Plugin/Stats" der Admin-Benutzeroberfläche.

Verwenden Sie die param stats=true zu Stats Eigenschaften zu erhalten und prüfen docsPending (die Anzahl der Dokumente für begehen anhängig) im „UPDATEHANDLER“ -Kategorie. Sie können die Ergebnisse nach Kategorienamen mit dem Parameter cat=UPDATEHANDLER einschränken, es ist jedoch nicht möglich, docsPending direkt über die Abfrage (afaik) aufzurufen.

Beispiel query:

https://host.example.com/solr/collectionName/admin/mbeans?wt=json&indent=true&stats=true

"/admin/" Handler wird implizit als von Solr 5.0.0, registriert frühere Versionen muss eine explizite Anmeldung in solrconfig.xml.

1

Verwenden Sie SolrCloud oder eine Master/Slave-Konfiguration? Wenn Sie Master-Slave haben, funktioniert commitWithin möglicherweise nicht. Siehe here.

Die commitWithin Einstellungen erlauben zwingen Dokument in eine definierte Zeitspanne geschehen verpflichtet. Dies wird am häufigsten mit Near Real Time Searching verwendet, und aus diesem Grund wird standardmäßig ein Soft-Commit durchgeführt. Dies repliziert jedoch keine neuen Dokumente zu Slave-Servern in einer Master/Slave-Umgebung.Wenn das eine Voraussetzung für die Ihre Implementierung können Sie eine harte durch Hinzufügen eines Parameter begehen erzwingen, wie in diesem Beispiel:

Wenn nicht, können Sie direkt commit() aus dem Code versuchen und sehen, ob das funktioniert?

Sie können auch die Protokolle von solr überprüfen, um zu sehen, wie oft Ihre Commits stattfinden. Und wenn diese Commits openSearcher=true haben, bedeutet das, dass bei jedem Commit ein neuer Sucher geöffnet wird. Wenn Sie in großen Mengen indexieren, können Sie davon profitieren, wenn Sie dies als false beibehalten.

CommitWithin gibt ein Softcommit aus, das einen neuen Searcher öffnet. Es ist möglich, dass Sie alle 100ms Commits absetzen, aber das Öffnen eines neuen Suchers dauert länger.

Versuchen Sie, Ihre commitWithin zu erhöhen, um 500ms oder 1000ms zu sagen, und ob das funktioniert.

+0

Es ist SolrCloud tut mir leid, ich habe die Frage jetzt geklärt. –

Verwandte Themen