Here is the entire procedure, it's quite a monster...CREATE PROCEDURE sppb_Search_Public_WithSpider@SearchKeywords VARCHAR(1000),@SearchTerm VARCHAR(100),@PageSize INT,@CurrentPage INT/*********************************************************************************10 Feburary 2005 - Created - Peter BridgerDo a search of the website, public versionSearch Page table and PCL against pages.Only return pages that are * Live* Searchable* Directly accessible***********************************************************************************16 August 2005 - Modified - Peter Bridger Procedure upgraded to also search * Information Centre* Newsroom * Documents* Local pagesPLUS paging has been addedDataTypeID >1: Gandalf page**** News ****2: Newsroom3: Newsroom (Local pages)**** Local structure system ****4: District5: Sector6: Beat*** Documents ***7: Document***********************************************************************************15 February 2006 - Modified - Peter Bridger *** Persons database ***8: PersonAdded the ability to search the persons database. Primarly to makeit easier for the public to find a police officer, their beat officer for example.***********************************************************************************8 March 2006 - Modified - Peter Bridger*** Information Centre ***9: Info CentreWe've *finally* got the Force-Internet middleware database server inplace and working. So now a syncronised copy of the InformationCentre database is held on HQIDB01, meaning it can now be includedin the website search.***********************************************************************************5 September 2006 - Modified - Peter BridgerAdded a very basic logging system, so that we have a record of what people search for and how many results get returned***********************************************************************************10: Search Spider (Page)Wrote a basic search spider, this is also searched and the resultsare combined with the database searches.*********************************************************************************/ASSET NOCOUNT ON-- Create a less strict version of the search termDECLARE@SearchTerm_LessStrict VARCHAR(100)SELECT @SearchTerm_LessStrict = REPLACE( @SearchTerm, ' AND ', ' OR ' )-- Create table to hold resultsDECLARE@TT_SearchResults TABLE(SearchID INT IDENTITY(1,1),Rank INT,PageFileName VARCHAR(100),DataID INT,DataTypeID TINYINT,PageTitle VARCHAR(150),Static_Lineage VARCHAR(1000),DescriptionPublic VARCHAR(1000),Friendly_Lineage VARCHAR(1000))-- Search Page table, against Title, PublicDescription and KeywordsINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic)SELECTdbo.GandalfRank( CT.Rank, P.PageID, S.IndexPageID ),P.PageFileName,P.PageID,1, -- Gandalf pageP.Title,S.Static_Lineage,DescriptionPublicfrom CONTAINSTABLE( Pages, *, @SearchTerm ) AS CTJOIN Pages AS P ONP.PageID = CT.[KEY]INNER JOINSections AS S ONS.SectionID = P.SectionIDWHEREP.IsSearchable = 1 ANDP.IsLive = 1 ANDP.IsDirectlyAccessible = 1 ANDdbo.IsPageLineageLive( P.SectionID ) = 1 -- Check lineage of page is all liveORDER BY Rank DESC-- Search against PCLINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic)SELECTCT.Rank,P.PageFileName,P.PageID,1, -- Gandalf pageP.Title,S.Static_Lineage,P.DescriptionPublicFROMCONTAINSTABLE( Lookup_Categories, *, @SearchTerm ) AS CTJOIN Lookup_Categories AS LC ONLC.CategoryID = CT.[KEY]INNER JOINPageCategorys AS PC ONPC.CategoryID = LC.CategoryIDINNER JOINPages AS P ONP.PageID = PC.PageIDINNER JOINSections AS S ONS.SectionID = P.SectionIDLEFT JOIN -- Where PageID doesn't already exist in table@TT_SearchResults AS TT_SR ONTT_SR.DataID = P.PageID ANDTT_SR.DataTypeID = 1WHEREP.IsSearchable = 1 ANDP.IsLive = 1 ANDP.IsDirectlyAccessible = 1 ANDdbo.IsPageLineageLive( P.SectionID ) = 1 AND -- Check lineage of page is all live TT_SR.DataID IS NULL-- Add friendly lineage dataUPDATE@TT_SearchResultsSETFriendly_Lineage = dbo.GetFriendlyLineage( Static_Lineage )-- Search newsroom - News storiesINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank,' ',NS.NewsStoryID,dbo.NewsType( NS.IsLocalNews ), NS.Title + ' (' + NS.Location + ')',' ',CravenSystemV2.dbo.ReturnFirstParagraph( NS.StoryText ),' 'from CONTAINSTABLE( CravenSystemV2.dbo.NewsStories, *, @SearchTerm ) AS CTJOIN CravenSystemV2.dbo.NewsStories AS NS ONNS.NewsStoryID = CT.[KEY]WHERENS.IsLive = 1 ANDNS.IsDeleted = 0ORDER BY Rank DESC-- Search newsroom - News story updatesINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank,' ',NS.NewsStoryID,dbo.NewsType( NS.IsLocalNews ),NS.Title + ' (' + NS.Location + ')',' ',CravenSystemV2.dbo.ReturnFirstParagraph( NS.StoryText ),' 'FROMCONTAINSTABLE( CravenSystemV2.dbo.NewsStoriesUpdates, *, @SearchTerm ) AS CTJOIN CravenSystemV2.dbo.NewsStoriesUpdates AS NSU ONNSU.NewsStoryUpdateID = CT.[KEY]JOIN CravenSystemV2.dbo.NewsStories AS NS ONNS.NewsStoryID = NSU.NewsStoryIDLEFT JOIN -- Where DataID doesn't already exist in table@TT_SearchResults AS TT_SR ONTT_SR.DataID = NS.NewsStoryID AND( TT_SR.DataTypeID = 2 OR TT_SR.DataTypeID = 3 )WHERENS.IsLive = 1 ANDNS.IsDeleted = 0 ANDNSU.IsLive = 1 ANDNSU.IsDeleted = 0 ANDTT_SR.DataID IS NULL -- Story doesn't already existORDER BY CT.Rank DESC-- Search Local Structure System - DistrictsINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank + 20,' ',D.DistrictID,4, -- LSS, districtD.DistrictName,' ',DS.DescriptionShort,' 'FROMCONTAINSTABLE( LocalStructureSystem.dbo.Districts, *, @SearchTerm ) AS CTJOIN LocalStructureSystem.dbo.Districts AS D OND.DistrictID = CT.[KEY]INNER JOINLocalPagesV3.dbo.DistrictsSettings AS DS ONDS.DistrictID = D.DistrictIDORDER BY CT.Rank DESC-- Search Local Structure System - SectorsINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank + 20,' ',S.SectorID,5, -- LSS, sectorS.SectorName,' ',SS.DescriptionShort,' 'FROMCONTAINSTABLE( LocalStructureSystem.dbo.Sectors, *, @SearchTerm ) AS CTJOIN LocalStructureSystem.dbo.Sectors AS S ONS.SectorID = CT.[KEY]INNER JOINLocalPagesV3.dbo.SectorsSettings AS SS ONSS.SectorID = S.SectorIDORDER BY CT.Rank DESC-- Search Local Structure System - BeatsINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank + 20,' ',B.BeatID,6, -- LSS, beatB.BeatName,' ',BS.DescriptionShort,' 'FROMCONTAINSTABLE( LocalStructureSystem.dbo.Beats, *, @SearchTerm ) AS CTJOIN LocalStructureSystem.dbo.Beats AS B ONB.BeatID = CT.[KEY]INNER JOINLocalPagesV3.dbo.BeatsSettings AS BS ONBS.BeatID = B.BeatIDORDER BY CT.Rank DESC-- Search DocumentsINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank,SS.SectionID,D.DocumentID,7, -- DocumentD.Title,' ',D.Summary,' 'FROMCONTAINSTABLE( DocumentsSystemV2.dbo.Documents, *, @SearchTerm ) AS CTJOIN DocumentsSystemV2.dbo.Documents AS D OND.DocumentID = CT.[KEY]INNER JOINDocumentsSystemV2.dbo.SubSections AS SS ONSS.SubSectionID = D.SubSectionID -- Search Persons databaseINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank,' ',P.PersonID,8, -- PersonP.FirstName + ' ' + P.LastName,' ',' ',' 'FROMCONTAINSTABLE( PersonsDatabase.dbo.Persons, *, @SearchTerm_LessStrict ) AS CTJOIN PersonsDatabase.dbo.Persons AS P ONP.PersonID= CT.[KEY]WHEREP.IsLive = 1-- Search Information CentreINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTCT.Rank,' ',I.ItemID,9, -- Info CentreI.Title,' ',dbo.ReturnFirstParagraph( I.PublicText ),' 'FROMCONTAINSTABLE( YodaSystemSynced.dbo.Items, *, @SearchTerm ) AS CTJOIN YodaSystemSynced.dbo.Items AS I ONI.SyncItemID = CT.[KEY]WHEREI.IsLive = 1 ANDI.IsSyncData = 0-- Search using SearchSpider (Daedalus)DECLARE@TT_Matches TABLE(Frequency SMALLINT,PageID INT)-- Search for keywordsINSERT INTO@TT_MatchesSELECTSUM( PK.Frequency ) 'TotalMatches',PK.PageIDFROMSearchSpider.dbo.Keywords AS KINNER JOINSearchSpider.dbo.PageKeywords AS PK ONPK.KeywordID = K.KeywordIDINNER JOINdbo.Split( @SearchKeywords, ',' ) KW ONK.Keyword = KW.DataGROUP BYPK.PageID-- Delete duplicate rowsDELETE FROM@TT_SearchResultsWHEREEXISTS( SELECT TT_M.PageID FROM @TT_Matches AS TT_M WHERE TTM.PageID = @TT_SearchResults.PageID )-- Add results to tableINSERT @TT_SearchResults(Rank,PageFileName,DataID,DataTypeID,PageTitle,Static_Lineage,DescriptionPublic,Friendly_Lineage)SELECTTT_M.Frequency * 10,P.PageFileName,' ',10, -- Search spiderP.Title,S.Static_Lineage,P.DescriptionPublic,dbo.GetFriendlyLineage( Static_Lineage )FROM@TT_Matches AS TT_MINNER JOINPages AS P ONP.PageID = TT_M.PageID ANDP.IsSearchable = 1 -- Only return searchable pagesINNER JOIN Sections AS S ONS.SectionID = P.SectionID-- Create temp table to order returned resultsDECLARE@TT_RankResults TABLE(OrderID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,SearchID INT,Rank INT)INSERT INTO@TT_RankResults( SearchID, Rank )SELECTSearchID, RankFROM@TT_SearchResultsORDER BYRank DESC-- Return results, in ranked orderSELECT DISTINCTTT_RR.OrderID,TT_SR.Rank,TT_SR.PageFileName,TT_SR.DataID,TT_SR.DataTypeID,TT_SR.PageTitle,TT_SR.Static_Lineage,TT_SR.Friendly_Lineage,TT_SR.DescriptionPublicFROM@TT_SearchResults AS TT_SRINNER JOIN @TT_RankResults AS TT_RR ONTT_RR.SearchID = TT_SR.SearchIDWHERETT_RR.OrderID > @PageSize * @CurrentPage ANDTT_RR.OrderID <= @PageSize * (@CurrentPage + 1 )ORDER BYTT_RR.OrderID ASC-- Return total paging sizeDECLARE @PagingSizeTotal INTSELECT @PagingSizeTotal = COUNT(*) FROM@TT_SearchResults AS TT_SR-- 5 September 2006 - Modified - Peter Bridger-- Quick and dirty loggingINSERT INTOSearchQuickLog( SearchTerm, Matches )VALUES( @SearchTerm, @PagingSizeTotal )RETURN @PagingSizeTotal/* EOF */GO