Suchen in MOSS 2007
die Suche stellt unter dem Microsoft Office SharePoint Server ein sehr mächtiges Werkzeug dar. Manchmal möchte man die Suche nicht über die Standard Oberfläche nutzen um z.B. sehr spezielle Suchanfragen durchzuführen. Eine Möglichkeit hierzuist der Query-Webservice (_vti_bin/query.asmx).
In diesem Blog-Post stelle ich die Möglichkeiten anhand einer Keyword-Search dar.
Um den Webservice zu nutzen müssen mehrere Schritte durchgeführt werden:
- Registierung des Clients beim Webservice
- (optional) prüfen des Status der Suchfunktionalität
- Absetzen der Suchanfrage und Rückübermittlung des Suchergebnisses
Der Einfachheit halber verwende ich eine von Visual Studio aus der WSDL generierten Proxy-Klasse für de Suche - das daraus erstelte Objekt ist m_QS
Die Anwendung läuft immer nach folgendem Schema ab:
- Registrieren des Clients beim Webservice
- Absetzen der Anfrage
- Abholen des Ergebnisses
Registrieren
Hierfür ist die Funktion Registration der Proxy-Klasse des query.asmx zuständig - das dort übergebene XML sieht so aus:
<RegistrationRequest revision="1" xmlns="urn:Microsoft.Search.Registration.Request" action="NEW"/>
Die Anwort sieht dann so aus:
<ProviderUpdate mlns="urn:Microsoft.Search.Registration.Response">
<Status>
SUCCESS
</Status>
<Providers>
<Provider>
<Id>
{e90faf50-ef05-4134-9a2b-427e37f3d292}
</Id>
<Name>
Microsoft Office SharePoint Server2007 Search
</Name>
<QueryPath>
https://moss.litwareinc.com/_vti_bin/search.asmx
</QueryPath>
<Type>
SOAP
</Type>
<Services>
<Service>
<Id>
{e90faf50-ef05-4134-9a2b-427e37f3d292}
</Id>
<Name>
Litware Inc.
</Name>
<Category>
INTRANET_GENERAL
</Category>
<Description>
This service allows you to search the site : Litware Inc.
</Description>
<Copyright>
Microsoft® Office SharePoint® Server 2007 Search
</Copyright>
<Display>
On
</Display>
</Service>
</Services>
</Provider>
</Providers>
</ProviderUpdate>
Hier bekomme ich auch Informationen über die vorhandenen Search-Provider die ich danach für die Suchanfrage verwednen kann. Diese Registrierung muss einmal pro Such-URL und Client machen. d.h. ich kann nach der Registrierung eines Clients bei einem Search-Provider beliebig viele Suchanfragen mit einer Registrierung durchführen.
Statusabfrage
Um direkt vor einer Suchanfrage zu überprüfen ob der Search-Service gerade "lebt" kann ich den Status abfragen - dies geht sehr einfach über die Status-Methode des Search.asmx, das Ergebis ist hier recht einfach gehalten, es kommt nur ein String zurück, im Gutfall "ONLINE"
Suchanfrage
Hier gibt es zwei verschiedne Möglichkeiten die Suchanfrage zu formulieren
- Keyword Query
- MSFTESQL Query
Wir werden uns hier zunächst mit der einfachen Keyword-Query beschäftigen, einen Ausflug in die MSFTSQL Query machen wir in einem folgenden Blog-Post.
Keyword Query heißt ich kann meine Suchanfrage durch die Aneinanderreihung von Schlüsselworten in einem String formulieren, Trennzeichen ist hier jeweils ein Leerzeichen.
Das Ganze wird von der Query-Methode des Search.asmx abgehandelt, diese erwartet ein definiertes XML für die Abfrage - ein Teil dieses XMLs werden die Keywords sein
<?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">
KEYWORDS_PLACEHOLDER
</QueryText>
</Context>
</Query>
</QueryPacket>
An die Stelle der KEYWORD_PLACEHOLDER kommt nun der eigene String und fertig ist das Paket zur Abfrage. Dieses wird nun an die Query-Methode (oder QueryEx wenn ein Dataset statt XML zurückerwartet wird) geschickt.
Die Ergebnisse kommen dann (im Falle der Query-Mothode) wie folgt zurück:
<ResponsePacket xmlns="urn:Microsoft.Search.Response">
<Response domain="QDomain">
<Range>
<StartAt>1</StartAt>
<Count>10</Count>
<TotalAvailable>256</TotalAvailable>
<Results>
<Document relevance="879" xmlns="urn:Microsoft.Search.Response.Document">
<Title>SharePoint Designer Demos</Title>
<Action>
<LinkUrl size="0">https://moss.litwareinc.com/sites/spd</LinkUrl>
</Action>
<Description />
<Date>2008-01-10T03:39:19-08:00</Date>
</Document>
<Document>
....
</Document>
....
</Results>
</Range>
<Status>SUCCESS</Status>
</Response>
</ResponsePacket>
Sie erhalten also ein Document-Tag pro Eintrag in der Eregebnisliste, eingebettet werden diese in ein Range-Tag sowie ein Response-Tag.
... Fortsetzung folgt
Viel Spass beim Ausprobieren
Sven
Comments
- Anonymous
February 02, 2009
hier die in diesem Post angekündigte Fortsetzng zur Suche mit dem MOSS Webservice. Bisher haben