Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Sökresultat kombinerat med procentuell träff-frekvens

Postades av 2008-05-02 18:37:20 - Krister Kauppi, i forum sql-server/msde, Tråden har 2 Kommentarer och lästs av 1326 personer

Jag har under en tid funderat på hur man kan sortera ett sökresultat utifrån dess träff-freksens. Så idag när jag hade lite tid så gjorde jag ett litet snabbt script för SQL Server.

Jag är dock inte nöjd med hur scriptet är skrivet. Det känns inte alls optimalt men det fungerar. I denna tråd skulle jag gärna vilja att vi försöker förbättra scriptet och hur det ska användas.

Scriptet är en funktion som returnerar träff-frekvensen. Vi antar att @SearchCriteria är satt till "SQL performance counters" och @Data har värdet "Bla bla SQL bla bla permonce bla bla" då får man en träfffrekvens på 50%. Anledningen för att man får 50% är för att jag klassar hela strängen som ett sökkriterie samt varje ord i strängen. Så sammanlagt blir det fyra kriterier och man får träff på två. Så här ser funktionen ut:


SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[SearchRanking]
(
@SearchCriteria varchar(4000),
@Data text
)
RETURNS int
AS
BEGIN

DECLARE @ReturnValue int
DECLARE @SplitOn nvarchar(5)
DECLARE @Counter int
DECLARE @TempTable table
(
Id int identity(1,1),
SearchWord varchar(4000)
)

SET @SplitOn = ' '
SET @Counter = 1

-- Insert the whole search criteria to the temp table
INSERT INTO @TempTable (SearchWord) VALUES (@SearchCriteria)

-- Split the search criteria just to prepare the insert to the temp table
WHILE (CHARINDEX(@SplitOn,@SearchCriteria)>0)
BEGIN
INSERT INTO @TempTable (SearchWord)
SELECT
Data = LTRIM(RTRIM(SUBSTRING(@SearchCriteria,1,CHARINDEX(@SplitOn,@SearchCriteria)-1)))

SET @SearchCriteria = SUBSTRING(@SearchCriteria,CHARINDEX(@SplitOn,@SearchCriteria)+1,LEN(@SearchCriteria))
SET @Counter = @Counter + 1
END

-- Insert search criterias to temp table
INSERT INTO @TempTable (SearchWord)
SELECT Data = LTRIM(RTRIM(@SearchCriteria))

-- Check how many hits we can find
SELECT @ReturnValue = CAST(CAST(COUNT(Id) AS decimal(18,2)) /
CAST((SELECT COUNT(Id) FROM @TempTable) AS decimal(18,2)) AS decimal(18,2)) * 100
FROM @TempTable
WHERE @Data LIKE '%' + SearchWord + '%'

RETURN @ReturnValue
END


Jag tror som sagt inte att scriptet är optimalt. Det var något jag skrev ihop relativt snabbt. Where-satsen är nog inte den bästa. Nedan följer lite sql för att använda funktionen.


DECLARE @SearchCriteria nvarchar(4000)
SET @SearchCriteria = 'SQL performance'

DECLARE @TestTable table
(
Id int identity(1,1),
Data text
)


INSERT INTO @TestTable (Data) VALUES ('Bla bla SQL bla bla performance bla bla')
INSERT INTO @TestTable (Data) VALUES ('Bla bla bla bla')
INSERT INTO @TestTable (Data) VALUES ('SQL')
INSERT INTO @TestTable (Data) VALUES ('Bla bla performance')


SELECT Data, dbo.SearchRanking (@SearchCriteria, Data) AS SearchHitPercent
FROM @TestTable
WHERE dbo.SearchRanking (@SearchCriteria, Data) <> 0
ORDER BY dbo.SearchRanking (@SearchCriteria, Data) DESC


Det som jag inte gillar är att funktionen anropas tre gånger. Man kan få ner det till två genom att göra så här. Det bästa vore att bara anropa det en gång men det är nog inte möjligt.


SELECT TestTable.Data, TestTable.SearchHitPercent FROM
(SELECT Data, dbo.SearchRanking (@SearchCriteria, Data) AS SearchHitPercent
FROM @TestTable
WHERE dbo.SearchRanking (@SearchCriteria, Data) <> 0) AS TestTable
ORDER BY TestTable.SearchHitPercent DESC


Har ni några förslag på hur man kan optimera scriptet eller hur man kan göra på ett helt annat sätt så får ni gärna skriva ett inlägg.


Svara

Sv: Sökresultat kombinerat med procentuell träff-frekvens

Postades av 2008-05-05 10:04:36 - Krister Kauppi

Jag fick några tips kring förbättring av scriptet av en kollega. Det första var att göra om funktionen till en tabell-funktion och sedan använda mig av cross apply. Scriptet ser ut så här för tillfället.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[SearchRanking]
(
@SearchCriteria varchar(4000),
@Data text
)
RETURNS @RetTable table
(
SearchRanking int
)
AS
BEGIN

DECLARE @SplitOn nvarchar(5)
DECLARE @Counter int
DECLARE @TempTable table
(
SearchWord varchar(4000)
)

SET @SplitOn = ' '
SET @Counter = 1

-- Insert the whole search criteria to the temp table
INSERT INTO @TempTable (SearchWord) VALUES (@SearchCriteria)

-- Split the search criteria just to prepare the insert to the temp table
WHILE (CHARINDEX(@SplitOn,@SearchCriteria)>0)
BEGIN
INSERT INTO @TempTable (SearchWord)
SELECT
Data = LTRIM(RTRIM(SUBSTRING(@SearchCriteria,1,CHARINDEX(@SplitOn, @SearchCriteria)-1)))

SET @SearchCriteria = SUBSTRING(@SearchCriteria,CHARINDEX(@SplitOn,@SearchCriteria )+1,LEN(@SearchCriteria))
SET @Counter = @Counter + 1
END

-- Insert search criterias to temp table
INSERT INTO @TempTable (SearchWord)
SELECT Data = LTRIM(RTRIM(@SearchCriteria))

-- Insert search criterias to return table
INSERT INTO @RetTable (SearchRanking)
SELECT CAST(CAST(COUNT(SearchWord) AS decimal(18,2)) /
CAST((SELECT COUNT(SearchWord) FROM @TempTable) AS decimal(18,2)) AS decimal(18,2)) * 100
FROM @TempTable
WHERE @Data LIKE '%' + SearchWord + '%'

RETURN
END


Anropet ser ut så här:

DECLARE @SearchCriteria varchar(4000)
SET @SearchCriteria = 'SQL performance counters'

DECLARE @TestTable table
(
Data text
)


INSERT INTO @TestTable (Data) VALUES ('Bla bla SQL bla bla performance bla bla')
INSERT INTO @TestTable (Data) VALUES ('Bla bla bla bla')
INSERT INTO @TestTable (Data) VALUES ('SQL')
INSERT INTO @TestTable (Data) VALUES ('Bla bla performance')
INSERT INTO @TestTable (Data) VALUES ('Bla bla sql performance counters bla')


SELECT Data, SearchHitPercent.SearchRanking
FROM @TestTable
CROSS APPLY dbo.SearchRanking (@SearchCriteria, Data) AS SearchHitPercent
WHERE SearchHitPercent.SearchRanking <> 0
ORDER BY SearchHitPercent.SearchRanking DESC


Svara

Intressant ...

Postades av 2008-05-05 10:13:23 - Henrik Benon

... ska forska i detta också lite. Har ju jobbat med sökmotorer en del under åren. Ska bli kul å damma av kunskaperna lite :D

Återkommer!

//henke


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
5 546
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies