Suche in Sharepoint II
hier die in diesem Post angekündigte Fortsetzng zur Suche mit dem MOSS Webservice.
Bisher haben wir die Suche als Keyword Query behandelt (einfaches aneinanderreihen von Suchbegriffen) für viele Zwecke ist das ausreichend, jedoch ist manchmal mehr Funktionalität erwünscht.
Mehr Möglichkeiten als mit der Keyword-Query haben wir wenn wir die Query auf die MSFTESQL (Microsft Full Text Engine SQL) Sprache umstellen.
Dazu sind einige Umbauarbeiten an den Query-Paketen notwendig und der Query-String muss natürlich auch anders aussehen.
Bisher haben wir folgendes Query-Paket verwendet:
<?xml version="1.0" encoding="utf-8" ?>
<QueryPacket xmlns="urn:Microsoft.Search.Query" Revision="1000">
<Query domain="QDomain">
<SupportedFormats>
<Format>urn:Microsoft.Search.Response.Document.Document</Format>
</SupportedFormats>
<Context>
<QueryText language="en-US" type="STRING">HIER KOMMT DIE QUERY REIN</QueryText>
</Context>
</Query>
</QueryPacket>
Das neue Query-Paket sieht so aus:
<?xml version="1.0" encoding="utf-8" ?>
<QueryPacket xmlns="urn:Microsoft.Search.Query" Revision="100">
<Query domain="QDomain">
<SupportedFormats>
<Format>urn:Microsoft.Search.Response.Document.Document</Format>
</SupportedFormats>
<Context>
<QueryText language="en-US" type="MSSQLFT">HIER KOMMT DIE MSFTESQL Query rein</QueryText>
</Context>
</Query>
</QueryPacket>
Mal abgesehen von der Query sind das die einzigen Änderungen die zu machen sind.
Die MSFTESQL Query
ähnelt eine SQL Query, hat jedch schon einige Eigenheiten - ein wenig Einarbeitung braucht es aber dann läuft es eigentlich sehr gut.
Aufbau:
SELECT felder FROM scope WHERE bedigungen ORDER BY sortierkriterium
Also ist der Grundaufbau gleich, jeodch sind nicht alle SQL Verbs möglich so vermisst man zumindestens alles relationale wie (INNER/OUTER) JOIN - das stört auch nicht denn wir haben hier einen hierarchisch aufgebauten Suchraum, der netterweise nach URL (des Eintrags) aufgebaut wird.
d.h. ein einfachstes Such-Statement kann so aussehen
SELECT DAV:href FROM SCOPE(DEEP TRAVERSAL OF(https://intranet.meinefirma))
Welche Feldnamen kann ich verwenden (so wie DAV:href im Beispiel)
DAV:href stellt hier die URL des Treffers dar - die weiteren Feldnamen ergeben sich aus den gefundenen Metadaten, diese sind in der SharePoint Zentraladministration (SharedService Provider + Search Settings + Manage Property Mappings + Managed Properties) sicht- und konfigurierbar. Alle dort aufgeführten Properties lassen sich in MSFTESQL Abfragen verwenden.
Was kann in den SCOPE reinkommen ?
Grundsätzlich mal jede URL die im Index als content-source aufgenommen ist - auch sub URL´s sind möglich. Die Anweisung DEEP TRAVERSAL heisst nun das alles sub-URLs einbezogen werden, SHALLOW Traversal würde nur Treffer auf derselben Ebene ausgeben.
Kann ich die Trefferliste einschränken ?
Der WHERE-Clause enthält entweder Bedingungen mit den Feldnamen (s.o.) die ganz klassisch mit AND/OR verknüpft sind, oder 2 spezielle Prädikate die den Volltext der Dokumente einbeziehen - es sind dies FULLTEXT und CONTAINS
z.B. gibt mit
WHERE CONTAINS("testcase")
alle Treffer in denen GENAU das Wort textcase enthalten ist zurück - CONTAINS ist somit ein exaktes Volltext-Prädikat. Man kann auch AND/OR Verknüpfungen einbauen, auch gibt es so nette Prädikate wie LIKE oder NEAR
wobei hingegen
WHERE FULLTEXT("testcase")
bei demselben Index mehr Treffer generiert, es werden automatisch Teilworte/Wortähnlichkeiten/.... gesucht. FREETEXT ist eine unscharfes Such-Prädikat.
Die MSFTEQUERY ist eine sehr komplexe aber auch mächtige Abfragesprache mit der man wesentlich mehr machen kann als mit der Standard-Sharepoint Suchoberfläche, benötigt jedoch etwas einarbeitung - belohnt einen aber damit das die Queries is einer wahnsinnig schnellen Zeit --abgearbeitet sind (ich muss mich schon anstrengen an 1 sec. Response-Zeit heranzukommen).
Mehr Informationen zur MSFTESQL Query sind hier zu finden:
InfoCenter für Entwickler der Volltextsuche
Happy searching
Sven