Autor Thema: Wie suche ich nach Dokumenten?  (Gelesen 5210 mal)

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Wie suche ich nach Dokumenten?
« 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);
}
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Wie suche ich nach Dokumenten?
« Antwort #1 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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Wie suche ich nach Dokumenten?
« Antwort #2 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

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Wie suche ich nach Dokumenten?
« Antwort #3 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.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Wie suche ich nach Dokumenten?
« Antwort #4 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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Wie suche ich nach Dokumenten?
« Antwort #5 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

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Wie suche ich nach Dokumenten?
« Antwort #6 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.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

BigWim

  • Gast
Re: Wie suche ich nach Dokumenten?
« Antwort #7 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Wie suche ich nach Dokumenten?
« Antwort #8 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.

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Wie suche ich nach Dokumenten?
« Antwort #9 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>";
}

Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Wie suche ich nach Dokumenten?
« Antwort #10 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.

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Wie suche ich nach Dokumenten?
« Antwort #11 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.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz