Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: schroederk am 07.07.10 - 13:21:00

Titel: Wie suche ich nach Dokumenten?
Beitrag von: schroederk am 07.07.10 - 13:21:00
Hallo,

ich möchte über die COM-Schnittstelle nach Dokumenten in einem Kalender suchen.
Genauer gesagt, alle Einträge, die einen bestimmten Text im Body enthalten.
In einem Test-Script möchte ich mir einfach alle gefundenen Einträge anzeigen lassen:
Offenbar ist $entry aber leer, als ob nichts gefunden wurde?

Suche ich auf diese Art eigentlich richtig? Wird der komplette Kalendereintrag durchsucht oder ev. nur Titel?
(Im Beispiel sollte aber der Eintrag im Titel gefunden werden)


Code
$session = new COM( "Lotus.NotesSession" );
$session->Initialize('Passwort');
$db = $session->getDatabase( "11.11.11.11", "mail\testdatenbank.nsf", false );
$view = $db->getView( "Calendar" );

$keys = "Test-Eintrag";
$dc = $view->getAllEntriesByKey($keys,false);

$entry = $dc->GetFirstEntry();
while (is_object($entry)) {
	$field = $doc->GetFirstItem( "Body" ); 
	$body = $field->text; 
	echo "Body: $body<br/>";
	$entry = $dc->getNextEntry($entry);
}
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: pram am 07.07.10 - 22:55:53
Schau dir mal im Designer in der LS-Hilfe die NotesView-Klasse an.

Was du hier machst
 $dc = $view->getAllEntriesByKey($keys,false);
ist dass du in der Ansicht in der ERSTEN SORTIERTEN Spalte nach Werten welche mit "Testeintrag" beginnen. Du kannst damit nicht in beliebigen Feldern suchen

Schau dir mal die FTSearch von der Viewklasse an, damit müsste es gehen.
Oder auch die Search Methode in der Notesdatabase.

Gruß
Roland
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: koehlerbv am 07.07.10 - 23:07:37
Knud, auch von mir ein paar Tipps:

1. Wenn Du Chance hast: Setze das zunächst mit Notes-Bordmitteln um. Wenn Du dann richtigen den Algorithmus und das richtige Coding hast, fällt es Dir viel leichter, dass in eine andere Sprache umzusetzen.
2. Body ist RichText (in Memo, Appointment und Task). Dein Verfahren kann damit überhaupt nicht funktionieren, da ein RTI nur mittels FTI durchforstbar ist und RTIs in Ansichten überhaupt nicht dargestellt werden können.
3. Auch daher: Erst Algorithmus, dann Coding.

Für weitere Hilfe stehe sicherlich nicht nur ich gerne bereit.

Bernhard
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: schroederk am 08.07.10 - 16:31:19
Muss ich im FTSearch zu verwenden nicht vorraussetzen, dass ein FullText-Index existiert?
Oder wird in dem Fall dann Onthefly aufgebaut? Was der Performance sicher nicht soo gut tut.
Die Search-Methode werde ich mir mal anschauen.

Da ich was LotusScript betrifft leider absoluter Neuling bin, schien es mir leichter zu sein, die Kommandos gleich in PHP zu übertragen, als mich mit Agenten, LotusScript-Befehlen, deren Syntax, der Ausgabe von Werten und dem Debugging zu beschäftigen.
Daher habe ich mich daran noch nicht rangetraut.

Bisher laufe ich die gesamte DB durch und untersuche jeden Eintrag. Was immernoch erstaunlich performant ist, aber dennoch nicht auf Dauer praktikabel.
Zumal ich davon ausging, dass die Notwendigkeit des Einträge wiederfinden eher die Ausnahme darstellen sollte. Dem ist leider nicht so.
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: pram am 08.07.10 - 16:34:57
Aus der Hilfe  ;D

Usage
If the database is not full text indexed, this method works, but less efficiently. To test for an index, use the IsFTIndexed property. To create an index on a local database, use the UpdateFTIndex method.

Wobei ich mich dunkel erinnere, dass ab einer bestimmten Anzahl von Dokumenten die FTsearch Methode gleich mit einer Meldung aussteigt, dass es zu viele Dokumente sind und kein Index vorhanden ist.

Gruß
Roland
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: Peter Klett am 08.07.10 - 16:37:09
Wobei ich mich dunkel erinnere, dass ab einer bestimmten Anzahl von Dokumenten die FTsearch Methode gleich mit einer Meldung aussteigt, dass es zu viele Dokumente sind und kein Index vorhanden ist.
Ja, ab 5000 Dokumenten
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: schroederk am 09.07.10 - 09:07:24
Wobei ich mich dunkel erinnere, dass ab einer bestimmten Anzahl von Dokumenten die FTsearch Methode gleich mit einer Meldung aussteigt, dass es zu viele Dokumente sind und kein Index vorhanden ist.
Ja, ab 5000 Dokumenten

Was ja doch relativ früh ist und ich damit eher sicherstellen sollte, dass bei allen Datenbanken ein Fulltext-Index vorhanden ist.
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: BigWim am 09.07.10 - 09:18:00
Zitat
Ja, ab 5000 Dokumenten
Diejenigen, die sich detailierter mit der Funktionsweise auseinander setzen, wird das wahrscheinlich klar sein, aber ich habe erst vor kurzem die Erfahrung machen dürfen, dass das auch bei "einfachen" Formelagenten der Fall ist.

Zwecks Disposition werden von 50 Außenstellen täglich Dokumente erfaßte. Damit für die User der Tag mit einer leeren Ansicht beginnt, läuft abends ein Agent, der ein Flag "Historisch" setzt.

Und der ist auch bei 5.000 Dokumenten ausgestiegen. Die Datenbank ist jetzt indiziert ::)

Markus
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: Peter Klett am 09.07.10 - 10:06:22
Was ja doch relativ früh ist und ich damit eher sicherstellen sollte, dass bei allen Datenbanken ein Fulltext-Index vorhanden ist.
Wir haben ca. 4.500 Datenbanken mit insgesamt 14 Mio. Dokumenten auf einem Server (genauer auf zwei Servern im Cluster), wenn wir die alle indizieren würden, könnten wir wohl nicht mehr arbeiten. Dennoch laufen dort Aktionen und Agenten problemlos auf mehreren hunderttausend Dokumenten. Allerdings verwenden wir kein FTSearch.
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: schroederk am 12.07.10 - 11:02:21
Ich habs mal mit FTSearch probiert und finde sogar den ersten Satz.
Nur bekomme ich eine Fehlermeldung, beim Versuch, auf den nächsten Satz zu springen.

Fatal error: Uncaught exception 'com_exception' with message 'Error [0x8002000e] Unzulässige Parameteranzahl.
variant->GetNextDocument() #1 {main}

Hier der Code:

Code
$db->UpdateFTIndex(True);
$numDocs = $view->FTSearch("FIELD Body CONTAINS Testeintrag", 10);

if ($numDocs <> 0) {
	echo "gefundende Dokumente: $numDocs<br/>";

	$doc = $view->GetFirstDocument();
	for ($i = 0; $i < $numDocs; $i++) {

		$field = $doc->GetFirstItem( "StartDateTime" ); 
		$calbegin = $field->text; 
		echo "Beginn: $calbegin<br>";

		$field = $doc->GetFirstItem( "EndDateTime" ); 
		$calende = $field->text; 
		echo "Beginn: $calende<br>";

		$field = $doc->GetFirstItem( "AppointmentType" ); 
		$numtyp = $field->text; 
		switch ($numtyp) {
		case 0:
		   $typ = "Appointment";
		   break;
		case 1:
		   $typ = "Anniversary";
		   break;
		case 2:
		   $typ = "Event";
		   break;
		case 3:
		   $typ = "Meeting";
		   break;
		case 4:
		   $typ = "Reminder";
		   break;
		}	
		echo "Typ: $typ<br>";

		$field = $doc->GetFirstItem( "Body" ); 
		$mistfeld = $field->text; 
		echo "Body: $mistfeld<br>";

		$doc = $view->GetNextDocument();
	}

} else {
	echo "<hr>Nichts gefunden!!!<hr>";
}

Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: Peter Klett am 12.07.10 - 11:09:06
In LotusScript musst Du bei NotesView.GetNextDocument das aktuelle Dokument mitgeben

Set doc = view.GetNextDocument (doc)

Das wird bei COM wohl ähnlich sein.
Titel: Re: Wie suche ich nach Dokumenten?
Beitrag von: schroederk am 12.07.10 - 13:22:07
Ich muss mich wirklich schämen... Jetzt verwende ich bereits an mehreren Stellen eine Schleife, die durch Dokumente durchgeht und überall übergebe ich $doc auch als Parameter. Geistig völlig umnachtet war ich überzeugt, dass ich nie Parameter übergeben hätte.

Ich werde mich mal etwas mehr dem LotusScript selber zuwenden und Test-Agenten erstellen. Warscheinlich wird mir der Designer schon etwas früher auf mögliche Fehler aufmerksam machen.