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